【操作系统】05.分配管理、虚拟内存、外设管理、总结
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
连续&非连续分配管理
56.解释下内存碎片,内碎片,外碎片?
内存零头、内零头、外零头?
内存碎片是指在计算机内存中存在的一些未被有效利用的小块空闲内存,这些内存块虽然大小不足以满足系统中某些程序或进程的内存需求,但它们又不能被合并成足够大的连续内存块。这些未被利用的内存块就被称为内存碎片。
内碎片指的是在分配给某个进程的内存块中,有一部分内存没有用上。例如,如果一个进程需要申请4KB的内存,但是只有一个8KB的内存块可用,那么分配给这个进程的内存块大小将是8KB,其中有4KB的内存是没有被利用的,这部分未被利用的内存就是内碎片。
外碎片是指在整个内存空间中,存在大量零散的未被利用的内存空间,这些内存块虽然总大小足以满足系统中某些程序或进程的内存需求,但是它们分布在内存空间的不同区域,无法被合并成一个大的连续的内存块。这些未被利用的内存空间就被称为外碎片。外碎片通常由于程序释放内存不当或者系统内存管理不足导致。外碎片也会降低内存利用率和系统性能。
57.内存连续分配管理的三种方式
-
单一连续分配:无外部碎片,有内部碎片
-
固定分区分配:无外部碎片,有内部碎片
-
动态分区分配:有外部碎片,无内部碎片。相邻的空闲区间要合并。
58.内存动态分区分配算法有哪几种?
动态分区分配是指在内存中进行动态分区管理,当进程请求内存时,动态分区分配算法会从空闲分区中选择一个合适的分区为其分配。常见的动态分区分配算法有以下几种:
首次适应 | 从头到尾找适合的分区 | 空闲分区以地址递增次序排列 | 综合看性能最好。算法开销小,回收分区后一.般不需要对空闲分区队列重新排序 | |
最佳适应 | 优先使用更小的分区,以保留更多大分区 | 空闲分区以容量递增次序排列 | 会有更多的大分区被保留下来,更能满足大进程需求 | 会产生很多太小的、难以利用的外部碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序 |
最坏适应 | 优先使用更大的分区,以防止产生太小的不可用的碎片 | 空闲分区以容量递减次序排列 | 可以减少难以利用的小碎片 | 大分区容易被用完,不利于大进程;算法开销大(原因同上) |
邻近适应 | 由首次适应演变而来,每次从上次查找结束位置开始查找 | 空闲分区以地址递增次序排列(可排列成循环链表) | 不用每次都从低地址的小分区开始检索。算法开销小(原因同首次适应算法) | 会使高地址的大分区也被用完 |
记忆:首佳坏邻
59.内存非连续分配管理的三种方式
-
分页存储管理:优点是不需要连续的内存空间,且内存利用率高(只有很小的页内碎片);缺点是不易于实现内存共享与保护。
-
分段存储管理:优点是易于实现段内存共享和保护;缺点是每段都需要连续的内存空间,且内存利用率较低(会产生外部碎片)。
-
段页式存储管理(对每个段分页存储):优点是不需要连续的内存空间,内存利用率高(只有很小的页内碎片),且易于实现段内存共享和保护;缺点是管理软件复杂性较高,需要的硬件以及占用的内存也有所增加,使得执行速度下降。
60.分页机制和分段机制的共同点和区别
共同点:
- 都是将逻辑地址映射到物理地址的机制。
- 都可以使得多个程序共享同一块物理内存,从而提高内存利用率。
区别:
- 页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的。 段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逆辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
- 分页是将逻辑地址划分为固定大小的页面,物理内存也被划分为相同大小的页面,逻辑页面与物理页面之间的映射关系由操作系统维护;分段则是按照逻辑段的大小进行划分,每个段的大小不同,物理内存也不需要按照相同的大小进行划分,逻辑段与物理内存之间的映射关系由编译器或操作系统维护。
- 分页机制可以很好地解决内存碎片的问题,不会产生外部碎片,因为分页机制中每个页面大小相同,分配和回收页面非常简单;而分段机制中由于逻辑段大小不同,容易产生外部碎片,需要使用复杂的内存管理算法进行管理。
- 分页机制中的地址转换速度较快,因为页表是连续存储的,可以通过快速查找进行地址转换;而分段机制中的地址转换需要查找多个段表,速度较慢。
- 分段比分页更容易实现信息的共享和保护。
61.什么是快表,你知道多少关于快表的知识?
快表,又称联想寄存器(TLB) ,是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。
62.地址变换中,有快表和没快表,有什么区别?
如果系统中具有快表后,那么地址的转换过程变成什么样了?
基本地址变换机构 | ①算页号、页内偏移量 ②检查页号合法性 ③查页表,找到页面存放的内存块号 ④根据内存块号与页内偏移量得到物理地址 ⑤访问目标内存单元 | 两次访存 |
具有快表的地址变换机构 | ①算页号、页内偏移量 ②检查页号合法性 ③查快表。若命中,即可知道页面存放的内存块号,可直接进行⑤;若未命中则进行④ ④查页表,找到页面存放的内存块号,并且将页表项复制到快表中 ⑤根据内存块号与页内偏移量得到物理地址 ⑥访问目标内存单元 | 快表命中,只需一次访存;快表未命中,需要两次访存 |
由于查询快表的速度比查询页表的速度快很多,因此只要快表命中,就可以节省很多时间。 因为局部性原理,一般来说快表的命中率可以达到90%以上。
在计算机系统中,地址转换是将逻辑地址(由程序生成的地址)转换为物理地址(在内存中实际存储数据的地址)的过程。为了提高地址转换的效率,常常使用一种叫做快表(Translation Lookaside Buffer,TLB)的高速缓存来加速这个过程。
快表是一个小型的高速缓存,存储了最近被使用过的一部分页表项。每当发生地址转换时,系统首先会检查快表中是否已经缓存了对应的页表项。如果快表中存在,那么地址转换可以直接从快表中获得对应的物理地址,从而避免了访问内存中的页表,加快了转换速度。如果快表中不存在,系统则需要访问内存中的页表,找到对应的页表项,并将其存入快表中以供下次使用。
使用快表的地址转换称为快表缓存(TLB caching),而没有快表的地址转换称为完全地址转换(full address translation)。两者的主要区别如下:
- 访问速度:快表缓存直接在高速缓存中进行地址转换,速度非常快,通常只需要几个时钟周期。而完全地址转换需要访问内存中的页表,速度相对较慢,需要更多的时钟周期。
- 存储开销:快表缓存只存储了最近被使用的一部分页表项,因此占用的存储空间相对较小。而完全地址转换需要存储整个页表,占用更多的存储空间。
- 命中率:由于快表缓存只能缓存有限数量的页表项,当程序访问的页表项不在快表中时,就需要进行完全地址转换。快表的命中率取决于程序的访存模式和快表的大小。如果程序的访存模式具有很好的局部性,那么快表的命中率将会比较高,从而提高地址转换的效率。
虚拟内存
MMU 相关见Linux内核
63.局部
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础【本专栏】 3.硬件篇 4.嵌入式Linux (建议PC端查看)