一、系统硬件组成
1、中央处理单元(CPU)
解释和执行内存中的指令
(1)控制器
程序计数器(PC):指令指针,指向主存中的机器语言指令,为一个字大小的存储设备或寄存器。
指令寄存器、指令译码器、时序产生器、操作控制器
(2)算数逻辑单元(ALU)
(3)寄存器
(4)高速缓存
一个典型的寄存器文件只存储几百字节的信息,而主存可存放几十亿字节。但是,处理器从寄存器文件上读取数据的时间开销比从主存中读取几乎要快100倍(从磁盘中读取数据的时间开销比从主存中读取的大1000万倍),而且加快处理器的速度比加快主存运行速度代价更小。
因此,采用高速缓存存储器(cache memory)作为处理器芯片上的临时存储区域,存储处理器近期可能需要的信息。L1高速缓存的容量为数万字节,访问速度几乎和访问寄存器文件一样;L2高速缓存为数十万到数百万字节,访问速度比访问L1高速缓存长5倍。高速缓存采用静态随机访问存储器(SRAM)的硬件技术实现。
2、主存(内存)
临时存储设备,在CPU执行程序时用来存放程序和程序处理的数据(从磁盘复制)。从物理上来说,主存时由一组动态随机存储器芯片(DRAM)组成,从逻辑上来看,存储器是一个线性的字节数组,每个字节都有唯一的地址(数组索引)。
3、I/O设备
输入/输出设备是系统和外部世界的联系通道。如鼠标、键盘、显示器、磁盘等。每个I/O设备通过一个控制器或适配器与I/O总线相连。
控制器:I/O设备或主板上的芯片组,如USB、磁盘。
适配器:主板插槽上的卡,如网络适配器、图形适配器。
4、总线
贯穿整个系统的电子管道,携带信息字节并负责在各个部件间传递,通常被设计成传送定长的字节块,即字(32位机器上为4个字节,64位机器上为8个字节)。
二、程序运行过程
指令(二进制):操作码+操作数地址
1、加载程序:将代码和数据从磁盘复制到主存。
2、取指令:从主存复制指令到指令寄存器。
3、译码:指令译码器分析指令的操作码字段,生成完成操作的控制信号。
4、执行指令:从主存或缓存中取数据到寄存器中,进行运算,将结果保存到寄存器或者主存中。
运行一个打印hello,world的hello文件,会将目标文件中的代码和数据从磁盘复制到主存。加载到主存后,处理器开始执行main程序中的机器语言指令。这些指令将"hello,world\n"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示到屏幕上。
三、操作系统管理硬件
操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又大不相同的低级硬件设备。操作系统通过基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。
1、进程
进程是操作系统对一个正在运行的程序的一种抽象。
并发运行:一个进程的指令和另一个进程的指令是交错执行的。
并行运行:多个处理器或者是多核的处理器同时处理多个不同的任务。
一个CPU看上去是在并发地执行多个进程,这是通过处理器在进程间切换来实现的,操作系统实现这种交错执行的机制称为上下文切换。
上下文切换:当前进程通过系统调用将控制权传递给操作系统,操作系统保存当前进程的上下文,恢复新进程的上下文(如果进程不存在,创建新的进程及其上下文),然后将控制权传递给新进程。
从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的。内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条特殊的系统调用(system call)指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。注意,内核不是一个独立的进程。相反,它是系统管理全部进程所用代码和数据结构的集合。
线程
一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。因为多线程之间比多进程之间更容易共享数据,也因为线程一般来说都比进程更高效。当有多处理器可用的时候,多线程也是一种使得程序可以运行得更快的方法。
多核处理器和超线程
处理器必须在多个任务间切换的配置成为单处理器系统,与之相对的是多处理器系统的概念。
多核处理器,将多个CPU集成到一个集成电路芯片上,每个核都有自己的L1和L2高速缓存,共享L3高速缓存。
超线程,允许一个CPU执行多个控制流,比如,Intel Core i7处理器可以让每个核执行两个线程,一个4核的系统可以并行地执行8个线程。
2、虚拟内存
抽象概念,为每个进程提供一个假象,即每个进程都在独占地使用主存,每个进程看到的内存是一致的,称为虚拟地址空间。
(1)内核虚拟内存:为内核保留。
(2)栈:用户虚拟地址空间顶部,编译器用栈来实现函数调用。用户栈在程序执行期间可以动态地拓展和收缩,函数调用时增长,返回时收缩。
(3)共享库:存放像C标准库和数学库这样的共享库的代码和数据的区域。
(4)堆:调用malloc和free时,在运行时动态拓展和收缩。
(5)读写数据:全局/静态变量存储区,数据段和bss段(未初始化和初始化为0)。
(6)只读的代码和数据:代码段和字面常量区。
3、文件
文件就是字节序列。每个I/O设备都可以看作文件,系统中的所有输入输出都是通过使用一小组系统函数调用读写文件来实现的。