操作系统-存储管理/设备管理的演化

548 阅读13分钟

存储管理

1、连续空间:

(1)一个作业独占用户空间

在最初的操作系统中,只有一个作业,这个作业与操作系统一起独占整个主存:

  • 该作业程序中的地址也是固定写在程序中的,将该程序调入内存时不需要修改程序中的地址
  • 需要用某个寄存器存储用户空间的最大和最小地址,防止用户程序访问了核心空间

(2)多个作业占用空间

后来引入了多进程,将程序一直调入调出主存是很费时的,所以就将空间划分成大小不同的区域,不同的进程根据需要进入不同的空间

  • 区域的大小有固定的,有动态修改的
  • 用户程序中的地址是基于基地址的偏移,得到实际地址的方式有静态和动态两种:
    • 静态方式:在程序被调入主存时,把程序中的地址都加上一个基地址,那么配套的是上、下界寄存器和地址检查机制,用地址访问主存时,地址检查机制检查地址是否在该进程的地址范围中
    • 动态方式:通过基址寄存器、长度寄存器和动态地址转换机制生成地址。在某个固定的寄存器中保存着基地址,在用户程序使用到某地址时,基地址加上偏移就是实际地址。
  • 位置信息包括进程的上、下界或基地址与程序长度,是保存在进程控制块 PCB 中

无论采用什么策略,连续空间分配都会造成空间的极大浪费和空间碎片化,显得非常老旧,但是这是那个时代不错的方式,因为虽然不连续的空间分配比着连续空间分配非常优秀,但它却很复杂,各个电子元件的性能都不足以支撑它。

2、不连续空间

(1)页式管理

把空间分成固定大小的页,分配空间的时候,取不连续的页给进程,这样用户程序中的地址会变得非常难处理,所以又演化出了逻辑空间。逻辑空间就是程序用的地址,它是连续的,物理空间是实际的地址,它是不连续的,中间的映射关系是用页表记录的,页表存在 PCB 中。

  • 因为页的大小是固定的,所以没有空间碎片化的问题,浪费的空间也十分有限
  • 但因为页表是放在主存上的,每次访问内存至少要查询内存2次,所以有演化出了快表
  • 共享与保护:增加存储保护域,表明该页表是否支持读/写/执行
  • 不连续空间分配才能实现共享

(2)段式管理

页式管理虽具有空间利用好、管理方法简单的特点,但是将空间按页划分就用户而言显得极不自然。

用户看待程序是以自然段为单位的,如主程序段、子程序段、数据段等。若用户要求保护,那么受到保护的基本单位也是自然段。

例如,某段只能读,另一段可执行等。而分页完全可能把不属于同一段的两块分到一页中。例如,用户程序由程序段和数据段组成,分页结果可能使得第4页中程序段(可执行)和数据段(可读/写)各半(如图5.19所示),从而无法对其进行保护。

此外,分页也不利于共享(共享应以段为单位)。

段式管理与页式管理类似,不过使用的是段表项,段表项中有:保护码,段长,本段在主存中的起始位置

这种方式因为不定长,所以比着页式管理更复杂,也会有空间碎片化的问题,将段式和页式结合就演化出了段页式管理。

(3)段页式管理

段页式系统对物理空间的管理、安排与页式系统相同,而对逻辑空间则先进行段的划分,然后在每一段内再进行页的划分。

例如,若用户作业由主程序、子程序和数据段组成。其逻辑地址由三部分组成:段号、页号、页内位移,分别记为S,P,d。对用户来讲,段页式系统和段式系统是一样的。用户逻辑地址只提供段号和段内位移,系统则按页式管理的原则将段内位移分割成页号和页内位移。

在段页式系统中,作业运行时同样需要动态地将逻辑地址转换成物理地址。地址转换所依赖的数据结构是段表和页表。每个作业均有一个段表,而每一段都有一个页表(都放在系统空间里)。段表项中原先的“本段在主存的起始地址”一栏改成“本段页表在主存的起始地址”。

