操作系统内存分配管理相关习题2

在进程装入或换入主存时,若内存中有多个足够大的空闲块,则操作系统必须确定分配内存块给进程使用,这就是动态分区的分配策略。考虑以下几种算法:
• 首次适应 (First Fit)算法。空闲分区以地址递增的次序链接。分配内存时,从链首顺序查找,找到大小能满足要求的第一个空闲分区分配给作业。
• 邻近延应(Next Fit)算法。又称循环首次适应算法,由首次适应算法演变。不同处是分配内存时从上次查找结束的位置开始继续查找。
• 最佳适应(Best Fit)算法。空闲分区按容量递增的次序形成空闲分区链,找到第一个满足要求且最小的空闲分区分配给作业,避免“大材小用”。
• 最坏适应(Worst Fit)算法。空闲分区以容量递减的次序链接,找到第一个能满足要即最大的分区,从中分割一部分存储空间给作业

算法算法思想分区排列顺序优点缺点
首次适应从头到尾找适合的分区空闲分区以地址递增次序排列综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序对分区表或分区链表的重新排序和查找消费
最佳适应优先使用更小的分区,以保留更多大分区空闲分区以容量递增次序排列会有更多的大分区被保留下来,更能满足大进程需求会产生很多太小的、难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序
最坏适应优先使用更大的分区,以防止产生太小的不可用的碎片空闲分区以容量递减次序排列可以减少难以利用的小碎片大分区容易被用完,不利于大进程;算法开销大(原因同上)
邻近适应由首次适应演变而来,每次从上次查找结束位置开始查找空闲分区以地址递增次序排列(可排列成循环链表)不用每次都从低地址的小分区开始检索。算法开销小(原因同首次适应算法)会使高地址的大分区也被用完
页面和页表
  1. 页面

    1. 页面和物理块
      将逻辑地址空间分成若干大小相等的片,称为页面或页,页号从0开始
      内存空间分成与页大小相同的若干存储块,称为物理块或页框。也是从0开始编号
      最后一个页不满,称为页内碎片
    2. 页面的大小
      应是2的幂,通常为512B-8KB,不宜过小,不宜过大
  2. 地址结构
    ![[Pasted image 20241201194726.png]]

    位移量d,也就是页内地址
    地址长度为32位,每页大小为4KB= 2 12 2^{12} 212,地址空间最多 2 20 = 1 M 2^{20}=1M 220=1M个页
    若逻辑地址为A,页面大小为L,则页号P和页内地址d可按下式求得:
    页号:P=int(A/L)
    页内地址:d=A mod L

  3. 页表
    系统为每个进程建立一张页表,记录了相应页在内存中对应的物理块号,实现从页号到物理块号的地址映射

地址变换机构
  1. 基本的地址转换机构
    页表驻留在内存中,设置一个页表寄存器存放页表在内存中的始址。
    ![[Pasted image 20241126194741.png]]

