现代操作系统学习(1)———引论

开始写现代操作系统学习方面的博客是为了记录现代操作系统的学习过程。这里会记录一些我认为比较重点的内容。参考书目是现代操作系统(原书第三版)

这里写图片描述
操作系统和普通软件(用户态)之间的主要区别是,如果你不喜欢某个音乐软件,你可以随便换一个,但是,你不能自行写一个属于操作系统一部分的时钟中断处理程序。这个程序由硬件保护,防止用户试图对其进行修改。
要注意,有时候在嵌入式系统(该系统没有内核态)或解释系统(如基于java的操作系统,它采用解释方式而非硬件方式区分组件)中,上述区别是模糊的。

把操作系统看作是向应用程序提供基本抽象(把复杂的硬件操作抽象为应用程序员可以使用的较简单的接口)的概念,是一种自顶向下的观点。按照自底而上的观点,现代计算机包括许多设备,从这个角度看,操作系统的任务是在相互竞争的程序之间有序地控制对处理器,存储器以及其他I/O接口设备的分配。

下面是一个简单的个人计算机的部件
这里写图片描述

首先是处理器
计算机的大脑CPU,它从内存中取出指令并执行之。
由于用来访问内存以得到指令或数据的时间要比执行指令花费的时间长的多,因此,所有的CPU都有一些用来保存关键变量和临时数据的寄存器。
除了用来保存变量和临时结果的寄存器外,计算机还有一些对程序员可见的专门寄存器。其中之一是程序计数器,它保存了将要取出下一条指令的内存地址。在指令取出之后,程序计数器就被更新以便取出后继指令。
另一个寄存器是堆栈指针,它指向了当前栈的顶端。该栈含有已经进入但是还没有退出的每个过程的一个框架。在一个过程的堆栈框架中保存了有关的输入参数,局部变量以及还没有保存在寄存器中的局部变量。
当然还有程序状态字(Program Status Word PSW)寄存器。这个寄存器包含了条件码位(由比较指令设置)、CPU优先级、模式(用户态,内核态),以及其他控制位。用户程序通常读入整个PSW,但只对其中的少量字段写入。
多线程对操作系统是有意义的,因为每个线程在操作系统看来像是单个的CPU。

存储器

这里写图片描述
存储器系统的顶层是CPU中的寄存器,它们用和CPU一样的材料制成,所以和CPU运算速度一样快,显然,访问它们是没有时延的。其典型容量是,在32位CPU中是32*32位,在64位CPU中是64*64位。在这两种情形下,其存储容量都小于1KB,程序必须在软件中自行管理这些寄出去你。
下一级是高速缓存。它多数由硬件控制。主存被分割成高速缓存行(cache line)其典型大小为64字节。地址0-63对应高速缓存行0,地址64-127对应高速缓存行1,以此类推。如果程序需要读一个存储字,高速缓存硬件检查所需要的高速缓存行是否在高速缓存中,如果是称为高速缓存命中。高速缓存命中通常需要两个时钟周期,如果未命中就要访问内存,时间很久。高速缓存价格高,大小有限,有些机器具有二级甚至三级高速缓存,每一级高速缓存比前一级慢且容量更大。
在缓存系统中,需要尽快考虑的问题包括:
1,何时把一个新的内容放入缓存。
2,把新内容放入哪一行
3,有需要时,把哪个内容移走
4,把新移走的内容放到较大的存储器的何处
现代CUP中设计了两个缓存,第一级或称为L1 的缓存总在CPU中,通常用来将已解码的指令调入CPU的执行引擎,对于那些频繁使用的数据字,多数芯片有第二个L1缓存。典型的L1缓存大小为16KB,另外往往还有二级缓存称为L2,用来存放近来所使用过若干兆字节的内存字。

再下一层是主存,这是存储器系统的主力。主存通常称为随机访问存储器(Random Access Memory ,RAM),所有在高速缓存中得到满足的访问请求都会转往主存。
另外有非易失性随机访问存储器,与RAM不同,在电源关闭后,ROM不丢失其内容。只读存储器ROM(read only memory)在工厂中编程完毕,不能被修改,ROM速度快且便宜,在计算机中,用于启动计算机的引导加载模块就放在ROM中,另外一些I/O 卡也采用ROM处理底层设备控制。
EEPROM和闪存也是非易失性的,但是可擦除,只是重写它们需要比RAM更高数量级的时间。
还有一种是CMOS,它是易失性的,许多计算机利用CMOS存储器保存当前时间和日期,以及从哪个磁盘启动。

