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

知识点

存储分配管理方式
  • 连续分配方式
    分区管理方式
    1. 固定分区分配
    2. 动态分区分配
    3. 可重定位分区分配
  • 离散分配方式
    分页存储管理方式
    分段存储管理方式
    1. 段页式存储管理方式
      虚拟存储器
    2. 请求分页存储管理方式
    3. 请求分段存储管理方式
地址重定位
  1. 逻辑地址与物理地址
    目标程序使用地地址单元成为逻辑地址(相对地址或虚地址),一个用户作业的目标程序的逻辑地址集合称为该作业的逻辑地址空间。一维逻辑地址从0开始编号。二维逻辑地址各段内地址也从0开始
    主存中的实际存储单元编号称为物理地址(绝对地址或内存地址),物理地址的总体构成物理地址空间

  2. 重定位
    为了保证程序的正确运行,必须把程序和数据的逻辑地址转换为物理地址,这一工作叫做地址转换或重定位
    重定位可分为两种:静态重定位和动态重定位

  3. 静态地址重定位
    在装入一个程序时,把程序中的指令地址全部转换为绝对地址,地址转换工作是在作业执行前集中一次完成的,在作业执行过程中就无须再进行地址转换工作

  4. 动态地址重定位
    动态地址重定位是在程序执行过程中,在CPU执行每条指令时,将要访问的程序或数据地址转换为内存地址。动态重定位依靠硬件地址变换机构完成

程序的装入和链接

创建进程的第一件事,就是将程序和数据装入内存

将程序装入内存时

  1. 绝对装入方式
    在编译时,如果知道程序将驻留在内存的什么位置,那么,编译程序将产生绝对地址的代码
    绝对装入程序按照装入模块中的(绝对)地址,将程序和数据装入内存
    由于程序中的逻辑地址与实际内存地址完全相同,故装入时不需对程序和数据的地址进行修改
    只适用于单道环境
  2. 可重定位装入方式(静态重定位方式)
    在多道程序环境下,目标模块的起始地址通常是从0开始的,程序中的其他地址都是相对于起始地址计算的。此时应采用可重定位装入方式,根据内存的当前情况,将装入模块装入到适当位置
    在装入时,对目标程序中的指令和数据的地址作必要的修改——将逻辑地址改为绝对地址——静态重定位
  3. 动态运行时装入方式
    在把装入模块装入内存时,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行
    为使地址转换不影响指令的执行速度,需要一个重定位寄存器的支持

程序的链接
源程序经编译后,可得到一组目标程序,再利用链接程序将这组目标模块链接,形成装入模块

  1. 静态链接
    在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块,以后再不拆开
  2. 装入时动态链接
    这是指将用户源程序编译得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式
  3. 运行时动态链接
    对某些目标模块,是在程序执行中需要该目标模块时,才对它进行链接
连续分配方式

一个用户程序分配一个连续的内存空间,又称分区管理方式
分区——指内存中的一个连续区域

  1. 固定分区分配
    将内存划分为若干个固定大小的区域,每个分区中装入一道作业,允许几道作业并发运行。当有空闲分区时,便可从后备队列中选择一个作业装入该分区
    缺点:
    1. 大程序可能无法装入
    2. 主存空间利用率不高——作业往往不可能恰好填满分区
    3. 作业动态扩充主存困难
    4. 各分区作业要共享程序和数据也难实现
    5. 限制了多道运行的程序数
  2. 动态分区分配
    动态分区分配是根据进程的实际需要,动态地为之分配内存空间
    1. 数据结构
      1. 空闲分区表
        每个分区占一个表目,表目包括:分区号,分区始址,分区大小
      2. 空闲分区链
    2. 分配算法
      1. 首次适应算法
        空闲分区表按地址递增排序。分配时从表首开始顺序查找,直至找到一个大小能满足要求的空闲分区;然后按作业大小划出一块内存空间分配给请求者,余下的空闲分区仍留在表中
      2. 循环首次适应算法
        由首次适应算法演变而成。为进程分配内存时,不再是每次从表首开始查找,而是从上次扫描结束处开始顺序查找,直至找到一个大小能满足要求的空闲分区,从中划出一块与请求大小相等的分区分配给作业。为实现该算法,应设置一起始查找指针
      3. 最佳适应算法
        每次分配时,总是将能满足要求的最小分区分配给请求者。将空闲分区按其容量大小从小到大顺序排列,分配时从表首开始顺序查找——加快查找
      4. 最坏适应算法
        将空闲分区按其容量从大到小顺序排列,分配时从表首开始顺序查找
    3. 分配及回收操作
  3. 动态重定位分区分配

题目

2

某系统的空闲分区见下表,采用可变式分区管理策略,现有如下作业序列:96KB,20KB,200KB。若用首次适应算法和最佳适应算法来处理这些作业序列,则哪种算法能满足该作业序列请求?为什么?

分区号大小始址
132KB100K
210KB150K
35KB200K
4218KB220K
596KB530K

首次适应算法
从序列开始一次向下查找,找到能满足大小要求的分区
96KB找到序号4的分区,分配完还剩122KB
20KB找到序号1的分区,分配完还剩12KB
200KB找不到

最佳适应算法
对分区进行排序
3,2,1,5,4
96KB找到序列5的分区
20KB找到序列1的分区,还剩12KB
200KB找到序列4的分区,还剩18KB
满足作业序列的请求

易混淆知识点

页面和页面大小
进程中的块被称为页或页面,内存中的块称为页框或页帧。外存也以同样的单位划分,直接称为块或盘块。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。建立了一个页面到页框的映射表
为方便地址转换,页面的大小应是2的整数幂,同时页面大小应该适中,页面太小会是进程的页面数过多,这样页表就会过长,占用大量内存,而且也会增加硬件地址转换的开销,降低页面换入换出的效率;页面过大又会使页内碎片增多,降低内存利用率
操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应关系