注意:本段页表在主存的起始地址指向的是页表的地址,也就是说页表是连续存储在物理空间中的,段中的各个页还是要通过页表映射找到的,页还是不连续的

快表中既有段表项也有页表项。

这样访问两层,显然很烦。。。

(4)改进的页式管理

传统段式与段页式系统改进了页式管理不能按段保护的问题,但都要采用二维地址,给地址表示及转换带来额外开销。在页式地址表示的情形下,能不能避免将不同性质的相邻段数据分到同一物理页帧?答案是肯定的。我们可以将程序和数据的自然段按照页边界存放,即每个自然段的首字节必须存放于页的开始位置,这样就可以防止不同段跨页存放的问题,也可以按照段进行访问方式保护,即将相同段的所有页保护方式设成一致。

在编译器及装配器生成目标代码时,程序和数据各段都存放在一维分页逻辑空间中,段占用整数页面,如果段有效数据不能占用整页,则后面冲0,保证后续段从整页开始。这种逻辑空间安排方式可以完全采用页式管理来表示地址并进行地址转换。

轻松解决。。。

3、虚拟存储管理

随着用户程序功能的增加,进程所需空间越来越大,进程空间很容易突破主存的大小,导致进程无法运行。本节介绍另一种存储管理方法——虚拟存储管理,这种管理方法通过统一管理主、辅存,给用户造成一种仿佛系统内具有巨大主存供用户使用的假象。

实现页式虚拟空间的基本方法是,在页式存储管理的基础上,仅把进程的一部分页放在主存中。页表项中注明对应的页是在主存还是在辅存。程序在执行时,当访问的页不在主存时,根据页表项的指引,从辅存将其调入主存。如果这时已无可用的物理空间,则从主存淘汰若干页。

I/O控制方式

I/O控制方式也经历了一个发展的过程。I/O控制方式大致有如下三种。它们之间的主要不同在于I/O过程中CPU的干预程度。

1、程序直接控制方式

CPU在执行指令的过程中,遇到了一条与I/O相关的指令,CPU执行此指令的过程是向相应的设备控制器发命令。在程序直接控制I/O时,设备控制器执行相应的操作,将I/O状态寄存器的相应位(Bit)置上。设备控制部件并不进一步地通知CPU,也就是说,它并不中断CPU的当前处理过程。因此,CPU必须负责周期性地检查设备控制器的状态寄存器,直到发现I/O操作完成为止。在该方式中,CPU还负责从主存中取到需输出的数据,送到设备控制器寄存器;或从设备控制器寄存器取出输入数据,将输入的数据存入主存。总之,在程序直接控制I/O时,CPU直接控制I/O操作过程,包括测试设备状态,发送读/写命令与数据。因此,处理机指令集中应包括下述类别的I/O指令:

  • 控制类。激活外部设备,并告之做何种操作。如对磁带机的控制类命令可以有反绕至开始处(Rewind),或向前移一个记录等。
  • 测试类。测试设备控制部件的各种状态。
  • 读/写。在CPU寄存器及外部设备的控制器寄存器之间传输数据。

2、中断驱动方式程序