下一个层次是磁盘,每个磁头可以读取一段环形区域,称为磁道,把一个给定臂上的所有磁道合并起来,形成柱面(cylinder)。
这里写图片描述
每个磁道划分为若干扇区,扇区的典型值是512字节。机械臂从一个柱面移动到相邻柱面需要1ms,一般随机移动到一个柱面需要的时间为5-10ms,到了柱面后,等待扇区旋转到磁头下又增加了5-10ms的时延。具体时延取决于转速,低端硬盘的速率是5MB/S,高速磁盘的速率是160MB/S。
许多计算机都支持虚拟内存机制。方法是把程序放在磁盘上,把主存当做一种缓存,用来保存最近频繁使用的部分程序。这种机制需要快速地映像内存地址,以便把程序生成的地址转换为有关字节在RAM中的物理地址,这种映像由CPU中的一个部件存储管理单元(memory management unit MMU)完成。
存储器体系的最后一层是磁带,通常用于磁盘的备份。

I/O设备

CPU和存储器不是操作系统唯一需要管理的资源,I/O设备也与操作系统密切相关。I/O系统一般包括两个部分,设备控制器和设备本身。
控制器的任务是为操作系统提供一个简单的接口(实质上还是很复杂)
I/O设备的另一个部分是设备自身,设备本身有个相对简单的,标准化接口。标准化是必须的,这样,任何一个IDE磁盘控制器就可以适应任何一种IDE硬盘。IDE表示集成驱动器电子设备(Integrated Drive Electronics),是许多计算机磁盘的标准。
每类设备控制器都是不同的,所以需要不同的软件进行控制,专门与控制器对话,发出命令并接受响应的软件,称为设备驱动程序(Device Driver)。
要将驱动程序装入系统,有三个途径,第一种,是将内核与设备驱动程序重新链接,然后重启系统,许多Unix系统以这种方式工作。第二种,是在操作系统文件中设置一个入口,并通知该文件需要一个设备驱动程序,然后重启系统,在重启时,操作系统会去寻找所需的驱动程序并装载之。第三种,操作系统运行时接受新的设备驱动程序并立刻安装好,例如热插拔设备。
每个设备控制器都有少量的用于通信的寄存器。所有设备寄存器的几何构成了I/O端口空间。
设备寄存器可以映射到操作系统的地址空间,这样,它们就可以和普通的存储字一样读出和写入,不需要专门的I/O指令,用户程序可以被硬件阻挡在外,防止其接触这些存储器地址。而有一部分计算机,设备寄存器被放在I/O端口空间中,每个寄存器都有一个端口地址,并提供内核态可用的IN、OUT命令。这两种方式都很常见。

实现输入和输出的方式有三种,最简单的是忙等待,缺点是占据CPU,CPU一直轮询设备直到I/O操作完成。
第二种是设备驱动程序启动设备并在完成时发出一个中断。
其中,如果中断控制器准备接收中断,它会在CPU芯片的一个管脚上声明,这就是第三步,在第四步中,中断控制器把该设备的的编号放在总线上,这样CPU可以读总线,并知道哪个设备规格完成了操作(可能同时有多个设备在运行)
这里写图片描述
一旦CPU决定取中断,通常程序计数器和PSW就被压入当前栈中,并且CPU被切换到用户态,设备编号可以成为部分内存的一个引用,用于寻找该设备中断处理程序的地址。这部分内存被称为中断向量,当中断处理程序(中断设备的设备驱动程序的一部分)开始后,它取走已入栈的程序计数器和PSW,并保存之,然后查询设备状态。在中断处理程序全部完成后,它返回到先前运行的用户程序中尚未执行的头一条指令。
这里写图片描述

第三种是,为I/O使用直接存储访问(DMA)芯片,它可以控制在内存和某些控制器之间的位流,而无须持续的CPU干预。CPU对DMA芯片设置传送字节数,设备和内存地址,以及操作方向,接着启动DMA。DMA芯片完成时会发出一个中断,和前面处理方式一样。

扫描二维码关注公众号,回复: 1110259 查看本文章

总线

单总线很难处理总线的交通流量了,就导致其他总线的出现,他们处理I/O设备以及CPU到存储器的速度更快。这种演化的结果是:
这里写图片描述
关于总线的内容比较繁琐,不好总结,直接把书截图放这里吧
这里写图片描述
这里写图片描述
这里写图片描述