页面大小刚好是2的整数幂有什么好处?
逻辑地址的拆分更加迅速一一如果每个页面大小为 2 k 2^{k} 2kB,用二进制数表示逻辑地址,则末尾K位即为页内偏移量,其余部分就是页号。
因此,如果让每个页面的大小为2的整数幂,计算机硬件就可以很方便地得出一个逻辑地址对应的页号和页内偏移量,而无需进行除法运算,从而提升了运行速度。
![[Pasted image 20241130135930.png]]

地址结构包含两个部分:前一部分为页号,后一部分为页内偏移量W。
在上图所示的例子中,地址长度为32位,其中011位为“页内偏移量”,或称“页内地址”,即每页大小为4KB;1231位为“页号”,即最多允许 2 20 页 2^{20}页 220
如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是 2 K 2^{K} 2K个内存单元
如果有M位表示“页号”,则说明在该系统中,一个进程最多允许有 2 M 2^{M} 2M个页面

![[Pasted image 20241130140147.png]]

  1. 一个进程对应一张页表
  2. 进程的每个页面对应一个页表项
  3. 每个页表项由“页号”和“块号”组成
  4. 页表记录进程页面和实际存放的内存块之间的映射关系
地址变换

![[Pasted image 20241130140531.png]]

快表

什么快表,快表有什么作用?
快表(Translation LookasideBuffer,TLB)通常存放在CPU的内部高速缓冲存储器(Cache)中。用于加快虚拟地址到物理地址的转换速度。

  1. 快表的存放位置:
    快表(TLB)是CPU中的一个高速缓冲存储器,用于缓冲逻辑地址到物理地址的转换信息。它通常位于CPU的缓存中,以提高地址转换的效率。
  2. 与页表的关系:
    快表与页表(Page Table)一起使用,页表存放在内存中。当CPU需要访问内存时,首先会在TLB中查找相应的虚拟地址是否已经映射到物理地址。如果TLB命中,则直接进行地址转换,无需访问内存;如果TLB未命中,则需要访问内存中的页表,并将结果存入TLB。
  3. 提高访问速度:
    通过将常用的虚拟地址映射到物理地址存储在TLB中,可以显著减少CPU访问内存的次数从而提高数据访问的速度。这是因为TLB的访问速度远快于内存,所以通过缓存这些地址转换信息,可以显著提高系统的整体性能。
    ![[Pasted image 20241130140612.png]]

简答题

1.处理死锁的基本方法有哪些?

处理死锁的基本方法包括:

  1. 预防:通过破坏死锁的必要条件来预防死锁。
  2. 避免:使用算法动态避免死锁
  3. 检测与恢复:定期检测系统是否进入死锁状态,然后采取措施恢复。
  4. 忽略:在某些系统中,死锁发生的概率很低,可以忽略不处理。
2.常用内存动态分区分配算法有哪些?

常用的内存动态分区分配算法包括:

  1. 首次适应算法:从内存空间首部开始搜索,找到第一个足够大的空闲分区分配。
  2. 邻近适应算法:每次查找的时候,从上一次查找结束的位置继续查找。
  3. 最佳适应算法:对空闲分区进行排序,从小到大找到能够满足要求的最小空闲分区。
  4. 最坏适应算法:找到最大的空闲分区切割一块给作业使用
3.为什么要引入缓冲?

引入缓冲的原因包括:

  1. 减少I/O操作:通过缓冲,可以减少对磁盘的直接访问次数。
  2. 提高数据传输效率:缓冲可以减少数据传输的时间。
  3. 数据预取:缓冲可以预读数据,提高处理速度。
  4. 数据整理:缓冲可以整理数据,减少数据碎片。
4.在采用Hash进行目录查询时,如何文件名转换时处理出现的“冲突”?

处理哈希冲突的方法包括:

  1. 开放地址法:寻找另一个空闲地址存储
  2. 链地址法:在哈希表的每个槽位使用链表存储具有相同哈希值的多个元素。
  3. 再哈希法:使用多个哈希函数来减少冲突。
  4. 建立公共溢出区:所有冲突的元素存储在溢出区。
5.什么是SPZOOLing技术?它由哪几部分组成?

SPZOOLing技术是一种打印技术,它由以下几部分组成:

  1. 输入井(Input Spool):用于存储待打印的数据。
  2. 输出井(outputSpool):用于存储打印完成的数据。
  3. 打印设备:实际执行打印的设备。
  4. 控制程序:管理打印作业的程序。
6.存储器管理的主要任务是什么?

存储器管理的主要任务包括:
内存分配:决定如何将内存分配给进程。
内存保护:确保每个进程只能访问其分配的内存区域.
内存扩充:通过虚拟内存技术,使用磁盘空间来扩展可用的内存。
地址转换:将逻辑地址转换为物理地址。
内存共享:允许多个进程共享同一块内存区域。
内存压缩:通过技术如交换(swapping)和页面置换(paging)来优化内存使用。

7.什么是管程?管程由哪几部分组成?

管程(Monitor)是一种高级同步机制,用于多进程环境下的同步和互斥。
管程由以下几部分组成:

  1. 条件变量:用于进程间的同步。
  2. 互斤锁:用于实现临界区的互斥访问。
  3. 数据结构:共享数据的存储区域。
  4. 操作过程:一组操作共享数据的函数。
8.进程通信类型有哪几种?

进程通信的类型包括:
管道(Pipe):用于父子进程或兄弟进程间的通信。
消息队列(Message Queue):用于进程间的数据交换
共享内存(Shared Memory):允许多个进程共享一个给定的存储区。
信号量(Semaphore):用于控制对共享资源的访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值