直接控制I/O方式的问题是,CPU必须花费大量时间等待相应的设备控制器准备好接收或发送数据。CPU在此等待期间,必须反复地测试设备控制器的状态。结果是,整个系统的性能下降了。解决办法是,CPU向设备控制器发出命令后,继续做其他有用的工作。当设备控制器准备好与CPU交换数据时,设备控制器中断CPU,要求服务。CPU被中断后,执行CPU寄存器与设备控制器之间的数据传输,然后恢复被中断的工作。下面分别从设备控制器和CPU两个方面细化上述过程:

  • 从设备控制器的角度来看,在输入时,设备控制器收到CPU的读命令。然后,设备控制器从外部设备读数据,一旦数据进入到设备控制器的数据寄存器,设备控制器通过中断信号线向CPU发一个中断信号,表示设备控制器已准备好数据。然后,设备控制器等待,直至CPU来向它请求数据。设备控制器收到从CPU发来的取数据请求后,将数据放到数据总线上,传到CPU的寄存器中。至此,本次I/O操作完成,设备控制器又可开始下一次I/O操作。
  • 从CPU的角度来看,输入过程是,CPU发出读命令。然后,CPU保存当前运行程序的现场(包括程序计数器及处理机寄存器),转去执行其他程序。在每个指令周期的末尾,CPU检查中断。当有来自设备控制器的中断时,CPU保存当前运行程序的现场,转去执行中断处理程序处理该中断。这时,CPU从设备控制器读一个字的数据传送到CPU寄存器,并存入主存。接着,CPU恢复发出I/O命令的程序(或其他程序)的现场,继续运行。

3、DMA方式

虽然中断驱动I/O方式比程序直接控制I/O方式更有效,但它在主存与设备控制器之间传送数据时,仍然需要CPU的干涉,任何数据传输必经过CPU中的寄存器。对于以字节为单位传送的外部设备,这种处理方式可以满足需求,但对于存储类型的外部设备,一次有大量的数据传送,这种处理方式就会让人感到处理机干涉太多。当大量的数据在外部设备与主存之间移动时,一种有效的技术就是DMA(Direct MemoryAccess)。

DMA功能可由一个独立的DMA部件在系统总线上完成,也可整合到设备控制器中,由此设备控制器完成。无论是哪种情况,DMA传送方式都是相同的:当CPU需要读/写一个数据块时,它给DMA部件发命令,命令中一般包含下述信息:

  • 操作类别为读或写。
  • 所涉及的外部设备的存储地址。
  • 读取或写入数据在主存中的首地址。
  • 读取或写入数据的字数。

在将数据读出、写入主存的过程中,DMA部件需要控制总线。由于DMA部件对总线的竞争使用,有时会出现这种情况:CPU需要使用总线,总线正被DMA部件控制,CPU不得不等待总线空闲。注意,这不是一次中断,CPU不需要保存程序的执行现场,转去执行其他内容。CPU只需要暂停一个总线周期

最终的结果是,在DMA传送期间,CPU的执行速度会慢下来。无论如何,对于一次成块的多字节的I/O传送来说,DMA方式比中断驱动I/O要减少许多中断,减少许多CPU的I/O启动操作。

I/O控制方式的发展过程可归纳为如下6步:

  1. CPU直接控制外部设备,这种情况在简单的微处理机控制设备上仍然可见。
  2. 加入设备控制器或I/O部件。CPU采用程序直接控制I/O方式而非中断驱动方式控制I/O。这样,使CPU在某种程度上,从与外部设备接口的细节中脱离出来。
  3. 同第 2 步有相同的结构,但引入了中断。CPU不需要将时间花费在等待I/O操作完成同步上,提高了效率。
  4. 设备控制器增加了DMA功能,能直接访问主存。这样,在外部设备与主存之间移动一个数据块时,除了在传送的开始及结束处,不需要再用CPU。
  5. 设备控制器的功能进一步增强,成为一个独立的不包含程序存储空间的处理机,且其指令集只包含I/O指令。CPU命令I/O处理机执行主存中的I/O程序。I/O处理机从主存取指令并执行,不需要CPU的干预。CPU可以要求I/O处理机完成一系列的I/O操作,并且仅在所有的I/O操作完成后被中断。
  6. 设备控制器有其自己的本地存储器,I/O程序放在本地由设备控制器执行。这样,设备控制器就能控制许多I/O设备,而CPU只需做极少的工作。在第5,6两步中,一个重要的变化是,设备控制器能够执行程序。5和6的差别在于,控制器执行的程序是在主存还是在设备控制器的本地存储器中。