操作系统概念

1、进程
进程本质上是正在执行的一个程序,与每个进程相关的是进程的地址空间(address space),这是从某个最小值的存储位置(通常为零)到某个最大存储位置的列表。在这个地址空间中,进程可以进行读写,地址空间中存放可执行程序,程序的数据&程序的堆栈。与每个进程相关的还有资源集,通常包括寄存器(含程序计数器和堆栈指针)、打开文件的清单,突出的报警,有关进程清单以及运行该程序所需的其他信息。进程基本上是容纳运行一个程序所需要所有信息的容器。
在许多操作系统中,与一个进程有关的所有信息,除了该进程自身地址空间的内容外,均存放在操作系统的一张表中(进程表(process table))。进程表是数组(或链表)结构,当前存在的每个进程都要占用其中一项。
这里写图片描述
所以一个(挂起的)进程包括:进程的地址空间,往往称作磁芯映像(core image,纪念过去使用的磁芯存储器),以及对应的进程表项,其中包括寄存器以及稍后重启进程需要的许多其他信息。

与进程管理有关的最关键的系统调用是那些进程创建和终止的系统调用。

若一个进程能够创建一个或多个进程(称为子进程),而且这些进程又可以创建子进程,则很容易得到进程树,合作完成某些作业的相关进程经常需要彼此通信以便同步它们的行为,这种通信称为进程间通信。
其他可用的进程系统调用包括:申请更多内存(释放不要的内存),等待一个子进程结束,用另一个程序覆盖该程序等。

这里写图片描述
这里写图片描述
具体关于陷阱的文章请参阅:http://blog.csdn.net/frozenshore/article/details/48738207
这里写图片描述
地址空间
这里写图片描述
文件
进程和文件层次都可以组织成树状结构,但是这两种树状结构有不少不同之处。一般进程的树状结构层次不深(一般不超过三层),而文件树状结构的层次会有更多层。进程树的层次结构是暂时的,通常最多存在几分钟,而目录结构可能存在数年之久,进程和文件在所有权及保护方面也是有区别的。只有父进程能访问子进程,而在文件和目录中通常存在一种机制,使文件除了所有者外的其他用户也能访问。
在实例中,每个进程有一个工作目录,那么工作目录中的文件路径就不需要从根目录写起,可以从工作目录下写起。进程可以通过使用系统调用指定新的工作目录,从而变更其工作目录。
然而,不能使用在CD-ROM上的文件系统,因为上面没有可指定的路径,UNIX不允许在路径前面加上驱动器名称或代码,那样做就完全成了设备相关类型了,这是操作系统应该消除的,代替的方式是,mount系统调用允许把CD-ROM上的文件系统连接到程序所希望的根文件系统上,
这里写图片描述
当CD-ROM安装好,如果b中有文件不能访问,是因为/b指向了CD-ROM的根目录,一般没什么问题,因为文件系统几乎总是安装在空目录上。如果系统有多个硬盘,它们也可以安装在单个树上。
这里写图片描述

系统调用

我们已经看到操作系统有两种功能:为用户程序提供抽象和管理计算机资源。多数情况下,用户和操作系统之间的交互处理的是前者,例如创建写入删除文件等。
下面展示read的系统调用来看系统调用的步骤吧。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
有必要指出,将POSIX过程映射到系统调用并不是一对一的,POSIX标准定义了构造系统所必须提供的一套过程,但是并没有规定他们是系统调用还是库调用或其他形式。如果不通过系统调用就可以执行一个过程,那么从性能方面考虑,它通常会在用户空间中完成。多数POSIX过程确实进行系统调用,通常一个过程直接映射到一个系统调用上,在一些情况下,所需的过程如果仅仅是某个调用的变体时,此时一个系统调用会对应若干个库调用。

这里写图片描述
这里写图片描述
这里写图片描述
在UNIX中进程将其存储空间分为三段:正文段(如程序代码)、数据段(如变量)、以及堆栈段。数据段向上增长,而堆栈向下增长。夹在中间的是未使用的地址空间。堆栈在需要是自动向中间增长,数据段的拓展是显式地通过系统调用brk进行的,在数据段扩充后,该系统调用制定一个新地址。
这里写图片描述
这里写图片描述

C

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_21747841/article/details/78637911