【现代操作系统】之分页系统中的设计问题

为什么要进行分页系统设计

上一节中讲的各种页面置换算法是为了在发生缺页中断时进行快速高效地页面置换,但是只了解这些机制是不够的,这就像知道了一种编程语言的基本语法和成为一个优秀的程序员之间的区别。下面将谈论为了使系统达到较好的性能,操作系统设计者必须考虑的一些问题。

局部分配策略与全局分配策略

之前我们谈论的都是页面置换算法,那么如何为相互竞争的进程分配内存。
首先来考虑一个问题,如果一个进程发生了缺页中断,那么如何为它进行页面置换,是在分配给它的页面中寻找合适的页面,还是在全局寻找合适的页面,如果是局部,当工作集增大时,就会导致颠簸,如果工作集缩小,会造成内存浪费。因此全局算法通常比局部算法好。这是一种内存分配方法。
另一种是为进程分配页框的方法,也就是一开始为每一个进程分配固定数量的页框,但是这种方法很显然有问题,因为不同的进程需要的页框数是不一样的,因此我们会按照比例给进程分配相应数量的页框。如果使用全局分配算法,这种分配页框的构想是可以实现的,简单地来说就是根据进程的缺页中断率(PFF)来为进程分配相应数量的页框,这种分配要实时刷新,也就是说,当进程的缺页中断率提高时,系统就要为它分配更多的页框数(从那些缺页中断率可以接受的进程中剥夺)。

负载控制

当一个进程由于工作集的增大而发生颠簸,但是这时又没有进程有空闲的页框来被它剥夺,这个时候内存就发生了过载,为了解决这个问题,我们需要将一部分进程交换到磁盘来为其它进程腾出页框。
这里面涉及到一个两级调度的思想,在这种过载的情况下,一个调度程序用来进行进程的调入与调出,一个调度程序用来进行内存中进程的切换。

页面大小

大页面会导致过多内部碎片,小页面会导致过大页表,所以选择合适大小的页面是很重要的事情。

分离的指令空间和数据空间

指令空间和数据空间分别有自己的页表,分别完成从虚拟页面到物理页框的映射。

共享页面

在多道程序设计中,多个用户用一个程序是很常见的事情,显然,避免内存中有同一个页面的两个副本是一件很重要的事情,这就是共享页面要做的事情,但也不是所有页面都适合共享的,那些只读的程序文本页面适合共享,但是数据页面就不合适共享。如果系统支持指令空间和数据空间分离,那么共享程序将变得很简单。在一个比较典型的使用这种方式实现共享的例子中,页表
与进程表数据结构无关。每个进程在它的进程表中都有两个进程,一个指向I空间页表,一个指向D空间页表,当调度程序调度这些进程运行时,它使用这些指针来定位合适的页表。但是里面有一些问题,那就是当进程A和进程B共享一个程序文本页面时,如果进程A被撤销,那么按照前面的算法逻辑,它的页面也会被撤销,这样进程B就会发生缺页中断。因此当A结束时,发现它使用的是一个共享页表是一件很重要的事情,可以查找所有页表判定是否是共享页表,但这样代价太大,所以一般的做法是用专门的数据结构来记录共享页面。共享数据比共享代码麻烦,但也不是不可能,在UNIX中,通过fork系统调用,父进程和子进程要共享程序文本和数据文本,通常让这些进程拥有自己的页表,但都映射到同一个页面集合,而且这些数据页面是只读的,只有在发生写操作时才会进行页面的复制。

共享库

为什么要使用共享库,在前面我们知道进程可以共享页面,代码页面总是可读的,因此共享这种页面不存在任何问题,但是数据页面不同,依赖于不同的系统, 要么每个进程都有一个数据页面的私有副本,要么执行写时复制机制。现代操作系统中,程序常常会用到许多库,例如各种各样的图形库,如果这些库都被静态地与程序链接,那么程序将会十分庞大,而且装载进内存也十分耗时。有了共享库,这一问题得到解决。
共享库的机制:当程序被链接时,链接器不会加载被调用函数,而是加载一小段能够在运行时绑定被调用函数的存根例程(dll就是这个原理),如果库被其它进程加载入内存了,再次使用就不再需要加载了。值得注意,库不是一次全部加载的,而是用到什么加载什么,没有被调用的函数页面是不会被装载的。

内存映射文件

共享库其实是内存映射文件的一个特例。
内存映射文件的机制:进程可以通过一个系统调用将一个文件映射到其虚拟地址空间的一部分。程序员可以借助这种模型来将一个文件当做一个大字符数组来访问。进程间通信也可以通过共享内存来通信。

清除策略

当发生缺页中断时,系统要为进程从磁盘中置换页面进入内存,如果当前有许多空页框还好,但如果内存满了呢,这就要用到前面的页面调度算法选择页面将其置换出去。有些系统为了保证足够的空闲页框都拥有一个称为分页守护进程的后台进程,它大多数时间是睡眠的,定期被唤醒检查当前内存是否有足够的页框,如果不够就依据相应的页面置换算法进行内存清除,保证内存中有足够的空闲页框。虚拟内存接口

虚拟内存接口

大多数情况下,进程和程序员是不回去关心虚拟内存的实现的,他们所看到的是一个有用很大的地址空间的虚拟内存,但有时候,我们还是希望可以对内部的一些行为做出一些改变以增强程序的性能,比如说进程间共享内存实现通信或者是数据传输。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值