操作系统学习笔记(9)——分段存储管理机制
1、逻辑分段与内存分段
- 段是用户编制的程序可以由一个主程序、若干个子程序、符号表、栈以及数据等若干段组成,每一段都有独立、完整的逻辑意义,每一个段的长度可以不同
- 逻辑分段
- 程序通过分段(segmentation)划分为多个模块,每个段定义一组逻辑信息。如代码段(主程序段main,子程序段X)、数据段D、栈段S等。
- 每段有自己的名字(一般用段号做名),都从0编址,可分别编写和编译。
- 装入内存时,每段赋予各段一个段号。
- 段是用户编制的程序可以由一个主程序、若干个子程序、符号表、栈以及数据等若干段组成,每一段都有独立、完整的逻辑意义,每一个段的长度可以不同
- 地址结构:段号 + 段内地址。 段表:记录每段实际存放的物理地址。
- 内存划分
- 内存空间按需划分为若干个长度不相同的物理段
- 每个物理段由起始地址和长度确定
- 每段在内存中占据连续空间,段间可以不连续存放
2、分段存储的管理表格
- 段表
- 概念:分段存储管理系统为每个段分配一个连续的分区,进程的各个段可离散地装入内存的不同位置,用一张段映射表(段表)记录每段在内存的起始地址(基址)和段的长度。在配置了段表后,执行中的进程可通过逻辑地址中的段号来查询段表,找到段的对应内存区。
- 特点:每个进程一张段表,给出逻辑段和物理段对应关系;段表放在内存,属于进程的现场信息;段表在进程装入内存时,根据内存分配情况建立
-
- 表项包括:段号、段长、基地址
- 根据段表段的分配方式以段为单位进行主存分配,每段在主存中占有一个连续空间;如果在装入某段信息时找不到满足该段地址空间大小的空闲区则采用移动技术合并分散的空闲区,有利于大作业的装入
- 段表和页表一样存在主存中,访问数据或指令至少需要访问两次,为了提高对段表的存取速度,增设了一个相联寄存器(CPU内部),利用高速缓冲寄存器保存最近常用的段表项。
- 硬件支持
- 段表始址寄存器:用于保存正在运行进程的段表的始址
- 段表长度寄存器:用于保存正在运行进程的段表的长度
3、分段存储的地址转换
- 步骤:
- 段表送入段表控制寄存器中
- 执行指令:找到相应段表
- 判断:段号>段表长度?大于则地址越界,小于等于
- 由逻辑地址中的段号得到段表中的基址(起始地址)判断:逻辑地址中段内地址>段表中段长
- 大于则地址越界,反之,物理地址=起始地址+段内地址(做加法)
- 例设某程序中有5个段,段号分别为0-4,段表如下,求:1)段2字节53的物理地址,2)段3字节852的物理地址,3)段0字节1222的物理地址
- 4300+53=4353
- 200+852=4052
- 1222>1000,越界中断!
- 注意的是,物理地址=起始地址+段内地址(做加法)
4、分页和分段存储比较
- 两者主要区别:
- 段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的。
- 页的大小固定不变,由系统决定。段的大小是不固定的,它由其完成的功能决定。
- 段式向用户提供的是二维地址空间,页式向用户提供的是一~维地址空间,其页号和页内偏移是机器硬件的功能。
- 由于段是信息的逻辑单位,因此便于存贮保护和信息的共享,页的保护和共享受到限制。
- 分页存储特点
- 优点:解决了碎片问题;便于管理;
- 缺点:不易实现共享;不便于动态链接。
- 分段存储特点
- 优点:便于动态申请内存;段表长度较短;便于共享;便于动态链接;
- 缺点:产生碎片;不易扩展。
5、段页式存储管理方案
- 结合页式段式优点,克服二者的缺点
- 按逻辑关系划分用户程序为若干逻辑段
- 按分页存储管理机制划分和分配内
- 由段号、段内页号和页内地址三项共同构成地址
- 基本实现思路:段页式存储管理为每一个装入内存的作业建立一张段表,对每一段建立一张页表; 段表的长度由作业分段的个数决定,段表中的每一个表目指出本段页表的始址和长度; 页表的长度则由对应段所划分的页面数所决定,页表中的每一个表目指出本段的逻辑页号与内存物理块号之间的对应关系。
- 逻辑地址中的段号S首先和段表长度比较,若未越界则根据S和段表基址找到相应段表项中纪录的该段所在页表基址,接着使用段内页号P获得对应页面的页表项位置,从中找到页号对应的块号,最后拼接上页内地址W得到数据的物理地址。
- 例:在一个采用段页式存储管理的系统中,页的大小为1KB。某个正在执行的作业情况如下:(1)请给出将逻辑地址(2,3500)转换成物理地址的过程;(2)计算出上述逻辑地址对应的物理地址的值。
- 逻辑地址中的段号 2 跟段表控制寄存器中的段表长 3 进行比较,由于 2<3 ,故段号没有越界;
- 根据段表控制寄存器中的段表起始地址加上段号 2 ,找到段表中对应于第 2 段的段表项,从而得到第 2 段的页表长度和页表起始地址;
- 根据段内偏移 3500 得到段内页号为 3 ,3500/1kb。页内偏移为 428 ,3500mod1kb。
- 把段内页号 3 和段表项中的页表长度 5 进行比较,得知页号没越界;
- 由页表起始地址和页号得到对应的页表项,从而得到第 2 段的第 3 页对应的物理块号 是30 ;
- 物理块号 30 和块内偏移 428 拼接成物理地址 31148 。
- 显然地址转换过程中需要三次访问内存
- 第一次:访问段表,获得页表始址
- 第二次:访问页表,获取块号,获得指令或数据的物理地址
- 第三次:按物理地址存取信息
- 分段需要大家注意的是,分段有助于实现将段与对其对应的保护机制相关联。现代OS中,指令不可自我修改,故指令段只能定义为只读或只执行,内存映射硬件会检查段表项中的保护位,以防止对内存的非法访问(对只读段的写将代码段视为数据等)。数据则放在特定数组中,当需要访问数据时会对数组下标进行检测,超界时会产生越界中断。
6、信息共享(了解)
- 在每个进程的段表中对多进程共享的可重入代码设置一个段表项,当需要使用这部分代码时,应保证在执行时不会修改它,每个进程的私有数据和局部变量必须使用独立的段保存且不提供共享。
- 可重入代码(纯代码) :允许多个进程同时访问的代码,且为保证每个进程所执行的代码完全相同,决不允许执行过程中修改代码。
- 分页系统信息共享:使用可重入代码时,各进程的部分逻辑页面将被映射到可重入代码使用的各帧中,但其私有数据和局部变量所使用的帧则各不相同,且所有这些页面和帧的对照关系需要存入页表(长度可能会极大)。
- 分段系统信息共享:使用可重入代码时,只需在段表中为其设置一个段表项,并将执行时用到的部分数据copy到局部数据区,用来支持对执行时不可避免的代码修改的支持即可。