分享
 
 
 

操作系统(UNIX内核代码笔记之malloc.c 二)

王朝system·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

大家好,我们接着来看过程mfree,上次说过,这个过程算法有点复杂,或许应该说,代码写的不太明朗。我们来具体的看看它:

/*

*Free the previously allocated space aa

*of size units into the specified map.

*Sort aa into both map and combine on

*one or both ends if possible.

*/

mfree(mp,size,aa)

struct map *mp;

{

register struct map *bp;

register int t;

register int a;

a = aa;

/*一个空循环……(1)*/

for (bp = mp; bp->m_addr<=a && bp->m_size!=0; bp++);

/* 判断、回收开始 */

if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) {/*这里判断的是什么?(2)*/

(bp-1)->m_size =+ size;

if (a+size == bp->m_addr) {/* 这里呢?(3)*/

(bp-1)->m_size =+ bp->m_size;

while (bp->m_size) {

bp++;

(bp-1)->m_addr = bp->m_addr;

(bp-1)->m_size = bp->m_size;

}

}

} else {/* 这里是什么样的情况?(4)*/

if (a+size == bp->m_addr && bp->m_size) {

bp->m_addr =- size;

bp->m_size =+ size;

} else if (size) do {/* 下面的过程呢?(5)*/

t = bp->m_addr;

bp->m_addr = a;

a = t;

t = bp->m_size;

bp->m_size = size;

bp++;

} while (size = t);

}

}

/*----------------------------------- */

在上次说到malloc过程,想必大家可以看出,mp表有效部分(未分配区)的结束的标志是:

bp->m_size==0 为真,

这次,我们先说说UNIX存储管理的回收机制。一个待回收的地址和大小作为参数传递给mfree后,UNIX将把对应该地址和大小的一个存储区返回给mp指定的“资源图”。

只是,要注意的是,如果该区在前后有有效的存储区时,要注意将它们合并,则还有mp表的重整,也是随之而来的问题。

我们来看看,比如可能的一种情况是这样:

若 a之前有有效存储区可合并:

(bp-1)->m_addr+(bp-1)->m_size == a 为真,

这就是我们的(2)的作用。则操作为:

(bp-1)->m_size =+ size;

但同时,我们要注意和后一有效存储区的合并,即

a+size == bp->m_addr 为真,

这是(3)的作用。如果应该合并,则操作为:

(bp-1)->m_size =+ bp->m_size;

while (bp->m_size) {

bp++;

(bp-1)->m_addr = bp->m_addr;

(bp-1)->m_size = bp->m_size;

}

但是,如果不可与前边的有效存储区合并,而可与其后的合并,则可能是这个情况:

则可通过:

a+size == bp->m_addr && bp->m_size,

来判断,这是(4)的作用。若如此,则操作为:

bp->m_addr =- size;

bp->m_size =+ size;

那么,还有一种情况,即与前与后都无法合并,可能是这个样子:

这个需要一些复杂的过程。但我要首先向您说明的是,不仅这种情况可以是前与后均不可合并,您来看看这种可能的情况:

这就是说,一直到有效存储区结束,还没有到达a。此时判断为:

bp->m_size==0 为真,

您来细细的看这个操作:

if (size) do {

t = bp->m_addr;

bp->m_addr = a;

a = t;

t = bp->m_size;

bp->m_size = size;

bp++;

} while (size = t);

尤其要注意t的用途,它首先做地址的中间变量,然后做空间大小的中间变量。这就是(5)的过程。我问您,最后当调整结束后,若指向结束处,bp->m_size==0 为真可曾满足?

现在您回头看看,就会明白空循环体(1)的作用,只有当

bp->m_addr<=a && bp->m_size!=0 为真,

不满足时,我们就到达了回收操作的时机了。可是,如果不看懂后边的代码,又如何明白它呢?

所以说这个算法的实现有点不明朗,但好处就是,效率很高,几乎不可能再提高了!

现在您回头看看整个文件,是不是感觉代码很优美?哦,这些日子我感觉有些心伤(因为觉得自己好笨,有太多不懂的,又问自己是不是又浪费时间了,感觉略微迷茫)。可是,在看这些代码,又觉得了渴望的萌动,我们也要努力哦,创造这样优美的代码与软件!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有