分段存储管理概述:逻辑地址空间划分与地址变换过程
一、分段存储管理概述分段存储管理是一种存储管理方式,它会将逻辑地址空间划分成若干段,每一段都代表一个逻辑上完整的实体,像是主函数、库函数等。这种管理方式与分页存储管理不一样,它更有利于程序的共享和保护。
分段存储管理的核心是段表,段表记录着逻辑段跟物理内存的映射关系,段表的结构涵盖以下三个部分:
段号用于标识逻辑段的编号,段的起始地址指的是该段在物理内存中的起始位置,段长用于记录该段的长度,其作用是防止越界访问,这就是地址变换过程。
分段存储管理借助地址变换机构来达成逻辑地址到物理地址的转换。逻辑地址由两部分构成,一部分是段号,另一部分是段内偏移量。
地址变换过程如下:首先检查段号是否小于段表长度,若大于则触发越界中断;接着根据段号查找段表,获取段的起始地址和段长;然后检查段内偏移量是否小于段长,若大于则触发越界中断;最后将段的起始地址与段内偏移量相加,得到物理地址。
<p><pre> <code class="python"># 示例代码:分段存储管理的地址变换
进行段地址转换,该转换操作使用段表、段号以及偏移量,
如果片段编号大于或等于片段表的长度 ,
引发异常,内容为“越界中断:段号超出段表长度”
segment_info等于segment_table中索引为segment_number的元素 。
base_address等于segment_info中的base,segment_length等于segment_info中的length 。
if offset >= segment_length:
引发异常,内容为“越界中断:段内偏移量超出段长”。
物理地址等于基地址加上偏移量 。
return physical_address
# 示例段表
段表 = [{'基地址': 8192, '长度': 500}, {'基地址': 10240, '长度': 1000}]
物理地址等于段地址转换,转换依据段表,参数为0和100 。
打印,物理地址为,{physical_address} 。
</code></pre></p>
二、分页与分段的区别
分页是一种常见的存储管理方式,分段也是一种常见的存储管理方式,它们有相似的地方,同时也存在显著的区别。
2.1 相似点2.2 不同点特性分页存储管理分段存储管理
单位性质
物理单位,满足系统需求
逻辑单位,满足用户需求
大小
固定大小(如2K、4K、8K)
长度不固定,取决于用户程序
地址结构
一维地址(页号+页内地址)
二维地址(段号+段内地址)
三、段页式存储管理
https://img0.baidu.com/it/u=1127132875,3944842059&fm=253&fmt=JPEG&app=138&f=JPEG?w=533&h=462
段页式存储管理具有更灵活的特点,它结合了分页的优点,也结合了分段的优点,是一种存储管理方式。
基本原理把用户程序划分成若干段,每个段再进一步划分成若干页,逻辑地址由段号、页号和页内地址这三部分组成。地址变换过程
段页式存储管理的地址变换过程更加复杂,要访问段表两次,还要访问页表两次,具体步骤如下:
查找段表以获取页表的起始地址,根据段号进行查找。查找页表以获取物理块号,依据页号来查找。把物理块号与页内地址相加,从而得到物理地址。
<p><pre> <code class="c">// 示例代码:段页式存储管理的地址变换
#include <stdio.h>
定义一个名为segment_table的数组,它有3个元素,分别是100、200、300,此数组用于存储页表起始地址,即段表 。
定义一个二维数组page_table,它有3行4列,用于存储物理块号
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int main() {
int segment_number = 1; // 段号
int page_number = 2; // 页号
定义一个整型变量offset,其值为100,该值表示页内地址 。
获取页表起始地址,将其赋值给变量page_table_base,该地址通过segment_table数组中segment_number索引处的值获取 。
获取物理块号,将其赋值给变量frame_number,通过page_table数组中segment_number索引处的数组,再利用该数组中page_number索引处的值来得到 。
计算物理地址,将帧号乘以1024,再加上偏移量,得出物理地址的值并赋值给变量physical_address 。
输出“物理地址: ”,紧跟着物理地址的值,再换行
return 0;
}
</code></pre></p>
四、页面置换算法
页面置换算法可用来解决内存不足时的页面替换问题,常见的算法有最佳置换算法,还有先进先出(FIFO)算法,以及最近最久未使用(LRU)算法。
4.1 最佳置换算法4.2 先进先出(FIFO)
<p><pre> <code class="python"># 示例代码:FIFO页面置换算法
https://img2.baidu.com/it/u=1920688852,204013443&fm=253&fmt=JPEG&app=138&f=JPEG?w=513&h=500
定义一个名为fifo_page_replacement的函数,该函数有两个参数,分别是pages和frame_size 。
memory = []
page_faults = 0
for page in pages:
if page not in memory:
if len(memory) < frame_size:
memory.append(page)
else:
memory.pop(0)
memory.append(page)
page_faults += 1
return page_faults
# 示例页面访问序列
pages =
frame_size = 3
faults = fifo_page_replacement(pages, frame_size)
print(f"缺页次数: {faults}")
</code></pre></p>
4.3 最近最久未使用(LRU)五、FAQ问题 答案
1. 分段存储管理的优点是什么?
分段存储管理会把逻辑上完整的实体进行划分,划分的结果是形成段,这种方式有利于程序的共享,也有利于程序的保护。
2. 分页与分段的主要区别是什么?
分页属于物理单位,分段属于逻辑单位,分页的大小是固定的,分段的长度是不固定的。
3. 段页式存储管理的地址变换过程需要访问内存几次?
需要访问内存三次:段表、页表和物理地址。
4. 什么是现象?
现象是指,在分配更多内存页的时候,缺页率却反而升高的一种异常现象,这种现象常见于FIFO算法。
5. LRU算法的实现原理是什么?
LRU算法会记录页面的最近访问时间,它会淘汰最近最久未使用的页面。
页:
[1]