交换技术
交换(Swapping)技术它的主要特点是:打破了一个程序一旦进入内存,就一直驻留在内存直到运行结束的限制。
在多道程序环境下,内存中可以同时存在多个进程(程序),其中的一部分进程由于等待某些事件而处于阻塞状态,但这些处于阻塞状态的进程仍然驻留内存,并占据着内存空间;另一方面,外存上可能有许多等待装入内存运行的程序,却因内存不足而未能装入。显然,这是一种严重的系统资源浪费,它会使系统的吞吐量下降。为了解决这个问题,可以在操作系统中增加交换(对换)功能,即由操作系统根据需要,将内存中暂时不具备运行条件的部分程序或数据移到外存(换出),以便腾出足够的内存空间,将外存中需要运行的程序或数据调入内存(换入)投入运行。在操作系统中引入交换(对换)技术,可以显著提高内存资源的利用率并改善系统的性能。
以交换的单位不同来划分,则有以下两种交换方式。
- 以进程为单位的交换。每次换入/换出的是整个进程,我们称这种交换为进程交换(进程对换)或整体交换(整体对换)。进程交换广泛应用于分时系统,主要解决内存紧张问题。
- 以页(此处不多做介绍)或段(此处不多做介绍)为单位的交换。这种交换分别称为页置换(页交换或页对换)或段置换(段交换或段对换),页置换和段置换是以进程中的某一部分为交换单位,因此又称为部分交换(部分对换)。部分交换广泛应用于现代操作系统中,是实现虚拟存储器的基础。
我们这里所说的交换是指进程交换,为了实现进程交换,操作系统需要解决以下两个问题。
- 对换空间的管理。在具有交换功能的操作系统中,一般将外存空间分为文件区和交换区(对换区)。文件区用来存放文件,而交换区则用来存放从内存中换出的进程,或等待换入内存的进程。尽管文件区一般采用离散分配方式来分配外存存储空间,但交换区的存储空间分配则宜采用连续分配方式,这是因为交换区中存放的是换入/换出的进程,为了提高交换速度,有必要采用连续分配方式,并且交换区可以采用与可变分区存储管理类似的方法进行管理。例如,使用空闲分区表或空闲分区链来记录外存交换区的使用情况,利用首次适应算法、最佳适应算法或最差适应算法来进行外存交换区的分配。
- 交换的时机以及选择哪些进程交换。交换时机一般选择在进程的时间片用完,以及进程等待输入/输出时,或者在进程要求扩充其内存空间而得不到满足时。换出到外存的进程一般选择处于阻塞状态,或优先级低且短时间内不会再次投入运行的进程;换入到内存的进程则应选择换出时间最久且已处于就绪状态的进程。
概念
根据程序的局部性原理,一个进程在运行的某个时间段内只访问其程序的一部分指令或数据,所以就没必要在进程运行之前将其所属的全部程序和数据都装入内存,即只装入进程当前运行所需要的部分程序和部分数据就可启动运行,以后再根据需要逐次装入剩余的部分程序和数据。并且,内存中暂不执行的部分程序和暂不使用部分数据也不必放在内存,可以将其由内存调至外存,释放它们所占用的内存空间。对内存中的各进程也是如此,内存中暂时没有执行的进程也可以将其由内存调至外存,释放它所占用的内存空间,并用来装入外存上需要投入运行的进程,被调出到外存的进程在以后需要运行时,再重新调入内存。这样一来,在内存容量不变的情况下,就可以使一个大程序在较小的内存空间中运行,也可以装入更多的进程(程序)并发执行。
由于一次性和驻留性在进程运行时不是必需的,因此可以按照以下方式来运行进程,即一个进程只装入其部分程序和数据便投入运行。在进程运行过程中,若需要访问的指令和数据在内存中,则继续执行;若不在内存中,则系统通过调入功能,把进程需要执行或访问的这部分程序和数据由外存自动装入内存(称为部分装入);若内存已无足够的空闲区装入这部分信息,则系统把该进程在内存中暂时不用的部分程序和数据从内存中调出到外存(称为部分对换),以便腾出内存空间装入该进程需要调入内存的这部分信息。进程按照这种方式运行,会明显提高内存空间利用率和系统吞吐量。对用户而言,所感觉到的是一个容量更大的内存,通常把它称为虚拟存储器,简称虚存。
实现虚拟内存的必要条件:
(1)能够完成虚拟地址到物理地址的转换。程序中使用的是虚拟地址(即逻辑地址),为了实现虚拟存储器,就必须完成虚拟地址到内存物理地址的重定位。虚拟地址的大小可以远远超过实际内存容量的大小,它只受地址寄存器的位数限制,如一个 32 位的地址寄存器,其支持的虚拟地址最大可达 4GB。
(2)实际内存空间。程序装入内存后才能运行,所以内存空间是构成虚拟存储空间的基础。因为虚拟存储器的运行速度接近于内存速度,所以内存空间越大所构成的虚拟存储器的运行速度也就越快。
(3)外存交换区。为了从逻辑上扩大内存空间,一般将外存空间分为文件区和交换区。交换区中存放的是在内、外存之间交换的程序和数据,交换区可大可小。
(4)换入、换出机制。它表现为中断请求机构、淘汰算法及换入、换出软件。
现代操作系统一般都支持虚拟存储器,但不同系统实现虚拟存储器的具体方式存在差异。程序装入内存时,如果以页或段为单位装入,则分别形成请求分页存储管理方式和请求分段存储管理方式;若将分段和分页结合起来,则又可以形成请求段页式存储管理方式。
请求段页式存储管理
请求段页式存储管理是建立在段页式存储管理基础上的一种段页式虚拟存储管理。根据段页式存储管理的思想,请求段页式存储管理首先按照程序自身的逻辑结构,将其划分为若干个不同的分段,在每个段内则按页的大小划分为不同的页,内存空间则按照页的大小划分为若干个物理块。内存以物理块为单位进行离散分配,不必将进程所有的页装入内存就可启动运行。当进程运行过程中,访问到不在内存的页时,若该页所在的段在内存,则只产生缺页中断,将所缺的页调入内存;若该页所在的段不在内存,则先产生缺段中断再产生缺页中断,将所缺的页调入内存。若进程需要访问的页已在内存,则对页的管理与段页式存储管理相同。
1.段表及页表机制
请求段页式存储管理中的页表和段表是两个重要的数据结构。页表的结构与请求分页存储管理中的页表相似,段表则在段页式存储管理中的段表基础上增加了一些新的字段,这些新增的字段包括中断位(状态位)、修改位和外存始址等,用来支持实现虚拟存储器。
2.中断处理机制
由于在请求段页式存储管理中内存空间的分配是以页为单位,因此当某个进程在运行过程中发现所要访问的页不在内存时,就要先判断该页所在段的页表是否在内存,若页表已在内存,则只产生缺页中断,由缺页中断处理程序将所缺的页由外存调入内存;若缺页所在段的页表不在内存则表明该段不在内存,这时先产生缺段中断且由缺段中断处理程序为该段在内存中建立一张页表,并将该页表的内存始址存入段表相应的段表项中,然后再产生缺页中断,由缺页中断处理程序将所缺的页由外存调入内存。
3.地址转换
请求段页式存储管理与段页式存储管理的地址转换机制类似,但由于请求段页式存储管理支持虚拟存储器,因此在它的地址转换机制中增加了用于实现虚拟存储器的中断功能和置换功能。请求段页式存储管理中的逻辑地址到内存物理地址转换过程如下。
(1)若系统中设置了快表,则首先在快表中查找该页对应的页表项,若在快表中找到这个页表项,就将该页表项中的物理块号和逻辑地址中的页内地址进行拼接,得到要访问的内存物理地址。
(2)如果快表中没有所需要的页表项,则在内存中查找页表(实际上是同时查找),从该页对应页表项中的中断位来判断该页是否在内存。若在内存,则将该页表项中的物理块号与逻辑地址中的页内地址拼接为内存物理地址,同时将该页表项放入快表。
(3)如果要访问的页还没有调入内存,并且包含该页的段所对应的页表也不在内存(意味着该段不在内存),于是就产生缺段中断将该段的页表调入内存,缺段处理完成后再产生缺页中断;若包含该页的段所对应的页表已在内存,则只产生缺页中断。缺页中断则将该页由外存调入内存,然后通过页表查找得到该页对应的物理块号,并将该物理块与逻辑地址中的页内地址拼接形成要访问的内存物理地址,同时将该页表项放入快表。如图
关联文章:Linux设置虚拟内存