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