本文为读书摘要(个人认为重要的知识点),穿插课后习题的选取(主要选取考察概念性的习题)
考察操作系统有两种观点:资源管理观点和扩展的机器观点。
古老的是流水线机制
**比流水线更先进的设计是超标量CPU,如图 1-7b所示。在这种设计中,有多个执行单元。例如,一 个CPU用干整数算术运算,ー个CPU用于浮点算术运算,ー个CPU用于布尔运算。两个或更多的指令被同时取出、解码并装入暂存缓冲区中,直至它们执行完毕。只要有一个执行单元空闲,就检査保持 缓冲区中是否还有可处理的指令,如果有,就把指令从缓冲区中移出并执行之。**这种设计存在ー种隐含的作用,即程序的指令经常不按顺序执行。在多数情况下,硬件负责保证这种运算的结果与顺序执行指令时的结果相同。
超线程技术
超线程技术允许CPU保持两个不同的线程状态,然后在纳秒级的时间尺度内来回切换。
例如,如果某个进程需要从内存中读出ー个字(需要 花费多个时钟周期),多线程CPU则可以切换至另ー个线程。超线程技术不提供真正的并行处理。在ー个时刻只有一个进程在运行,但是线程的切换时间则减少到纳秒数量级。
存储器 理想情况下的三个特征(无法同时满足)
具体细节 可以看看 每个程序员都应该了解的内存知识【第一部分】 - OSCHINA - 中文开源技术交流社区
一些存储类型:
RAM —— Random Access Memory
ROM —— Read Only Memory 非易失性随机访问存储器(出厂后就不能修改)
CMOS —— 易失性,通常用于计算机保存当前时间和日期,由一块小电池驱动
I/O设备一般包括两个部分:设备控制器和设备本身。控制器是插在电路板上的ー块芯片或ー组芯片,这块电路板物理地控制设备。它从操作系统接收命令,例如,从设备读数据,并且完成数据的处理。
输入输出的三种方式:
第一种方式 :busy waiting
第二种方式 :中断
中断 I/O 具体过程
![]()
在上图中,有一个I/O的三步过程。
- 在第1步,设备驱动程序通过写设备寄存器通知设备控制器做什么。然后,设备控制器启动该设备。
- 当设备控制器传送完毕被告知要进行读写的字节数量后,它在第2步中使用特定的总线发信号给中断控制器芯片。
- 如果中断控制器已经准备接收中断(如果正忙于ー个更高级的中断,也可能不接收),它会在CPU芯片的ー个管脚上声明,这就是第3步。
- 在第4步中,中断控制器把该设备的编号放到总线上,这样CPU可以读总线,并且知道哪个设备刚刚完成了操作(可能同时有许多设备在运行)。
与函数调用过程类似
一旦CPU决定取中断,通常程序计数器和PSW就被压入当前堆栈中,并且CPU被切换到用户态。
设备编号可以成为部分内存的ー个引用,用于寻找该设备中断处理程序的地址。这部分内存称为中断向量(interrupt vector)。
当中断处理程序(中断设备的设备驱动程序的一部分)开始后,它取走已入栈的程序计数器和PSW,并保存之,然后査询设备的状态。在中断处理程序全部完成之后,它返回到先前运行的用户程序中尚未执行的头一条指令。
第三种方式:DMA芯片
CPU对DMA芯片进行设置,说明需要传送的字节数、有关的设备和内存地址以及操作方向,接着启动DMA。当DMA芯片完成时,它引发ー个中断,其处理方式如前所述。
中断会(并且经常会)在非常不合适的时刻发生,比如,在另ー个中断程序正在运行时发生。正由于此,CPU有办法关闭中断并在稍后再开启中断。在中断关闭时,任何已经发出中断的设备,可以继续保持其中断信号,但是CPU不会被中断,直至中断再次启用为止。 如果在关闭中断时,已有多个设备发出了中断,中断控制器将决定先处理哪个中断,通常这取决于事先赋予毎个设备的静态优先级。最高优先级的设备赢得竞争并且首先获得服务,其他设备则必须等待。
随着处理器和存储器速度越来越快,到了某个转折点时,单总线(当然还有IBM PC总线)就很难处理总线的交通流量了,只有放弃。其结果是导致其他的总线出现,它们处理I/O设备以及CPU到存储器的速度都更快。这种演化的结果是,目前一台大型x86系统的结构如下图所示。
图中的系统有很多总线(例如高速缓存、内存、PCIe. PCI、USB、SATA和DMI),每条总线的传输速度和功能都不同。操作系统必须了解所有总线的配置和管理。其中主要的总线是PCle (Peripheral Component Interconnect Express) 总线。
共享总线架构(shared bus architecture) 表示多个设备使用一些相同的导线传输数据。因此,当多个设备同时需要发送数据时,需要仲裁器决定哪个设备可以使用总线。
PCIe恰好相反,它使用分离的端到端的链路。
传统PCI使用的并行总线架构(parallel bus architecture) 表示通过多条导线发送数据的每ー个字。例如,在传统的PCI总线上,ー个32位数据通过32条并行的导线发送。
与之相反,PCIe使用串行总线架构(serial bus architecture),通过一条被称为数据通路的链路传递集合了所有位的一条消息,这非常像网络包。这样做简单了很多,因为不用再确保所有32位在同一时刻精确地到达目的地。
通过将多个数据通路并行起来, 并行性仍可有效利用。
在图中,CPU通过DDR3总线与内存对话,通过PCIe总线与外围图形设备对话,通过DMI (Direct Media Interface)总线经集成中心与所有其他设备对话。而集成中心通过通用串行总线与USB设备对话, 通过SATA总线与硬盘和DVD驱动器对话,通过PCIe传输以太网络帧。我们已经提到过使用传统PCI总线的旧的PCI设备。
不仅如此,每ー个核不仅有独立的高速缓存,而且还共享一个大得多的高速缓存。每ー种高速缓存都引入了又一条总线。
由于在(硬)实时系统中满足严格的时限是关键,所以操作系统就是ー个简单的与应用程序链接的库,各个部分必须紧密耦合并且彼此之间没有保护。这种实时系统的例子有eCos。
在微内核设计背后的思想是,为了实现高可靠性,将操作系统划分成小的、良好定义的模块,只有其中一个模块——微内核——运行在内核态,其余的模块由于功能相对弱些,则作为普通用户进程运行。 特别地,由于把每个设备驱动和文件系统分别作为普通用户进程,这些模块中的错误虽然会使这些模块崩溃,但是不会使得整个系统死机。所以,音频驱动中的错误会使声音断续或停止,但是不会使整个计算机垮掉。相反,在单体系统中,由于所有的设备驱动都在内核中,ー个有故障的音频驱动很容易引起对无效地址的引用,从而造成恼人的系统立即停机。
经验证据表明,存储器访问表现出引用局部原则,即如果读取某一个位置,则接下来访问这个位置的概率非常高,尤其是紧随其后的内存位置。 因此,通过缓存整个缓存行,接下来缓存命中的概率会增加。 此外,现代的硬件可以将32或64字节块整个传输到高速缓存行,比单个字节读取,总共读32或64字节的速度要快得多。
多道程序设计的主要原因是在某个程序等待I/O完成时,可以让CPU做一些其他操作。 如果没有DMA,则CPU完全占用I/O,因此通过多道程序设计没有任何收益增加获得(至少在CPU利用率方面)。 无论程序执行多少I/O,CPU都将100%处于忙碌。 这当然假设主要的延迟是数据被复制时的等待。 如果由于其他原因(例如,到达串行线路)I/O很慢,CPU可以执行其他工作。
典型的例子(对I/O进行权限控制),比如对于I/O设备(例如,打印机)的访问,通常对不同用户限制也不同。某些用户可以允许打印任意数量的页面,某些用户可能根本不允许打印,而一些用户可能仅限于打印一定数量的页面。 这些限制由系统管理员根据某些策略设置。 需要强制执行此类策略,以便用户级别的程序不会干扰它们。
大多数现代CPU提供两种执行模式:内核态和用户态。 CPU可以执行其指令集中的每条指令,并在内核态下执行时使用硬件的各种功能。 但是用户态只能执行部分指令,执行时仅使用部分功能。 拥有两种模式的设计允许人员以用户态运行用户程序,从而拒绝他们访问关键指令。
分时系统一般指分时操作系统。 分时操作系统是使一台计算机采用时间片轮转的方式同时为几个、几十个甚至几百个用户服务的一种操作系统。
在分时系统中,多个用户可以使用他们自己的终端同时访问和执行计算系统上的计算。 多道程序设计系统允许用户同时运行多个程序。 所有分时系统都是多道程序设计系统,但并非所有多道程序设计系统都是分时系统,因为多道程序设计系统可以在只有一个用户的PC上运行。