内存与调试-内存管理(4)扩内存之覆盖、交换、虚拟

内存扩充技术有三种:
内存覆盖(Overlay),内存交换(Swapping),内存虚拟。

对系统内存不够用采取的措施:
(1) 早期,微软的DOS,内存仅640K,程序大—–手动覆盖(overlay),把需要的指令和数据保存在内存中 。
(2) 程序多,自动交换技术(swapping),暂时不能执行的程序送到外存,代价大 。【从之前的程序员管理变成了操作系统自动管理】
(3) 以更小的页粒度单位在有限的内存中装入更多更大的程序,采用自动的虚拟存储技术

一、内存覆盖

早期的计算机系统中,主存容量小,虽然主存中仅存放一道用户程序,但是存储空间放不下用户进程的现象也经常发生,这一矛盾可以用覆盖基础来解决。

覆盖的基本思想是:由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区。其余部分按调用关系分段。

覆盖技术的实现是把程序划分为若干个功能上相对独立的程序段(又叫覆盖),按照其自身的逻辑结构使那些不会同时运行的程序段(覆盖)共享同一块内存区域(覆盖区)。其大小应由覆盖区中的最大覆盖来确定。

程序段先保存在磁盘上,程序运行时首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统将其调入覆盖区,替换覆盖区中原有的段。

覆盖技术的特点是打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行。


例如,一个用户程序由6个模块组成,下图给出了各个模块的调用关系,Main模块是一个独立的段,其调用A和B模块,A和B是互斥被调用的两个模块。在A模块执行过程中,调用C模块;而在B模块执行过程中,它可能调用D或E模块(D和E模块也是互斥被调用的)。为该用户程序建立的覆盖结构如下:Main模块是常驻段,其余部分组成两个覆盖段。

由以上推理可知,A和B模块组成覆盖段1,C、D和E组成覆盖段2。为了实现真正覆盖,相应的覆盖区应为每个覆盖段中最大覆盖的大小。

二、内存交换

交换(对换)的基本思想是,把处于等待状态(或在CPU调度原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来,这个过程叫做换出。把准备好竞争CPU运行的程序从辅存移到内存,这个过程又称为换入中级调度(策略)就是釆用交换技术。

例如,有一个CPU采用时间片轮转调度算法的多道程序环境。时间片到,内存管理器将刚刚执行的进程换出,将另一进程换入到 刚刚释放的内存空间中。同时,CPU调度器可以将时间片分配给其他已在内存中的进程。每个进程用完时间片都与另一进程交换。理想情况下,内存管理的交换过程速度足够快,总有进程在内存中可以执行。 有些交换需要注意一下几个问题:

  • 交换需要备份存储,通常是快速磁盘。它必须足够大,并且提供对这些内存映像的直接访问。
  • 为了有效使用使用CPU,需要每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间与所交换的内存空间成正比。
  • 如果换出进程,必须保证该进程是完全处于空闲状态。 交换空间通常作为磁盘的一整块,且独立于文件系统,因此使用就可能很快。
  • 交换通常在有很多进程运行且内存空间吃紧时开始 启动,而系统负荷降低就暂停。
  • 普通的交换使用不多,但交换策略的某些变种在许多系统中(如UNIX系统)仍发挥作用。

1)对换的引入

在多道程序环境下,一方面,在内存中的某些进程由于某事件尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至有时可能出现在内存中所有进程都被阻塞而迫使CPU停止下来等待的情况。另一方面,却又有着许多作业在外存等待,因无内存而不能进入内存运行的情况。显然这是对系统资源的一种严重浪费,使系统吞吐量下降,于是增设了对换(交换)设施。

—– 所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程调入内存。

—– 如果对换是以整个进程为单位的,便称之为“整体对换”或“进程对换”。解决内存紧张的问题。

—– 如果对换是以“页“或”段“为单位进行的,则分别称之为”页面对换“或”分段对换“。为了实现进程对换,系统必须能实现3个方面的功能:对换空间的管理、进程的换出、进程的换入。

2)对换空间的管理

在具有对换功能的OS中,通常把外存分为文件区对换区。前者用于存放文件,后者用于存放从内存换出的进程。对换区采用的是连续分配的方式(考虑到对换的速度)。

3)进程的换出与换入

换出:每当一进程由于创建子进程而需要更多的内存空间,但又无足够的内存空间等情况发生时,系统应将某进程换出。系统首先选择处于阻塞状态优先级最低的进程作为换出进程,然后启动磁盘,将该进程的程序和数据传送到磁盘的对换区。若传送过程未出现错误,便可回收该进程所占用的内存空间,并对该进程的进程控制块做相应的修改。

换入:把外存交换区中的数据和程序换到内存中。系统应定时的查看所有进程的状态,从中找出”就绪“状态但已换出的进程。将其中换出时间最久(换出到磁盘上)的进程作为换入进程,将之换入。直至已无可换入的进程或无可换出的进程为止。

交换的特点是打破了一个程序一旦进入主存便一直运行到结束的限制,但运行的进程大小仍受实际主存的限制。

三、内存覆盖与内存交换的区别

与覆盖技术相比,交换不要求程序员给出程序段之间的覆盖结构,而且交换主要是在进程或作业之间进行;而覆盖则主要在同一个作业或进程中进行。另外,覆盖只能覆盖与覆盖程序段无关的程序段覆盖技术则已成为历史;而交换技术在现代操作系统中仍具有较强的生命力。

四、内存虚拟

虚拟内存理论基础:

局部性原理(principle of locality)程序在执行过程的一个较短时期,所执行的指令的地址,指令的操作数地址都局限于一定区域。

  • 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都在较短时间内;
  • 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。

原理表明理论上虚存可以实现。程序只有一小部分在内存上,大部分在硬盘上,os在MMU帮助下完成。

虚存机制:

在分页、分段内存管理的硬件支持下,在装入程序时,只把当前需要执行的部分页或段装入内存,就可以开始执行;
当执行到指令或数据不在内存上时(缺页、缺段异常),由处理器通知操作系统,若有空余空间则将相应的页面或段调入内存,继续执行;
另一方面,os将内存中暂时不用的页、段调出保存在外存上以腾出空间。

虚存技术基本特征:

大的用户空间:内存可以小,硬盘必须足够。提供给用户的虚拟空间=物理内存+硬盘。
部分交换:swap in /swap out 是对部分虚拟地址空间进行的
不连续:物理内存分配的不连续,虚拟空间使用的不连续(内外存)

虚拟内存具体实现:

多采用虚拟页式内存管理,增加了请求调页和页面置换功能。只装入部分页面即可启动程序,如果要运行的程序和数据不在内存即页表某项invalid,则会抛出异常,向系统发出缺页中断请求,OS根据产生异常的地址找到对应在外存中的页面调入,使得继续运行。

 


参考:

https://blog.csdn.net/dongyanxia1000/article/details/51425141

https://cloud.tencent.com/developer/article/1194832

https://blog.csdn.net/github_36487770/article/details/54934919

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments