北航操作系统课程-第四次作业-内存分配、页式内存管理
北京航空航天大学计算机学院-2020春操作系统课程,理论课第四次作业,内容为内存分配、页式内存管理。题目作者为北航计算机学院操作系统课程组,答案为博主原创。水平有限,无法保证作答正确性,如有错误敬请批评指正。部分作答源自百度谷歌等其他资料,如有侵权联系删除。
北航操作系统课程-第四次作业-内存分配、页式内存管理
北京航空航天大学计算机学院-2020春操作系统课程
题目作者为北航计算机学院操作系统课程组,答案为博主原创。水平有限,无法保证作答正确性,如有错误敬请批评指正。部分作答源自百度谷歌等其他资料,如有侵权联系删除
1 动态内存分配需要对内存分区进行管理,一般使用位图和空闲链表两种方法。128MB的内存以n字节为单元分配,对于链表,假设内存中数据段和空闲区交替排列,长度均为64KB。并假设链表中的每个节点需要记录32位的内存地址信息、16位长度信息和16位下一节点域信息。这两种方法分别需要多少字节的存储空间?那种方法更好?
使用位图记录内存分配只需要每个内存单元占用一个比特即可,0表示未分配1表示已分配(或反过来)。128M字节的内存每n字节一个单元,共有(128/n)M个单元,每个单元占用一个比特,而一个字节是8比特,位图要占用(128/n)M / 8 = (16/n)M个字节,即(16/n)MB。
链表记录的是每一块连续内存的信息。根据题意,128MB的空间数据和空闲交替排列,每段64KB,那么一共有128MB / 64KB = 1K个段需要记录,也就是说链表有1K个节点。又根据题意,每个节点需要32+16+16 = 64bit = 8B的空间记录节点信息,那么链表一共要占用1K * 8B = 8KB的空间。
比较两种方法,如果仅从占用存储空间的角度看,位图法在n > 2048B,即分配单元大于2KB的情况下,其占用空间大小才会小于链表,否则位图比链表更占用空间。但位图和链表各有优劣,位图法查询简单,链表与之相比需要遍历整个链表才可以得到空间的使用信息,但位图的容错能力不如链表,一个比特出错就会影响到内存分配状态。
2 在一个内存系统中,按内存地址排列的空闲区大小是: 10KB、4KB、20KB、18KB、7KB、9KB、12KB和15KB。对于连续的内存请求:12KB、10KB、9KB。使用FirstFit、BestFit、WorstFit和NextFit将找出哪些空闲区?
空闲区号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
空闲区大小 | 10KB | 4KB | 20KB | 18KB | 7KB | 9KB | 12KB | 15KB |
FirstFit从前到后寻找第一个能够满足需求的内存块。12KB请求会找到3号20KB空闲区,分配后3号变为8KB;10KB请求会找到1号10KB空闲区,分配后1号空闲区全部占用;9KB请求会找到4号18KB空闲区,分配后4号变为9KB。FirstFit会使位置靠前的空闲区优先被分配,产生较多碎片。
BestFit寻找与请求最接近的空闲区进行分配。12KB请求会找到7号12KB空闲区,分配后7号空闲区全部被占用;10KB请求会找到1号10KB空闲区,分配后1号空闲区全部占用;9KB请求会找到6号9KB空闲区,分配后6号空闲区全部被占用。BestFit若能如上述情况找到恰好合适的空闲区就不产生碎片,否则容易产生较多碎片。
WorstFit每次都寻找最大的分区来分配。12KB请求会找到3号20KB空闲区,分配后3号变为8KB;10KB请求会找到4号18KB空闲区,分配后4号变为8KB;9KB请求会找到8号15KB空闲区,分配后8号变为6KB。WorstFit不容易产生很小的碎片,但却会使大块内存被分割,当大请求的作业到来时可能没有足够的大段连续空间。
NextFit每次从上一次分配空间的下一块空间开始查找,寻找第一个能够满足需求的空间。12KB请求会找到3号20KB空闲区,分配后3号变为8KB;10KB请求会找到4号18KB空闲区,分配后4号变为8KB;9KB请求会找到6号9KB空闲区,分配后6号空闲区全部被占用。NextFit不会像FirstFit那样让小碎片集中在内存前半部分,但也容易分割大块空闲区。
3 解释逻辑地址、物理地址、地址映射,并举例说明。
逻辑地址是操作系统的用户(程序)编写应用程序时所用的地址,物理地址是内存中实际的地址,地址映射指的是逻辑地址向物理地址转换的过程。
帕金森定律在计算机界的延申就是,不论内存有多大,程序员在编写单个程序的时候总时倾向于用完所有的内存资源。如果让程序员直接使用物理地址编程,那么多道程序并行几乎是无法实现的。程序员希望实现大容量、快速读写且不受干扰的内存环境,而机器希望实现资源的高效利用和多道程序的高效执行,此时操作系统要做的就是将内存合理管理,向下统一管理物理内存,向上为程序员提供独立的地址空间,让每一个程序“看似”占用了全部的逻辑地址空间,实际上只分别占用了物理内存的一小部分。因此区分逻辑地址和物理地址,并由操作系统实现地址映射是有必要的。
举例来说,对32位的MIPS体系结构而言,每一个进程都拥有独立的4GB逻辑地址空间,每一个区域的地址空间有其特定的用途,kuseg、kseg0、kseg1和kseg2都有各自的地址映射方式。MIPS体系结构广泛应用于不同硬件条件的嵌入式系统,具体机器的物理内存和物理地址不尽相同,但逻辑地址到物理地址的映射按区域基本确定,有通过MMU转换的区域,也有直接高位清零转换的区域。
4 解释页式存储管理中为什么要设置页表和快表,简述页式地址转换过程。
页式存储管理的目的是高效利用内存,并实现大逻辑空间映射小物理空间。要使用页式内存管理,就需要存储一张页表,用于记录逻辑页向物理页的映射。由于查页表会增加一次访问内存,影响访问性能,人们设计了快表,即页表的cache,在查找页面映射时先查快表,若命中则无需查页表,若没有命中再访问页表,并做快表替换。
上图是拥有一级页表和快表的系统的地址映射机制。逻辑地址划分为页号和页内偏移两个部分,得到逻辑地址时先在快表中查找页号,如果命中则直接根据其对应的物理页号再加页内偏移找到物理地址,若没有命中则在内存中查页表,将查到的页表项替换进快表,然后根据物理页号加页内偏移访问物理地址。
5 假设一个机器有38位的虚拟地址和32位的物理地址。
(1) 与一级页表相比,多级页表的主要优点是什么?
(2) 如果使用二级页表,页面大小为16KB,每个页表项有4个字节。应该为虚拟地址中的第一级和第二级页表域各分配多少位?
-
一级页表的缺陷在于,当逻辑地址空间很大的时候,页表本身会占用很多内存,查页表的过程也很耗费时间。因此人们设计多级页表机制,即为页表再设置页表,然后实行动态页表调入,即只将当前要用的页表项调入内存,其余的需要用时再调入。多级页表的优势在于节省了内存中存储页表的空间。
-
(为了避免歧义,下文使用“页表”和“页目录”的表述替代“第一级页表”和“第二级页表”)页面大小为16KB,需要用14位来表示,即页内偏移占到地址的14位,对虚拟地址而言剩余24位。设剩余的24位中有n位用于查页表,(24-n)位用于查页目录。n位页表域可以表示2^n个虚拟页,每个虚拟页占用4个字节的页表项,则页表一共占用2^n * 4B = 2^(n+2)B空间,这些由页表占用的空间一共排在 2^(n+2)B / 16KB = 2^(n-12) 个页面上,而这些页面需要由(n-12)位来表示,也就对应的是页目录的(24-n)位。此时有n-12 = 24-n,容易得n=18。
因此虚拟地址中由6位表示页目录域,18位表示页表域,14位表示页内偏移。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)