操作系统概念(九)——虚拟内存

基本假设:进程的代码与数据部分装入内存

一、背景

有些情况下不需要将整个程序放入内存:
①程序中有处理异常错误条件的代码
②数组、链表、表通常分配了比实际所需要的更多的内存
③程序某些选项可能很少使用
虚拟内存将内存抽象成一个巨大的、统一的存储数组,进而将用户逻辑内存与物理内存分开,逻辑内存的大小不再受限,需要内存管理单元MMU将逻辑页映射到内存的物理页帧,这里只讲请求分页调度。

二、请求分页

1、在需要的时候才调入相应的页
2、交换程序对整个进程进行操作,调页程序只对进程的单个页进行操作。
3、在换入的时候,调页程序会推测在再次换出前会用到哪些页
4、有效无效位:之前在内存管理中的是表示是否有效,而现在是表示(1:合法且在内存中;0:无效或者可能在磁盘上)。初始值为0,当时试图访问为0的页时会发生页错误陷阱
5、当有效位无效的时候,不会对MMU进行地址转换
6、是否合法需要在中断程序中判断
7、长期调度的时候会决定哪些页放入内存,哪些放在磁盘
8、页错误陷阱的处理:
①检查进程的内部页表(一般与PCB一起保存),以确定该引用是合法还是非法的地址访问。在中断程序中进行
②如果引用非法,那么终止进程。如果引用有效但是尚未调入页面,那么现在应调入。
③找到一个空闲帧(从空闲帧链表中取一个,可能引发页面置换)
④调度一个磁盘操作,以便将所需要的页调入刚分配的帧。是磁盘I/O采用DMA方式进行,会将进程放入等待队列
⑤当磁盘读操作完成后,修改进程的内部表和页表,以表示该页已在内存中。I/O完成
⑥重新开始因非法地址陷阱而中断的指令。进程现在能访问所需的页,就好像它似乎总在内存中。进程状态改变
在这里插入图片描述
9、通过第一次中断陷入OS,OS启动I/O操作,I/O操作完成引发第二次中断
10、有的指令(如MOV)可能会访问多个(三个)页的内存(一页指令,两页数据)
11、页表:通过有效无效位将条目设置为有效/无效
12、次级存储器:存储不在内存的页,一般为快速磁盘,即交换空间。
13、请求调页的关键是在页错误之后重新执行指令
14、性能:
设P为页错误的概率(0≤P ≤ 1),如果P等于0,则不存在页错误,如果P等于1,则每次访问都存在页错误:
有效访问时间(EAT)= (1-P)× 内存访问时间 + P×页错误时间
15、交换空间有两种使用方法:
①进程在创建时将整个文件镜像复制到交换空间中,并从交换空间进行按页调度
②从文件系统中按需调页,页置换时将页写入交换空间

三、写时复制

1、允许父子进程开始时共享同一页面,如果任一进程需要对该页进行写操作,则创建一个共享页的拷贝。所有非修改页会被父进程和子进程共享
2、写时复制需要的空闲页来自一个空闲缓冲池,该池中的页在分配前先填充0,以清除之前的内容

四、页面置换

1、给原有的页错误服务程序增加页置换,以防止内存的过度分配
2、只有被修改过的页才能写回到磁盘
3、页置换分开了逻辑内存与物理内存

(一)、基本页置换

①查找所需页在磁盘上的位置
②查找一个空闲帧,否则用页置换算法选择一个牺牲帧,将其写入磁盘,并改变页表与帧表
③将所需页写入空闲帧,改变页表与帧表
④重启进程,阻塞到就绪
1、通过修改位或者脏位来降低开销,表示是否需要重写到磁盘上的副本
2、需要开发帧分配算法与页置换算法,分别决定一个进程分配多少帧以及如何选择要置换的页
3、通过运行一个特殊字符串(引用串)来检验算法并计算页错误率

(二)、FIFO页置换

1、记录每个页进入内存的时间,并选择最老的页
2、Belay异常:页错误率可能会随着分配帧的数目的增加而增加,而不是一般情况下的降低

(三)、最优页置换,OPT/MIN

