🌎个人主页:个人主页
☀️系列专栏:操作系统
连续分配 :为用户进程分配的必须是一个 连续的内存空间。
非连续分配 :为用户进程分配的可以是一些 分散的内存空间。
🍓思考:连续分配方式的缺点
考虑支持多道程序的两种连续分配方式:
1.固定分区分配:缺乏灵活性,会产生大量的内部碎片,内存的利用率很低。
2.动态分区分配:会产生很多外部碎片,虽然可以用“紧凑”技术来处理,但是“紧凑”的时间代价很高
🍒把“固定分区分配”改造为“非连续分配版本”
假设进程A大小为23MB,但是每个分区大小只有10MB,如果进程只能占用一个分区,那显然放不下。
解决思路:
如果允许进程占用多个分区,那么可以把进程拆分成10MB+10MB+3MB三个部分,再把这三个部分分别放到三个分区中(这些分区不要求连续) ..进程A的最后一个部分是3MB,放入分区后会产生7MB的内部碎片。
如果每个分区大小为2MB,那么进程A可以拆分成11 * 2MB+1MB共12个部分,只有最后一部分1MB占不满分区,会产生1MB的内部碎片。显然,如果把分区大小设置的更小- -些,内部碎片会更小,内存利用率会更高。
这就引出了:
基本分页存储管理的思想一一把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分
💧什么是分页存储
将内存空间分为一个个 大小相等的分区 (比如:每个分区 4KB),每个分区就是一个“ 页框 ”( 页框 = 页帧 = 内存块 = 物理块= 物理页面 )。每个页框有一个编号,即“ 页框号 ”( 页框号= 页帧号 = 内存号 = 物理块号 = 物理页号 ),页框号 从 0 开始 。
将 进程的逻辑地址空间 也分为 与页框大小相等 的一个个部分, 每个部分称为一个“ 页 ”或“ 页面 ” 。每个页面也有一个编号, 即“ 页号 ”,页号也是 从 0 开始 。
Tips :初学易混 —— 页、页面 vs 页框、页帧、物理页 页号、页面号 vs 页框号、页帧号、物理页号
操作系统 以页框为单位为各个进程分配 内存空间。进程的每个 页面分别放入一个页框中。也就是说,进程的 页面 与内存的 页框 有 一一对应 的关系。 各个页面不必连续存放,可以放到不相邻的各个页框中。
(注:进程的最后一个页面可能没有一个页框那么大。也就是说,分页存储有可能产生内部碎片,因此 页框不能太大,否则可能产生过大的内部碎片造成浪费 )
🍓如何实现地址的转换
如何确定一个逻辑地址对应的页号、页内偏移量?
在某计算机系统中,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址 110 对应的页号、页内偏移量是多少?
总结:页面大小 刚好是 2 的整数幂有什么好处?
①逻辑地址的拆分更加迅速——如果每个页面大小为 2KB,用二进制数表示逻辑地址,则末尾 K 位即为页内偏移量,其余部分就是页号。因此,如果让每个页面的大小为 2 的整数幂,计算机硬件就可以很方便地得出一个逻辑地址对应的页号和页内偏移量,而无需进行除法运算,从而提升了运行速度。
②物理地址的计算更加迅速——根据逻辑地址得到页号,根据页号查询页表从而找到页面存放的内存块号,将二进制表示的内存块号和页内偏移量拼接起来,就可以得到最终的物理地址。
🍒逻辑地址结构
分页存储管理的 逻辑地址结构 如下所示:
地址结构包含两个部分:前一部分为页号,后一部分为页内偏移量 W 。在上图所示的例子中,地址长度为 32 位,其中 0~11 位 为“ 页内偏移量 ”,或称“ 页内地址 ”; 12~31 位为“ 页号 ”。
如果有 K 位表示“页内偏移量”,则说明该系统中一个页面的大小是 2^K个内存单元
如果有 M 位表示“页号”,则说明在该系统中,一个进程最多允许有 2^M 个页面
🥦重要的数据结构——页表
为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。
注:页表通常存在PCB(进程控制块)中
问题一:每个页表项占多少字节?