一操作系统装入程序到内存中几种方法:
1:绝对装入方式(Absolute Loading Mode):
即程序在编译时就产生物理地址的目标代码,编译完成后,不在需要对程序和数据进行修改,程序员也可以在程序中赋值物理地址。
缺点:不灵活,要求程序员对内存相当熟悉,只适用于单道程序环境。
2:静态重定位装入方式(Relocation Loading Mode):
即程序在编译时使用的是逻辑地址,在装入的时候,临时将逻辑地址转换成物理地址。到内存中后的地址为物理地址。这种方法叫做静态重定位装入。
缺点:不灵活,当进程有需要动态改变地址时则无法改变。
3:动态重定位装入方式(Dynamic Run-time Loading)
即程序在装入内存之后,在内存中仍然使用逻辑地址,只有在取该数据时,才转换成物理地址。这样做会影响到程序的执行速度。因此,一般将转换成物理地址的过程做成硬件来完成转换,需要添加一个地址转换寄存器来支持。
二 程序的链接过程
1:静态链接(Static Linking)
程序在编译之后形成目标模块,然后将目标模块和库函数组合成一个模块,不再分开的链接。
缺点:消耗内存的资源很大,往往有的库函数或模块在程序的运行过程中没有使用,极大的浪费了内存空间。
2:装入是动态链接(Load-time Dynamic Linking)
程序在编译时形成目标模块代码,在需要调入内存时,链接成一个模块装入内存。
缺点:和静态链接一样,对内存消耗大。
3:运行时动态链接(Runtime Dynamic Linking)
程序在编译时形成目标模块,在调入内存时调入需要执行的代码模块,当用到某个库函数或模块式时,由操作系统动态的调入内存执行。
三 内存连续分配方式
1:单一连续内存分配
把内存区域中划分OS分区和应用进程区域两大块,互不干涉。在应用进程区域的内存按照单一的连续分配原则分配给各个进程。
使用范围:单用户,单任务的操作系统中。如CP/M,MS-DOS操作系统。
2:固定分区分配
a.固定分区大小一致分配
将内存划分为大小一致的多个分区,这种分配方式缺乏灵活性,当进程太小造成空间浪费,太大则无法分配空间,导致装入失败。
b.固定分区大小不一致分配
将内存划分为大小不一致的多个分区。这样可根据进程大小适当分配区域。
分配具体操作:将各个分区按照大小排队,用一张分区表存储,该表中包含分区的大小,起始地址,和使用情况
使用范围:IBM360的MFT
3:动态分区分配
根据进程的大小动态的分配内存空间,需要为其配置数据结构,分配算法,分区的分配和回收操作。
数据结构:
空闲分区表,用于记录空闲分区的大小,起始地址,分区序号等信息
空闲分区链,在每个分区的起始地址部分设置一个分区信息数据结构,包含前后分区指针,分区尾部设置分区状态和分区大小表目
分区分配算法:
a.首次适应算法(first fit)
在为进程分配分区时,从头到尾查找空闲分区表,若查找到分区的大小大于或者等于要分配的进程大小则为其分配该分区。该算法的倾向于利用内存中的低地址空间,而保留了大部分高地址空间
优点:为大进程留下了足够的空间。
缺点:产生很多内存碎块,严重浪费了宝贵的内存资源。
b.循环首次适应算法(next fit)
和首次适应算法不同的是,在查找到适应的分区之后,以后再次分配内存空间时,从上次查找的位置开始进行分配。
优点:使内存使用空间分布的比较均匀,减少了查找空闲空间的时间。
缺点:这样查找会缺乏大的内存空间
c.最佳适应算法(best fit)
将空闲分区表按照分区的大小从小到大排好队,每次分配空闲分区时顺序查找,找到适应的分区则分配进程,必然每次都是最佳分配。然而在宏观上不一定是最佳的,每次分配后都会留下难以利用的内存碎块。
b.最坏适应算法(worst fit)
将空闲分区表按从大到小的顺序排好队,依次扫描空闲分区表,每次分配给进程时,都将最大的内存空间分配之。
优点:每次残留的内存碎块都不至太小。对中小进程有利,对大进程最不利。查找效率高。
缺点:是内存中缺乏大的内存空间。
以上四种都称为顺序搜索法。
e.最快适应算法(fast fit)
该算法也称为分类搜索法,将空闲分区表中大小大体相同的分区单独放到一个空闲分区表中,这样在操作系统中就有多个空闲分区表,再建立一个空闲分区索引表,每个索引指向一个空闲分区表,每类空闲分区的大小可以按照2kb,4kb,8kb来划分。当要查找空闲分区时就可以通过查找索引来快速查找合适的分区。
优点:查找效率高,能保留大的分区,满足对大空间的需要,也不会产生内存碎片。
缺点:在分区归还内存时算法复杂,系统开销大,在分配时一个分区只给一个进程,或多或少存在一定浪费。而且在分区划分越细的情况下,浪费越严重。这是典型的以时间换空间的做法。
伙伴系统
伙伴系统是固定分区和动态分区分配的折中方法,在伙伴系统中,不论已经划分的分区还是没有划分的分区大小都统一为2^k次幂,k可以为1,2,3......m 内存的区域最小为2^1
最大为2^m次幂,也就是整个内存区域。在每次分配内存时就分配2^i次幂大小的空间,这样在多次分配后就会产生多个不连续的内存空间。将这些大小相同的内存空间分成一类,建立一个空闲分区链表,当要分配内存大小为m时,就比较2^i 在进行内存回收时,如果有2^i空闲区域则查找是否存在相同大小的空间,存在则合并为2^i+1,再搜索是否存在和2^i+1相同的空间若存在则再次合并。.若不存在,则加入2^i中。
伙伴系统在时间性能方面比分类搜索差,比顺序搜索要优胜。在空间性能方面则相反。在多处理机的系统中得到大量的应用。