操作系统之分页分段
写在前面
分页和分段是共同进行的吗?
不是分段存储是不同于分页管理的另外一种管理方式
分页存储和分段存储 - katachi - 博客园 (cnblogs.com)
什么是内存碎片
空闲的空间比申请的空间小,导致小内存块不能被利用
什么是内存碎片 - 蒋闯 - 博客园 (cnblogs.com)
分页管理
逻辑地址分页 物理地址分块
大小是相等的
从0开始编号
页面大小选取过大或过小
过小:进程占据更多页面,从而花费更多的时间来换页
过大:容易造成内存碎片化
一般选取为4KB
假设32位系统,后12位为页内逻辑地址,前20为页号
页表-逻辑地址到物理地址的映射
页表也需要占据内存
它们占据连续内存,存储页号和块号(由于页号是连续的,因此这一维删除)
页表寄存器-存放页表物理地址的寄存器
存放页表始址和页表长度
默认想一想从逻辑地址求出物理地址
- 取出页号和页内偏移
- 访问页表寄存器,判断页表长度是否小于页号,是中断,否继续
- 拿到页表始址+页号*页表项的长度,得到该页对应的块号,
- 块号+页内偏移就是真正的物理地址
页表项的长度
就是页表中一项所占的内存
教科书上是4B
但不一定是4B,有些页表项还会存储控制位,比如读写控制只要1个bit
分段管理
分段比分页的好处
可能页表过大(页表项过多)没有那么大的一块连续的内存来存储该页表
分段存储是不固定每一段的大小
段号+段内偏移的组合,各占16bit
因此一个段最多就是4KB * 16的大小
段内偏移也是从0开始编号
同样映射有自己的段表,段表寄存器
默写分段存储下逻辑地址到物理地址的过程
- 拿到段号和段内偏移
- 去访问段表寄存器,拿到段表寄存器始址和长度
- 比较段表寄存器的长度是否小于短号,是中断,否继续
- 计算对应的段表项的内存地址 = 段表始址 + 段号 * 段表项长度
- 得到内存中该段的长度和始址
- 如果内存段长度小于段内偏移中断,否继续
- 计算具体内存地址 = 段号 + 段内偏移
分页管理和分段管理的区别
- 段页的大小是不固定的
- 段表是二维的,页表是一维的,不能理解
- 段内没有内部碎片,有外部碎片,页没有外部有内部
它们都需要两次访问内存