操作系统-内存管理-基本分段内存管理方式

来源:互联网 发布:海贼王索隆的刀淘宝 编辑:程序博客网 时间:2024/05/17 04:11

操作系统-内存管理-基本分段内存管理方式


1.基本分段内存管理的引入

引入分页内存管理方式的目的是提高内存空间利用率,而引入分段内存管理的目的是满足程序员在编程和使用上的多方面要求:

  1. 方便编程:用户可以把自己的作业按照逻辑关系划分为若干个段,而且每一个段的地址都是从0开始编址的,并且具有自己的段名和长度。逻辑地址是由段名(段号)和段内偏移量(段内地址)组成的。
  2. 信息共享:在实现对程序和数据的共享时,是以信息的逻辑单位为基础的,而段恰恰是这样的逻辑单位(页只是存放信息的物理块,并无实际的含义)。
  3. 信息保护:在实现对信息的保护时,也是以信息的逻辑单位为基础的。
  4. 动态增长:在实际的应用中,有些段(数据段)会随着程序的运行而不断的动态增长,而且事前不知道数据段会增长到多大。
  5. 在运行时动态链接中,主程序会在运行过程中调用某段时才将该段调入内存并进行链接。可见运行时动态链接也要求以段作为内存管理单位。

2.基本分段内存管理

  • 在分段内存管理中,作业的地址空间被划分成若干个段,每个段定义了一组逻辑信息(即对每个段的数据进行分类,比如主程序段MAIN,子程序段X,数据段D,堆栈S)。
  • 每个段都有自己的段名,段名对应着一个段号,并且每个段都从0开始编址。
  • 每个段都有一段连续的地址空间。
  • 每个段的长度由相应的逻辑信息组决定,因而每个段的长度不同。
  • 整个逻辑地址空间有多个从0开始编址的段,所以逻辑地址空间是二维的。
  • 逻辑地址=段号(段名)+段内地址。
  • 很多的编译程序会自动的按照源程序的情况产生若干个段。
  • 装入程序会装入这些段并未每个段赋予段号。
  • -

2.1.段表

  • 为了能在物理内存中找到各个逻辑段的位置,需要为每一个进程建立一张段表。
  • 每一个段表中的表项记录了该段在内存中的起始地址和段的长度。
  • 段表相当于页表,可以实现逻辑地址到物理地址的转换。

2.2.地址变换

  • 段表页可以使用TLB存储来提高地址转化的速度。
  • 段一般比页大,所以段表项的数目会比页表项的数目少很多,所需要的TLB的存储空间也会少很多。
  • 地址变换步骤:
(1)地址变换机构自动将逻辑地址分为段号和段内地址。(2)将段号与段表长度进行比较,若段号大于等于段表长度,则触发越界中断。(3)以段号为索引检索段表获取段表项。段表项的位置 = 段表始址+(段号*段表项长度)。(4)从获取的段表项中得到分段基址和分段的段长。(5)将段内地址与段长进行比较,若段内地址大于段长,则触发越界中断。(6)将段基址与段内地址相加即可得到物理地址。

2.3.分页和分段的区别

  1. 页是信息的物理单位,分页的目的是为了消除零头(碎片),进而提高内存空间利用率。分页仅仅系统管理内存的需要,而不是用户的需要;段是信息的逻辑单位,它能够更好的满足用户的需求。
  2. 页的大小是由系统决定的;而段的大小取决于用户编写的程序。
  3. 分页的逻辑地址空间是一维的,程序员在程序设计时只需利用一个记忆符(这个记忆符是啥我暂时不太了解)即可表示一个地址;段的逻辑地址空间是二维的,程序员在程序设计时需利用段名和段内地址才可表示一个地址。
原创粉丝点击