##提前准备 (请在上课前完成)
- 完成lec5的视频学习和提交对应的在线练习
- git pull ucore_os_lab, v9_cpu, os_course_spoc_exercises in github repos。这样可以在本机上完成课堂练习。
- 理解连续内存动态分配算法的实现(主要自学和网上查找)
NOTICE
- 有"hard"标记的题有一定难度,鼓励实现。
- 有"easy"标记的题很容易实现,鼓励实现。
- 有"midd"标记的题是一般水平,鼓励实现。
1.操作系统中存储管理的目标是什么?
抽象、保护、共享、虚拟化
1.描述编译、汇编、链接和加载的过程是什么?
编译:将程序源代码转换为汇编代码; 汇编:将汇编代码转为二进制的机器码; 链接:将多个二进制的机器码结合成一个可执行环境; 加载:将程序从外存中加载到内存中。
2.动态链接如何使用?尝试在Linux平台上使用LD_DEBUG查看一个C语言Hello world的启动流程。 (optional)
1.什么是内碎片、外碎片?
内碎片是指分配给任务的内存大小比任务所要求的大小所多出来的内存。 外碎片是分配给任务的内存之间无法利用的内存。
2.最先匹配会越用越慢吗?请说明理由(可来源于猜想或具体的实验)?
会。最先匹配总是先找低地址空间的内存,到后期低地址空间都是大量小的不连续的内存空间,每次都要扫描低地址空间后到达高地质空间才能得到可用的内存。
3.最差匹配的外碎片会比最优适配算法少吗?请说明理由(可来源于猜想或具体的实验)?
会。因为每次都找到最大的内存块进行分割,因此分割剩下的内存块也很大,往往还可以再装下一个程序。
4.理解0:最优匹配,1:最差匹配,2:最先匹配,3:buddy systemm算法中分区释放后的合并处理过程? (optional)
1.对换和紧凑都是碎片整理技术,它们的主要区别是什么?为什么在早期的操作系统中采用对换技术?
紧凑是在内存中搬动进程占用的内存位置,以合并出大块的空闲块;对换是把内存中的进程搬到外存中,以空出更多的内存空闲块。 因为对换技术比较容易实现。
2.一个处于等待状态的进程被对换到外存(对换等待状态)后,等待事件出现了。操作系统需要如何响应?
将进程从硬盘中读取到内存中,在这个过程中,操作系统将该进程标为等待状态并且调度其他进程。
1.伙伴系统的空闲块如何组织?
按照内存的大小有一系列链表组织,类似于哈希表,将相同大小的内存区域首地址连接起来。
2.伙伴系统的内存分配流程?伙伴系统的内存回收流程?
(1)当向内核请求分配(2^(i-1),2^i]数目的页块时,按照2^i页块请求处理。如果对应的块链表中没有空闲页块,则在更大的页块链表中找。当分配的页块中有多余的页时,伙伴系统根据多余的页框大小插入到对应的空闲页块链表中。
(2)当释放多页的块时,内核首先计算出该内存块的伙伴的地址。内核将满足以下条件的三个块称为伙伴:(1)两个块具有相同的大小,记作b。(2)它们的物理地址是连续的。(3)第一块的第一个页的物理地址是2*(2^b)的倍数。如果找到了该内存块的伙伴,确保该伙伴的所有页都是空闲的,以便进行合并。内存继续检查合并后页块的“伙伴”并检查是否可以合并,依次类推。
观察最先匹配、最佳匹配和最差匹配这几种动态分区分配算法的工作过程,并选择一个例子进行分析分析整个工作过程中的分配和释放操作对维护数据结构的影响和原因。
例如:
python ./ostep3-malloc.py -S 100 -b 1000 -H 4 -a 4 -l ADDRSORT -p BEST -n 5 -c
python ./ostep3-malloc.py -S 100 -b 1000 -H 4 -a 4 -l ADDRSORT -p FIRST -n 5 -c
python ./ostep3-malloc.py -S 100 -b 1000 -H 4 -a 4 -l ADDRSORT -p WORST -n 5 -c
-
请参考xv6(umalloc.c),ucore lab2代码,选择四种(0:最优匹配,1:最差匹配,2:最先匹配,3:buddy systemm)分配算法中的一种或多种,在Linux应用程序/库层面,用C、C++或python来实现malloc/free,给出你的设计思路,并给出可以在Linux上运行的malloc/free实现和测试用例。
-
阅读slab分配算法,尝试在应用程序中实现slab分配算法,给出设计方案和测试用例。