1请说明内部碎片和外部碎片的区别:
答:内部碎片(internalfragment),通常是指将内存以固定大小的块进行分配,采用这种方案,进程所分配的内存可能比所需的大,
多出来的未被使用的内存叫做内部碎片。
外部碎片(externalfragment),通常是指随着进程移进移出内存,内存的空闲空间被分割成小片段,当所有的总的可用内存之和可以满足分配请求,但是却不连续,就出现了外部碎片问题。
页式虚拟存储系统存在内部碎片,段式虚拟存储系统存在外部碎片(需解释此处)
相关知识点:1分页
分页(paging)允许进程的物理地址空间是非连续的,
基本实现方法是将物理内存分成固定大小的帧(frame),把逻辑内存分成固定的页(page),且页的大小等于帧。
如果逻辑地址空间共有2^m,每页的大小是2^n(byteor word), 则逻辑地址的高
m-n位表示页码,低n位表示页内的偏移量。
分页技术不会产生外部碎片,但是有内部碎片,现在,页的大小一般为4-8KB,
注意用户进程一般情况是不能访问非它所占用的内存的,它无法访问其页表所规定的之外的内存,那么这是怎么做到的呢?
每个进程都有自己的页表。通常有一位与页表中的每一个条目相关联,有效-无效位,当该位有效,表示相关的页在此进程的逻辑地址空间内,也就是说该页被分配了帧。如果无效位,就表示该页不在此进程的逻辑地址空间内,由此可以捕捉到非法的地址。
由于操作系统管理物理内存,它必须知道内存中所有帧的分配情况,由此,操作系统维持着一个帧表,每个条目对应一个帧。表示该帧是否被占用,如果占用,被哪个进程的哪个页占用。
页码在TLB中被查找到的百分率成为命中率,假如查找TLB需20ns,访问内存100ns,如果hit,则需要时间100ns,如果没有hit,则需要时间20+100+100= 220ns, assume 命中率80%,则有效内存访问时间0.8* 120 + 0.2 *220 = 140ns.
2考虑下列生成二进制的过程,编译器被用来生成单个单元的目标代码,链接器被用来将多个目标单元合并成一个程序二进制,链接器如何改变指令和数据到内存地址的绑定?需要什么信息从编译器传递给链接器,以协助完成链接器的内存绑定:
答:不会。以后再答
3如果有内存块100KB,500KB,200KB,300KB,和600KB,(按顺序),首次适应算法,最佳适应算法,最差适应算法各自将怎样放置大小分别为212KB,417KB,112KB和426KB的进程,哪一种算法的内存利用率高:
答:
first-fit:
212KB-> 500KB
417kb-> 600KB
112kb-> 288KB(500KB- 212KB = 288KB)
426kb-> wait
best-fit:
212KB-> 300KB
417KB-> 500KB
112KB-> 200KB
426KB-> 600KB
worst-fit:
212KB-> 600KB
417KB-> 500KB
112KB-> 388KB(600KB- 212KB = 388KB)
426Kb-> wait:
best-fitis best way in allocating memory.
相关知识:以上三种方法都属于动态存储分配问题
1首次适应算法:分配第一个连续的足够大的内存块,查找可以从头开始,也可以从上次首适应结束时开始,一旦找到足够大的内存块,就停止查找。
2最佳适应:分配最小的连续的足够大的内存块。
3最差适应:分配最大的连续的足够大的内存块。
模拟结果显示,首次和最佳均好于最差适应,但是首次和最佳差不多。
4假设一个将页表放在内存中的分页系统:
a如果一次内存访问需要200ns,访问一页内存要用多长时间。
b如果加入TLB,并且75%的页表引用发生在TLB,内存的有效访问时间是多少,(假设在TLB中查找页表项的占用零时间,如果页表项在其中。)
答:a: 200ns + 200ns = 400ns
b:0.75*200ns + 0.25 * 400ns = 250ns.
5为什么时常将分页和分段在同一个方案里面结合使用:
答:将分段和分页结合,获取分页和分段的好处,又一定程度避免单独分页和分段的坏处。
相关知识点:
在页式存储系统中,一个存在的问题是,页表的条目太大,且供用户使用的逻辑地址是连续的,导致大型程序缺乏逻辑结构。用户希望他们的程序是由若干段构成的。当一个进程被调用时,它的各个段被调用内存并且构造段表。
段式管理的内存分配和释放:
1当进程要求调入某一段时,内存中有足够的空闲区满足条件,采用和动态内存管理方法(前面有提到)分配内容(注意此时产生外部碎片)。
2内存中没有足够的空闲区满足该段的内存要求。就置换出一段时间内不会被CPU访问的段。
分段式的好处
段的逻辑独立性使其易于编译、管理、修改和保护,也便于多道程序共享。
段长可以根据需要动态改变,允许自由调度,以便有效利用主存空间。
方便编程,分段共享,分段保护,动态链接,动态增长
因为段的长度不固定,段式虚拟存储器也有一些缺点:
主存空间分配比较麻烦。
容易在段间留下许多碎片,造成存储空间利用率降低。
由于段长不一定是2的整数次幂,因而不能简单地像分页方式那样用虚拟地址和实存地址的最低若干二进制位作为段内地址,并与段号进行直接拼接,必须用加法操作通过段起址与段内地址的求和运算得到物理地址。因此,段式存储管理比页式存储管理方式需要更多的硬件支持。
一个C编译器可能会创建如下段:
1代码2全局变量3堆4每个线程采用的栈5标准的C库函数。
编译时链接的库可能被分配不同的段,加载程序装入这些段,并分配段号。
逻辑地址:
<segment-number,offset>.
6试说明为什么使用分段比使用纯分页更容易共享一个可重入模块:
答:在纯分页的系统中,所谓共享就是将多个进程的页表项指向相同的帧,这很困难,首先1页与帧的对应操作对用户进程其实是透明的。2被共享的部分不一定刚好是一个完整的页面大小,这样就包含了本不该包含的信息,不利于保密
在分段的系统中,多个进程的段表的相应表项都指向可重用模块的统一物理副本。因为段表中有存储段的长度,所以可以防止越界。多道程序设计,要防止一个进程读取数据时,另一个进程修改共享模块的数据和代码。
7某系统采用分页存储管理方式,拥有逻辑空间32页,每页2K,拥有物理内存1M,
1写出逻辑地址的格式
2若不考虑访问权限,进程的页表项有多少项,每项至少有多少位?
3如果物理空间减少一半,页表结构应做怎么样的调整。
1<page-number, offset> page-number = 5 offset = 11
232 ,每项至少有9位
3如果物理空间减少一半,页表项数目不变,逻辑地址
<page_number,offset> page_number = 5 offset = 11
每项至少是8位。
8请描述段页式管理系统:
为了实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放、缺段处理、存储保护相地址变换等。另外,由于一个段又被划分成了若干页,每个段又必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然,与页式管理时相同,页表中也要有相应的实现缺页中断处理和页面保护等功能的表项。另外,由于在段页式管理中,页表不再是属于进程而是属于某个段,因此,段表中应有专项指出该段所对应页表的页表始址和页表长度。
在段页式管理系统中,要对内存中指令或数据进行一次存取的话,至少需要访问三次以上的内存:
第一次是由段表地址寄存器得段表始址后访问段表,由此取出对应段的页表在内存中的地址。第二次则是访问页表得到所要访问的物理地址。第三次才能访问真正需要访问的物理单元。这将使CPU的执行指令速度大大降低。为了提高地址转换速度,设置相关的寄存器保存当前最常用的段号->页表,页表->页号等。