289-分页和分段

分页

大小不等的固定分区和大小可变的分区技术在内存的使用上都是低效的,前者会产生内部碎片,后者会产生外部碎片
但是,假如内存被划分成大小固定相等的块,且块相对比较小,每个进程也被分成同样大小的小块,那么进程中称为页的块可以指定到内存中称为页框的可用块。
在本次中将会看到,使用分页技术在内存中为每个进程浪费的空间仅仅是进程最后一页的一小部分形成的内部碎片,没有任何外部碎片。
图7-9说明了页和页框的用法。在某个给定的时间,内存中的某些页框正在被使用,某些页框是空闲的,操作系统维护空闲页框的列表。存储在磁盘上的进程A由4个页组成。当装入这个进程时,操作系统查找4个空闲页框,并将进程A的4页装入这4个页框中,如图7.9b页所示。进程B包含3页,进程C包含4页,它们依次被装入。然后进程B被挂起,并被换出内存。后来,内存中的所有进程被阻塞,操作系统需要换入一个新进程,即进程D,它由5个页组成。
现在没有足够的连续页框来保护进程D,这会阻止操作系统加载该进程吗???答案是否定的!!!
因为可以使用逻辑地址来解决这个问题。这时仅有一个简单的基址寄存器是不够的,操作系统需要为每个进程维护一个页表。页表给出了该进程的每一页对应页框的位置。在程序中,每个逻辑地址包括一个页号和在该页中的偏移量
简单分区的情况下,逻辑地址是一个字相对于程序开始处的位置,处理器把它转换成一个物理地址
分页中,逻辑地址到物理地址的转换仍然由处理器硬件完成,并且处理器必须知道如何访问当前进程的页表。给出逻辑地址(页号和偏移量),处理器使用页表产生物理地址(页框号,偏移量)。
继续当前的例子,进程D的5页被装入页框4、5、6、11和12。图7.10给出了此时各个进程的页表。进程每一页在页表中都有一项,因此页表可以很容易地按页号对进程的所有页进行索引(从0页开始)。每个页表包含内存中的用于保存相应页的页框的页框号。此外,操作系统为当前内存中未被占用、可供使用的所有页框维护一个空闲页框列表。
由此可见前面所述的简单分页类似于固定分区,它们的不同之处在于:采用分页技术的分区相当小,一个程序可以占据多个分区,并且这些分区不需要是连续的。
在这里插入图片描述
为了使分页方案更加方便,规定页的大小以及页框的大小必须是2的幂,以便容易地表示出相对地址
相对地址程序的起点和逻辑地址定义,可以用页号和偏移量表示。下图7-11给出了一个例子,这里使用的是16位地址,页大小为1KB,即1024字节。例如相对地址1502的二进制形式为0000010111011110。由于页大小为1KB,偏移量为10位,剩下的6位为页号,因此,一个程序最多由2^6=64页组成,每页为1KB。如图7-11b所示,相对地址1502对应于页1(000001)中的偏移量478(0111011110),它们可以产生相同的16位数0000010111011110。
使用页大小为2的幂的页的结果是双重的
首先,逻辑地址方案对编程者、汇编器和链接器是透明的。程序的每个逻辑地址(页号,偏移量)与它们的相对地址是一致的。其次,用硬件实现运行时动态地址转换的功能相对比较容易。考虑一个n+m位的地址,最左边的n位是页号,最右边的m位是偏移量。在图7-11b的例子中,n=6且m=10。地址转换需要经过以下步骤:
1、提取页号,即逻辑地址最左面的n位。
2、以这个页号为索引,查找该进程页表中相应的页框号k。
3、该页框的起始物理地址为k*2^m,被访问字节的物理地址是这个数加上偏移量。
物理地址不需要计算,可以简单地把偏移量附加到页框号后面来构造物理地址。
在这里插入图片描述
在前面的例子中,逻辑地址为0000010111011110,它的页号为1,偏移量为478,。假设该页驻留在内存页框6(即二进制000110)中,则物理地址页框号为6,偏移量为478,物理地址为0001100111011110,如图7.12a所示。
在这里插入图片描述
总之,采用简单分页技术,内存被分成许多大小相等且很小的页框,每个进程被划分成同样大小的页;较小的进程需要较少的页,较大的进程需要较多的页;当一个进程被装入时,它的所有页都被装入到可用页框中,并且建立一个页表。这种方法解决了分区技术存在的许多问题。

分段

细分用户程序的另一种可选方案是分段。采用分段技术,可用把程序和其相关的数据划分到几个段中。尽管段有一个最大长度限制,但并不要求所有程序的所有段的长度都相等。和分页一样,采用分段技术时的逻辑地址也是由两部分组成:段号和偏移量。
由于使用大小不等的段,分段类似于动态分区
在没有采用覆盖方案或者使用虚拟内存的情况下,为执行一个程序,需要把它的所有段都装入内存。与动态分区不同的是,在分段方案中,一个程序可以占据多个分区,并且这些分区不要求是连续的。分段消除了内部碎片,但是和动态分区一样,它会产生外部碎片。不过由于进程被分成多个小块,因此外部碎片也会很小。
分页对于程序员来说是透明的,而分段通常是可见的,并且作为组织程序和数据的一种方便手段提供给程序员
一般情况下,程序员或编译器会把程序和数据指定到不同的段。为了实现模块化程序设计的目的,程序或数据可能进一步分成多个段。这种方法最不方便的地方是程序员必须清楚段的最大长度限制。
采用大小不等的段的另一个结果是,逻辑地址和物理地址间不再具有简单的对应关系。类似于分页,在简单的分段方案中,每个进程都有一个段表,系统也维护一个内存中的空闲块列表。每个段表项必须给出相应的段在内存中的起始地址,还必须指明段的长度,以确保不会使用无效地址。当进程进入运行状态时,系统会把其段表的地址装载到一个寄存器中,由内存管理硬件来使用这个寄存器。考虑一个n+m位的地址,最左边的n位是段号,最右边的m位是偏移量。在图7-11c的例子中,n=4、m=12,因此最大段长度为2^12=4096。进行地址转换需要以下步骤:
1、提取段号,即逻辑地址最左边的n位。
2、以这个段号为索引,查找该进程段表中该段的起始物理地址。
3、最右边m位表示偏移量,偏移量和段长度进行比较,如果偏移量大于该段的长度,则这个地址无效
4、物理地址为该段的起始物理地址与偏移量的和
在该例子中,逻辑地址为0001001011110000,其中段号为1,偏移量为752,。假设这个段驻留在内存中,起始物理地址为0010000000100000,则相应的物理地址为0010000000100000+001011110000=0010001100010000,如图7.12b所示。
总之,采用简单分段技术,进程被划分成许多段,段的大小不需要相等。当一个进程被调入时,它的所有段都被装入内存的可用区域中,并建立一个段表。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值