硬件组成
1.总线
总线负责携带信息直接并在各个组件之间传递。64位系统的字(Word)为8字节,即总线传输的定长字节块大小为8字节。
32位系统,限定了虚拟地址空间为4GB,地址范围为0-2^(32-1)。
2.IO设备
一般为磁盘,鼠标,键盘,显示器,还有Socket。通过适配器和IOo总线相连。
3.主存
即内存,由一组DRAM芯片组成
4.CPU
处理器的核心是一个字长的寄存器,称为程序计数器(PC)。在任何时刻,都指向主存中某条机器语言指令(即包含该条指令的地址)。
这样的寄存器有很多,他会执行如下操作:
- 加载:把一个字节或一个字复制到寄存器,覆盖原内容
- 存储:把一个字节或一个字从寄存器复制到内存某位置,覆盖原内容
- 操作:将2个寄存器的内容复制到ALU(算数/逻辑单元)对两个字做算数操作,并保存在一个寄存器中。
- 跳转:从指令中抽取一个字,复制到PC中。
一段程序的运行过程
当键盘输入./hello时,shell将每个字符先逐一读取入寄存器(通过DMA可以跳过寄存器),再存放到内存中。
在敲下回车键,shell知道输入完毕,会将执行文件(如程序的二进制文件或.py)和数据从磁盘复制到主存,处理器之后执行hello程序的机器语言指令,这些指令将”hello world”从主存复制到寄存器文件,再从寄存器文件复制到显示设备,显示在屏幕上。
操作系统
作用
1.防止失控的应用程序滥用计算机硬件资源
2.向应用程序提供简单一致的机制来控制底层复杂而且不一样的硬件设备
- 文件:IO设备的抽象
- 虚拟储存器:主存和磁盘的抽象
- 进程:处理器、主存、IO设备的抽象
进程
进程是操作系统对正在运行的程序的抽象。每个进程都好像独占使用硬件。但事实上是通过上下文切换来达到使用一个CPU就能运行多个进程。
上下文切换:上下文包括PC程序计数器,寄存文件当前值,以及主存的内容。当并发执行进程,操作系统会使用上下文切换来将控制权切换到另一个进程。
------+----------------
------+->->-->->-->----
------------------+----
------+-<-<--<-<--+----
------+----------------
线程
一个进程内有多个线程,因此有多个控制流。线程共享进程的代码和全局数据,多线程技术是一种让程序运行更快的手段。
虚拟存储器
这是一个抽象概念,它为每个进程提供一个假象,即每个进程都在独占使用主存。每个进程都看到一致的存储器,称为虚拟地址空间。
图中的地址是从下往上增大的。
- 内核虚拟存储器:最上层为操作系统的代码和数据预留。内核总是驻留在内存中,是操作系统一部分。这块区域不允许应用程序读写或直接调用内核定义的函数。
- 栈:用户虚拟地址空间的顶层。编译器用于实现函数调用,可以动态扩展和收缩
- 共享库:中间部分,如C标准库,数学库这样的共享库和数据的区域。
- 堆:当调用malloc或free时,能动态增加或收缩内存。
- 程序代码和数据:代码是从固定地址开始的,然后是变量对应的数据位置。代码和数据区直接按照可执行目标文件的内容初始化的。
文件
文件就是字节序列,包括磁盘,键盘,显示器,网络都能视为文件。系统所以输入输出都是通过使用一组称为Unix IO的系统函数调用读写文件来实现的。