动态存储管理:
若可利用的空间表有若干个不小于 用户所需大小为n的空闲块时,有三种分配策略:
1.首次拟合法:从表头指针开始查找可利用的空间表,将找到的第一个大小不小于n的空闲块的一部分分配给用户;
2.最佳拟合法:将可利用空间表中一个不小于n且最接近n的空闲块的一部分分配给用户。
3.最差拟合法:将可利用空间表中不小于n且是链表中最大的空闲块的一部分分配给用户。
区别:<1>最佳拟合法适用于请求分配的内存大小范围较广的系统,因为按最佳拟合法的原则进行分配时,总是找大小最接近请求的空闲块,由于此系统中可能产生一些存储甚小而无法利用的小片内存,同时也保留了那些很大的内存块以备响应后面将发生的内存量特大的请求,从而使整个链表趋向于结点大小差别甚远的状态;而最差拟合法每次都从内存量最大的结点中进行分配,从而使链表中的结点大小趋于均匀,因此它适合用于请求分配的内存下范较窄的系统;而首次拟合法是随机的,因此它介于两者之间,通常适用于系统事先不掌握运行期间可能出现的请求分配和释放的信息情况;
<2>从时间上来比较,首次拟合法在分配时需要查询可利空间表,而回收时仅需插入表头即可;最差拟合法恰恰相反,分配时无需查表,而回收时为将新的“空闲块”插入链表中的适当位置上,无需进行查找;而最佳拟合法无论分配还是回收,均需查找链表,因此最费时间;
总结:不同的情景需采取不同的方法,通常在选择时需考虑下列因素:
<1>用户的逻辑要求;
<2>请求分配量的大小分布;
<3>分配和释放的频率以及效率对系统的重要性;
///
1、边界标识法:是操作系统中进行动态分区分配的一种存储管理方法;(最差拟合法)
原理:系统将所有的空闲块链接在一个双重循环链表结构的可利用空间表中,每个内存区的头部和底部两个边界上分别设有标识,以标识该区域为占用块或空闲块;
# define MAX_SIZE 1000 //模拟内存总大小
# define e 10 //为了防止申请内存残余而限定的条件
typedef struct WORD //用一个结构体来保存结点信息
{
union
{
struct WORD *llink; //指向前驱
struct WORD *uplink; //指向本身
};
int ta