操作系统第三章:内存
学完本章需要回答的几个问题
- 内存按字节/字编址,地址和实际存储的区别?
- 从写程序到运行的过程?链接的三种方式、装入的三种方式以及区别?
- 进程的内存映射
- 内存管理:内存空间的分配与回收、扩充、存储保护、地址转换?
- 连续分区管理、分页存储管理、分段、段页、快表和多级页表等机制
- 虚拟内存的实现
- 内存映射文件
内存
4GB=4\*2^30\*Byte,即总共2的32次方个二进制位,就需要32位进行编址。
感到“浪费”?可能是误以为每个内存单元里都要额外存一下这 32 位的地址。地址存在 CPU 的寄存器里,或者存在 地址总线(电线) 上。
2和3 的区别是,2全链接时全装入内存,即装入时动态链接,3按需,则是运行时动态链接
内存管理
界地址寄存器判断逻辑地址;重定位寄存器判断实际物理地址
32位是指计算机用32二进制位编址,宏直接将值替换为指令
操作系统:空头支票(每个进程给一个如图所示的虚拟内存拉满),借尸还魂(Swap)
内存空间的扩充
ps,还有虚拟存储技术,在后文
内存空间的分配与回收
碎片本质上是不匹配
为什么高地址的大分区会被“消耗”?——扫描的均匀性导致“保护机制”丧失
在 First Fit 中,低地址起到了“挡箭牌”的作用。大多数小进程请求在低地址就被消化了,这有效地保护了高地址的大分区,使它们能够保持完整,留给后来的特大进程。 而在 Next Fit 中,查找指针一直在向后移动。无论请求的大小,它都会顺着内存地址往后找。这意味着高地址的大分区会被平等地发现并用于满足各种中小型请求。
基本分页存储管理
Cache:高速缓存;访存:访问内存;进程切换自动清理快表
为什么快表快?
单级页表存在的问题
最大需要多少字节/页框存储页表?
假设以下条件:
操作系统用32位表示内存地址,页框大小为4KB,页表项长度4B。
则页面大小 = 4KB = 212B,则用12位表示页内地址,剩下20位表示页号。
则一个用户进程最多有220个页表项,每个页表项长度4B,总页表长度 = 222B,即222/212=210个页框
注意为什么按10切分?
基本分段存储管理
段页式管理



思考:为什么分页管理是一维的,分段管理是二维的?段页式管理也是二维的?
思考:为什么段表项中不存储段表始址?
虚拟内存
预调页,调一批
传统,需要seek、read等指针
内存映射文件:操作系统负责读写,多个进程可以通过自己的虚拟地址空间,通过页表对应实际的物理内存
需要注意的是,操作系统并不是真的创建了一大批占用内存的空间,虚拟地址空间只是记了一笔账,真正读写时通过页表记录实际的物理内存块
操作系统第三章:内存
http://example.com/2025/12/31/操作系统第三章:内存/