1、难以实现,需要引用未来的知识
2、是所有算法中产生页错误率最低的,且不会有Belay异常的情况
3、会置换最长时间内不会被使用的页(向前看

(四)、LRU页置换

1、最近最少使用算法,置换最长时间内没有被使用的页(向后看
2、可以通过为每一个页表项关联一个时间域,并给CPU增加一个计数器,每次内存引用,为对应页表项的时间域进行更新,置换最小的页
3、或者通过一个页码堆栈,每次将被引用的页从堆栈中删除并重新放回顶部,这样堆栈的顶部必定是最近使用的页,而底部为LRU页

(五)、近似LRU页置换

1、附加引用位算法:每页关联一个引用位,初始化为0,当页被引用的时候,改为被设置为1。引用位可以有多个,比方说有8位引用位,就表示着该页在最近8个时间周期内被使用的情况。而11000100比01110111的页更为最近使用。每次选择8位最小的一个页为LRU页,进行置换。
2、二次机会算法:基于FIFO算法。当选择时,检查引用位,如果为0则直接进行置换,否则会给第二次机会,并将引用位清零,到达时间设置为当前时间。

(六)、基于计数的页置换:

为每个页保留一个用于记录其引用次数的计数器,有两种算法:
①最不经常使用页置换算法
②最常使用页置换算法

五、帧分配

1、给每个进程分配最低数量的页,必须有足够的帧容纳所有单个指令所引用的页,而帧的最少数量是由计算机定义的。
2、指令是6字节,可能跨2页
3、要移动的字符的块和要移动到目的的区域也可能都要跨页。
4、有两种主要的分配方法:
①固定分配
②优先级分配

(一)、固定分配

1、有两种:
①平均分配
②按比例分配
2、每个进程所分配的数量会随着多道程序的级别而改变,多道程序的程度增加(内存中进程的数量增加),那么每个进程会失去一些帧来给新的进程

(二)、优先级分配

1、按优先级比例而不是进城大小来分配
2、如果一个进程产生了一个页错误,那么可以:
①从自身的帧中选择用于替换
②从比自身优先级低的进程中选取帧用于替换

(三)、全局分配与局部分配

1、全局置换:允许一个进程从所有帧集合中选择一个置换帧,而不管该帧是否已分配给其他进程;一个进程可以从另一个进程中取帧。
2、局部置换:要求每个进程仅从其自己的分配帧中进行选择

六、系统颠簸

1、如果一个进程没有足够的页,那么会一直忙于将页面换进换出,页错误率就会非常高。这会导致CPU使用率低,新的进程会加入到系统中来。
2、OS发现CPU使用率低,会加大多道程序程度,使更多进程加入到内存,使页错误率更高,最终系统无法完成工作
3、局部置换可以限制颠簸在进程之间传递与扩散,而不能解决
4、工作集合策略研究一个进程实际正在使用多少帧,定义了进程执行的局部模型。
5、当进程执行时,它从一个局部移向另一个局部。局部是一个经常使用页的集合。一个程序通常由多个不同局部组成,它们可能重叠。
6、当一个子程序(函数)调用的时候,就定义了一个新局部
7、局部是由程序结构与数据结构来定义的,如果分配的帧少于局部的大小,进程会颠簸

(一)、工作集合模型:基于局部性假设

1、定义工作集合窗口,检查最近a个页面的引用,即工作集合。如果正在使用,则保留,否则,会在上次引用的a个时间单位后删除
2、工作集合模型是程序局部的近似
3、精确度与a的大小有关,如果a太小,则不能包含整个局部。若太大,可能包含多个局部
4、WSSi (进程Pi的工作集) = 最近所引用的所有页面的总数(不同时刻值不同)
5、D = ∑WSSi 表示总的帧需求量。如果 D 大于可用帧数量,那么有的进程就得不到足够帧,从而会出现颠簸
6、这时可以悬挂某些进程,以消除颠簸现象
7、OS会跟踪每个进程的工作集合,并分配大于其工作集合的帧数。如果有空闲帧,则可以启动另一个进程
8、通过固定定时中断和义勇为,能够近似模拟工作集合模型

(二)、页错误频率

1、可以灵活地控制颠簸
2、如果实际的页错误频率太高,则分配更多的帧,如果太低,就可以从进程中拿走帧
3、如果太高而又没有可用的空闲帧,那么就选择一个进程进行暂停,将其的帧进行释放,并分配给错误率高的进程

七、其他考虑

1、页的大小如何选择:
①若考虑碎片,则需要小页
②若考虑页表大小,则需要大页
③若考虑I/O开销,则需要大页
④若考虑局部性,会有两个极端的矛盾。更小的页应用导致更少的I/O和更少的总的分配内存;而为了降低页错误数量,需要大页。
2、TLB范围:通过TLB可访问的内存量
3、在理想的时候,一个进程所有的工作集合均在TLB中

发布了205 篇原创文章 · 获赞 110 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40851744/article/details/103494577
今日推荐