请求分页存储管理方式

请求分页中的硬件支持
1.页表机制
●基本作用:地址转换
●增加页表字段,供程序在换入换出时参考
在这里插入图片描述
状态位P:用于指示该页是否已调入内存
访问字段A:记录本页在一段时间内被访问的次数
修改位M:该页在调入内存后是否被修改过
外存地址:指示该页在外存上的地址(物理块号)
2.缺页中断机构:
●缺页中断与其他中断的不同:
(1)在指令执行期间产生和处理中断信号
(2)一条指令在执行期间可能产生多次缺页中断
在这里插入图片描述
3.地址变换机构
在这里插入图片描述
内存分配策略和分配算法
1.最小物理块数的确定:
●保证进程正常运行所需的最小物理块数;
●与硬件结构有关,取决于指令的格式、功能和寻址方式。
2.物理块的分配策略:
●两种内存分配策略:
■固定分配:为进程分配的物理块数固定不变。
■可变分配:先为每个进程分配一定 数目的物理块,若发生缺页中断,再增加物理块数。
●两种置换策略:
■局部置换:只能将自己的某个内存页换出。
■全局置换:可将系统中任一进程的内存页换出。
●组合出以下三种适用策略:
■(1) 固定分配局部置换
■(2) 可变分配全局置换
■(3)可变分配局部置换
3.物理块分配算法:
●(1)平均分配算法
●(2)按比例分配算法:根据进程大小按比例分
配(Si/s)*m (m:物理块总数,S:各进程页面总数)
●(3)考虑优先权的分配算法:一-部分按比例分配;另一部分为优先权高的进程增加分配份额
调页策略
1.调入页面的时机:
●预调页策略:进程首次调入内存时,由程序员指出应该先调入哪些页。
●请求调页策略:进程运行中发生缺页时,提出请求,由OS将其所需页面调入内存。
2.确定从何处调入页面:
请求分页系统将外存分为两部分:
文件区(离散分配)、 对换区(连续分配)
●发生缺页请求时,有以下三种情况:
系统拥有足够的对换区空间
系统缺少足够的对换区空间
UNIX方式
3.页面调入过程:
①若发生缺页,便向CPU发出缺页中断
②中断处理程序保存CPU环境,转中断处理程序
③该程序查找页表,得到该页在外存中的块号
④若内存未满,启动磁盘I/O调入页面;若内存已满,先置换再调入
⑤修改页表项内容,并写入快表。

### 请求分页存储管理中的最佳面置换算法 在请求分页存储管理系统中,当所需面不在内存时会触发缺中断。此时如果内存已满,则需要选择一个面进行替换以便腾出空间加载新面。不同的面置换算法会影响系统的性能。 #### FIFO 面置换算法 最简单的面置换策略是先进先出(FIFO),即总是移除最早进入内存的那个面。然而这种做法并不总能获得最优效果,在某些情况下可能会导致频繁的面交换现象,也被称为Belady异常[^1]。 ```python class FIFOPageReplacement: def __init__(self, capacity): self.pages = [] self.capacity = capacity def refer(self, page_number): if page_number not in self.pages: if len(self.pages) >= self.capacity: removed_page = self.pages.pop(0) print(f"Page {removed_page} replaced by Page {page_number}") self.pages.append(page_number) fifo = FIFOPageReference(3) for p in [7, 0, 1, 2, 0, 3, 0, 4]: fifo.refer(p) ``` #### LRU 面置换算法 最近最少使用(LRU)是一种更有效的面置换方案,它会选择过去一段时间内被访问次数最少且距离当前时间最长未使用的面作为牺牲品。尽管LRU实现了较好的命中率,但在实际应用中由于记录每一最后访问时刻的成本较高,因此常用近似实现方式如栈模拟法或计数器机制来简化操作[^2]。 ```python from collections import OrderedDict class LRUPageReplacement: def __init__(self, capacity): self.cache = OrderedDict() self.capacity = capacity def get(self, key): if key not in self.cache: return -1 value = self.cache.pop(key) self.cache[key] = value # Move to end (most recently used) return value def put(self, key, value): if key in self.cache: self.cache.pop(key) elif len(self.cache) >= self.capacity: oldest = next(iter(self.cache)) del self.cache[oldest] print(f"Page {oldest} replaced by Page {key}") self.cache[key] = value lru = LRUPageReplacement(3) pages_sequence = ['A', 'B', 'C', 'D', 'E'] for i in pages_sequence: lru.put(i,i) ``` #### OPT 面置换算法 理论上来说,OPT是最优(Optimal)面置换算法,因为它能够预测未来并永远做出最好的决策——即将永远不会再次使用或者离下次使用最远的一个面淘汰掉。不过显然这是无法做到完美预知未来的,所以仅限于理论研究价值。 对于寻找所谓的“最佳”算法而言,实际上并没有绝对意义上的最好选择,因为这取决于具体应用场景下的工作负载特性以及硬件资源情况等因素的影响。一般来说,LRU及其变种形式被认为是比较接近理想的解决方案之一,因其能在大多数情形下提供较高的缓存命中率同时保持相对较低的时间复杂度开销。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值