写点什么

一篇神文让你深入理解计算机系统——学习笔记

发布于: 刚刚
一篇神文让你深入理解计算机系统——学习笔记

计算机系统漫游

先看一段代码:

#include<stdio.h>
int main(){ printf("Hello, world\n"); return 0;}
复制代码

让我们看看这段程序的组成,以及它是如何运行的

程序组成


可以看到,这段程序是以字节序列的方式存储在文件中的,每个字节都有一个整数值,对应某些字符,这就是 ASCII 码

只由 ASCII 码组成的文件称为文本文件,其余文件称为二进制文件

程序编译过程

像 hello.c 这样的高级语言写出来的程序,虽然能让人看懂,但却无法在系统上直接运行。为了能让系统也读懂这段代码,需要对该代码进行多次转换


  1. 预处理阶段预处理器(cpp)根据以字符 #开头的命令,修改原始的 C 程序,主要是将读取的系统头文件 stdio.h 中的内容插入到程序文本中。所得的另一个 C 程序以.i 作为文件扩展名

  2. 编译阶段编译器(cll)将 hello.i 程序翻译为汇编语言,翻译后的文件以.s 作为文件扩展名。这里只放出 main 函数的汇编语言:汇编语言为不同的高级语言的不同编译器提供了通用的输出语言

  3. 汇编阶段汇编器(as)将 hello.s 程序翻译为机器语言指令,并将其打包成可重定位目标程序的格式,并将结果保存在 hello.o 中。这是一个二进制文件

  4. 链接阶段因为 hello 程序中调用了 printf 函数,这是标准 C 语言库中的一个函数,存在与一个名为 printf.o 的单独的预编译好了的文件中。为了调用此函数,就必须将这个文件以某种方式合并到我们的程序中,连接器(ld)就负责处理这种合并。最终得到的 hello 文件,就是一个可执行文件,可以被加载到内存中,由系统使用

系统的硬件组成


  1. 总线贯穿整个系统的一组点句子管道,携带信息字节并负责在各个部位间传递。通常被设计为传送定长的字节块

  2. I/O 设备 I/O(输入/输出)设备时系统与外部世界的联系通道,如作为输入设备的键盘鼠标,作为输出设备的显示器等。通过控制器与适配器与 I/O 总线相连

  3. 主存一个临时存储设备,用于存放程序和程序处理的数据

  4. 处理器中央处理单元(CPU)简称处理器,是解释(或执行)存储在主存中指令的引擎处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。PC 会一直指向主存中的某条机器语言指令,并进行执行 CPU 执行指令的过程围绕着主存,寄存器文件(register file)和算术/逻辑单元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,且每个寄存器都有唯一的名字。ALU 则计算新的数据和地址值 CPU 大致能够执行以下一些操作:加载:从主存复制一个字节或者一个字到寄存器,覆盖寄存器原来的内容存储:从寄存器复制一个字节或者一个字到主存中的某个位置,覆盖该位置上原本的内容操作:把两个寄存器的内容复制到 ALU,ALU 对这两个字做算术运算 ,并将结果存放到一个寄存器中跳转:从指令本身中抽取一个字,将这个字辅助到 PC 中,覆盖 PC 原本的值等等

程序运行过程

接下来我们看看 hello 程序在运行过程中都发生了什么:

若我们要在 Unix 系统中执行 hello 程序,就需要将程序的文件名输入到一个名为 shell 的应用程序中

我们在键盘上输入"./hello"字符串后,shell 程序将字符逐一读入寄存器,再将其存放到内存中


当我们敲下回车键时,shell 程序就知道我们已经结束了命令的输入,shell 会执行一系列指令加载可执行的 hello 文件。这些指令将 hello 目标文件中的代码和数据从磁盘复制到主存。这里利用了直接存储器存取(DMA)技术,让数据可以不通过处理器而直接从磁盘到主存


目标文件 hello 中的代码和数据被加载到主存后,处理器就开始执行 hello 程序的 main 函数中的机器语言指令。这些指令将"hello, world\n"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上


抽象

文件是对 I/O 设备的抽象,虚拟内存是对主存和 I/O 设备的抽象,进程是对处理器,主存和 I/O 设备的抽象

进程

程序运行时系统看上去总是只有这个程序在运行,就好像这个程序独占了 CPU,主存和 I/O 设备。但运行程序的数量总比 CPU 数量多,这是由上下文切换实现的

在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到新进程时,就会发生上下文切换。CPU 会不断切换正在执行的进程,给人 CPU 在并发地执行多个进程的感觉

线程

现代系统中,一个进程可以由多个称为线程的执行单元组成。每个线程都运行在进程的上下文中,并共享代码和全局数据

虚拟内存

虚拟内存提供了一个假象:每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间每个进程看到的虚拟地址空间都由大量准确定义地区构成,每个区都有专门的功能。


文件

文件就是字节序列,每个 I/O 设备,包括磁盘,键盘,显示器,甚至网络,都可以看成是文件。

文件向应用程序提供了一个统一的视图,来让程序可以在使用不同磁盘技术的不同系统上运行

用户头像

还未添加个人签名 2021.10.11 加入

还未添加个人简介

评论

发布
暂无评论
一篇神文让你深入理解计算机系统——学习笔记