例题

  1. 设有一页式存储管理系统,向用户提供的逻辑地址空间最大为16页,每页2048B,内存总共有8个存储块。试问逻辑地址至少应为多少位?内存空间有多大?
  2. 在一分页存储管理系统中,逻辑地址长度为24位,页面大小为4096B,现有一逻辑地址为2FA6H,且第0、1、2页依次存放在物理块10、12、14中,问相应的物理地址为多少?

  1. 具有快表的地址转换机构
    由分页系统的地址转换可知,每存取一个数据,要访问2次内存,计算机处理速度降低近1/2
    为提高地址转换速度,在MMU中增设一个具有并行查寻能力的特殊高速缓冲寄存器,称为联想寄存器 (Associative Memory),或称快表。在IBM系统中称TLB(Translation Lookaside Buffer),用于存放当前访问的那些页表项。
    此时的地址变换过程是: 送-比较-有则直接访问or没有(读慢表、把对应块号送、修改快表

命中:访问1次内存
不命中:2次访存,慢表(内存中)+目标单元(内存)
快表计算题:有无快表访问时间对比(2个时间:t1=10,t2=100)

MMU将页号送入高速缓存,将此页号与高速缓存中所有页号比较,若有匹配的页号,则将其对应的块号送物理地址寄存器中;
若在快表中未找到对应的页表项,则还需访问内存中的页表,找到后,把从页表项中读出的块号送物理地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,亦即修改快表。如果快表已满,则OS必须淘汰一个老的页表项。
![[Pasted image 20241126194940.png]]

为什么引入二级页表

当进程数量非常多时,页面数据非常多,且页面在内存中,占用内存空间太大,从而导致内存利用率很低

为什么要引入分段存储管理方式

满足用户和程序员的需要

  1. 方便编程
    通常用户把自己的程序按逻辑关系分为若干个段,每段都从0开始编址,并有自己的名字和长度。因此,希望要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的
  2. 信息共享
    在实现对程序和数据的共享时,是以信息的逻辑单位为基础的,比如,共享某个例程和函数。分页系统中的“页”只是存放信息的物理单位(块),并无完整的意义,不便于实现共享;而段却是信息的逻辑单位
  3. 信息保护
    信息保护同样是对信息的逻辑单位进行保护,因此,分段管理能更有效地实现信息保护功能
  4. 动态增长
    在实际应用中,往往有些段,特别是数据段,在使用过程中会不断增长,而事先又无法确切地知道数据段会增长到多大。前述的其它几种存储管理方式,都难以应付这种动态增长的情况,而分段存储管理方式却能较好地解决这一问题
  5. 动态连接
    动态链接是指在作业运行之前,并不把几个目标程序链接起来。要运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中需要调用某段时,才将该段(目标程序)调入内存并进行链接。可见,动态链接也要求以段作为管理的单位
分段系统的基本原理
  1. 分段
    作业地址空间划分成若干段,每段定义了一组逻辑信息
    ![[Pasted image 20241201232010.png]]

    每个段都有名字。为实现简单,常用段号代替段名(段号从0开始)
    每个段内都从0开始编址,并采用一段连续的地址空间。由于分多个段,所以地址是二维的,亦即逻辑地址由段号S和段内地址W组成。具体结构举例如下
    ![[Pasted image 20241201232250.png]]

    该地址结构中允许作业最多有4K( 2 12 2^{12} 212)个段,每段最大长度为1MB( 2 20 2^{20} 220)
    ![[Pasted image 20241126200022.png]]

    每访问一个数据,要访问两次内存,速度减慢1/2。但段表存于联想存储器中时,比没有地址变换的常规存储器存取速度仅减慢10%~15%

信息共享

分段系统的一个突出优点,是易于实现段的共享,即允许若干个进程共享一个或几个段,且对段的保护也十分简单易行。分页系统虽然也能实现程序和数据的共享,但远不如分段系统方便
![[Pasted image 20241202093913.png]]

分页系统共享editor
![[Pasted image 20241202093929.png]]

分段系统共享editor
共享的editor是可重入代码,又称为“纯代码”,是一种允许多个进程同时访问的代码。可重入代码在执行中不允许有任何改变

段页式存储管理方式

分页系统能有效地提高内存利用率
分段系统能很好地满足用户的需要
取长补短段页式存储管理

  1. 基本原理
    先将用户程序分成若干段,再把每段分成若干页
    逻辑地址由3部分组成:段号、段内页号、页内地址
    ![[Pasted image 20241202094231.png]]

    利用段表和页表实现地址映射
    ![[Pasted image 20241202094431.png]]

  2. 地址变换过程
    需配置一个段表寄存器,其中存放段表始址、段表长度
    ![[Pasted image 20241126200430.png]]

    访问3次内存:第一次,段表;第二次,页表;第三次,取出指令或数据

地址空间二维
段式管理方式按照用户进程中的自然段划分逻辑空间
用户进程由主程序段,两个字程序段,栈段和数据段组成,可以把这个用户进程分为5段,每段从0开始编址,并分配一段连续的地址空间,段内要求连续,段间不要求连续,因此整个作业是二维的,其逻辑地址由段号S与段内偏移量W两部分组成
![[Pasted image 20241202145141.png]]

段号为16位,段内偏移量为16位,因此一个作业最多有 2 16 = 65536 2^{16}=65536 216=65536段,最大段长为64KB

配置段表后,执行中的进程可通过查找段表,找到每段所对应的内存区。可见,段表用于从逻辑段到物理内存区的映射
![[Pasted image 20241202150907.png]]

与页式管理不同,段式管理不能通过给出一个整数便确定对应的物理地址,因为每段的长度是不
固定的,无法通过整数除法得出段号,无法通过求余得出段内偏移,所以段号和段内偏移一定要
显式给出段号,段内偏移
因此分段管理的地址空间是二维的

  1. 地址变换机构
    为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址F和段表长度M。从逻辑地址A到物理地址E 之间的地址变换过程如下:
    ![[Pasted image 20241202151654.png]]

  2. 从逻辑地址A中取出前几位为段号S,后几位为段内偏移量W。注意,在地址变换的题目中,要注意逻辑地址是用二进制数还是用十进制数给出的。

  3. 比较段号S和段表长度M,若S≥M,则产生越界中断,否则继续执行。

  4. 段表中段号S对应的段表项地址 = 段表始址F + 段号S x 段表项长度,取出该段表项的前几位得到段长C。若段内偏移量≥C,则产生越界中断,否则继续执行。从这句话我们可以看出,段表项实际上只有两部分,前几位是段长,后几位是始址。

  5. 取出段表项中该段的始址b,计算E = b + W,用得到的物理地址E去访问内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值