1、首次适应算法:

空闲分区链以地址递增的次序链接,在分配内存时,从链首开始查找,直至找到一个大小能满足要求的空闲分区链为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的空闲分区,则此次内存分配失败,返回。

2、循环首次适应算法:

在为进程分配内存空间时,不是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块玉请求大小相等的内存空间分配给作业。

3、最佳适应算法:

把能满足要求又是最小的空闲分区分配给作业使用,要求所有的空闲分区按其容量以小到大的顺序形成一个空闲分区链。

4、最坏适应算法:

每次挑选一个最大的空闲分区分割给作业使用,要求将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链。

5、回收内存方式

(1)回收区与插入点的前一个空闲分区F1相邻接,将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小。

(2)回收区与插入点的后一空闲分区F2相邻接,将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲分区的首址,大小为两者之和。

(3)回收区同时与插入点的前、后两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和。

(4)回收区既不与F1邻接,又不与F2邻接。这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。

双链表初始化函数Initblock():初始化双链表,并将系统区0到56MB-1的内存地址空间分配给头结点,将56MB到256MB的地址空间分配给尾节点。

清空内存变量,数据初始化函数clearNC():清空带头结点的双链表,以便再次使用。

初始化内存函数ChuShiHuaNC(DIZHI,DIZHI):将申请单的空闲块插入双链表中,修改尾指针的地址和大小。

输出当前内存块数据的函数show():将当前内存块数据输出。

随机数产生函数RandTest():产生服从正太分布的内存块随机数大小,和回收地址,等待利用。再此将申请内存的大小存入文件中。

首次适应算法函数int First_fit(unsigned long zDX):利用首次适应算法的思想,实现内存分配;

循环首次适应算法函数int Next_fit(unsigned long zDX):利用循环首次适应算法思想,实现内存分配;

排序函数void Sort_Array(int ud):实现按内存大小升序和降序排序以及按ID升序排序;

最佳适应算法int Best_fit(unsigned long zDX):按最佳适应算法的思想,实现内存分配;

最坏适应算法int Worst_fit(unsigned long zDX):按最坏适应算法的思想,实现内存分配;

申请内存int ShenQingNC(unsigned long zDX,int m):根据所选择的算法和申请内存块的大小来申请内存;

回收内存int HuiShouNC(DIZHI zKSDZ):按照四种内存回收策略来进行内存的回收,修改地址,状态位和大小;

记录每一个ID被申请的次数void PrintID(int m):按ID被申请次数记录;

产生区间[min,max]内的随机数double Rand(int min,int max);

正太分布函数double normal(double x, double miu,double sigma);

产生服从正太分布随机数的函数double randn(double miu,double sigma, int min ,int max);

将最后分区内存表输出到文件void Print1();

空闲分区表的建立void InitNC(int m):根据随机数,决定回收或者申请内存,若是申请内存,则根据选择的算法来实现内存申请,如实回收内存,则根据回收地址来进行内存的回收。再次记录内存利用率,存入文件中。

每次条用内存分配算法的适合记录查询次数,最终存入文件中。

最后将存入文件的结果利用MATLAB处理之后,以图形化的方式展示。



1、首次适应算法倾向于优先利用内存中地址部分的空闲分区,从而保留了高址部分的大空闲区,这给为以后到达的大作业分配大的空闲空间创造了条件。其缺点是低址部分不断被划分,会留下许多难以利用的、很小的空闲分区,而每次查找又都是从地址部分开始,会增加查找可用空闲分区的开销。

2、循环首次适应算法使内存分区分布得更均匀,从而减少了查找空闲分区时的开销,但这会缺乏大的空闲分区。

3、最佳适应算法每次分配后所切割下来的剩余部分总是最小的,但是,在存储器中会留下许多难以利用的小空闲区。

4、最坏适应算法查找时只需看第一个空闲分区能否被利用,查找优越,但是,会使存储器中缺乏大的空闲分区。

由结果分析可知:随着平均申请内存空间的增加,每个算法的平均查找次数都会趋近于某个值,但是循环首次适应算法查找次数是最少的,最坏适应算法其次,然后是首次适应算法,查找次数最多的是最佳适应算法。

随着平均申请内存空间的增加,每个算法的内存平均利用率都会区域某个值,但是,当申请的内存空间较大,申请次数较多的时候,内存平均利用率最高的是最佳适应算法,其次是首次适应算法,然后是最坏适应算法,最差的是循环首次适应算法。

随着申请次数的增加,内存平均利用率也会增加,每个算法在不同的情况下都会体现出自己的优势,每个算法都会有内存平均利用率最高的时候。

当申请的内存块比较小,申请次数比较少的时候,利用首次适应算法内存利用率较高,当申请的平均内存块大小较大,申请次数较多的时候,使用循环首次适应算法内存利用率较高,当申请的平均内存块大小较大,申请次数较少的时候,使用最坏适应算法内存利用率较高,最佳适应算法适合于申请内存空间较大,申请次数也非常多的时候,其内存利用率较高,但此时选用其他算法内利用率也高。

总之,各种算法都有其有点,也有其缺点,没有一种算法在任何情况下都是最有的,这四个算法也不是在任何情况下平均内存利用率大小都是固定不变的,在不同的情况下体现出不同的优先,也存在不同的缺点。