算法精解二十三(C语言版)

来源:互联网 发布:mac淘宝不能上传图片 编辑:程序博客网 时间:2024/05/16 00:36

使用链表的例子:页帧管理

在一些支持虚拟内存的系统中有关与链表的一种应用.细腻内存是一种地址空间的映射机制,它允许进程(运行的程序)不必完全加载到物理内存(系统的实际内存)中也可以得到运行.这种方式的一个优点是进程可以使用比系统实际所允许的物理内存大得多的地址空间.另一个优点是多个进程能够共享系统的内存以并发的方式执行.

运行的虚拟内存机制下的进程需要处理虚拟地址.这些地址对于进程来说就像是物理地址一样.但使用前必须有操作系统做转换.采用由专门的硬件所支持的页表来快速执行地址转换的工作.每一个进程都有它自己的页表.将他的虚拟地址空间中的页映射到物理内存中的页帧上.当某个进程引用一个虚拟地址时,页表中的某项需要检查并决定该页关联到哪个物理页帧上(见图5-5).当进程引用一个不再物理页帧上的虚拟地址时,会导致系统产生一个也错误并为之在物理内存中分配一个页帧为什么进程的页面会从物理内存中移除是另一个问题。一种导致进程移除的场景是;当访问某个页面的频率同其他页面相比很低时,而且在别处用到该页帧倾向下。


下面这个例子就是针对刚刚描述过的页帧管理所设计的,因此,将将介绍两个函数,alloc_frame和free_frame(见示例5-3).alloc_frame和freee_frame采用链表维护可供分配的页帧。函数alloc_frame从空闲页帧链表中获取空闲页帧号。给定某个特定的页,将页帧号放到页表中来检查该页面应该对应哪个物理页帧。一旦某个页面从物理内存中移除后。函数free_frame接受一个页帧并将其放回的到空闲页帧链表中。这两个函数假定在执行之前,操作系统已经将所有的空闲页帧都插入空闲页帧链表中了。稍后在本章关于循环链表的例子中将看到,当空闲页帧列表为空时调用alloc_frame会发生什么。

用链表来管理页帧是一种非常好的方法,因为页帧的分配将涉及频繁的查urhe删除操作,而且这些操作都发生在链表头。alloc_frame和free_frame的运行时复杂度O(1),因为这个两个函数都分别只是简单地调用list_rem_next以及list_ins_next,而这两个函数在前面已经分析过了,它们都是复杂度O(1)的操作。



0 0
原创粉丝点击