分享
 
 
 

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

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

暑期在校,每天看些数学和外语,得不到时间正经的写程序。恰好有莱昂氏的UNIX版本6的内核代码分析,考虑到学校从没有训练我们“阅读理解代码”的课程,就决定读下去。这一下子,发现这代码竟如诗句一般,简练而优美。不忍独享,也不知大家可有时间来细分辨这一行一行的“诗”,就想着间或拿出来一点,关系到算法而又不难懂的,与大家共同学习。

这次,我们看一看操作系统存储管理的部分内容。

内存的空间在分配给进程的时候,有几个算法可以为新创建或换进的进程分配空间。当然,我们假设存储管理程序知道要分配的内存大大小。

最简单的算法是首先适配算法(first fit)。存储管理程序沿着内存段链表搜索,直到找到第一个足够大的空闲区,除非空闲区大小和要分配的空间大小正好一样,否则将该区分为两个部分,把一部分分配给进程使用,另一部分仍是未分配区。

下次适配算法(next fit)是对首先适配算法的一个小小改动而来。它的工作方式与首先适配算法相同,不同的是,每次找到合适的空闲区时都记录当时的位置,下次寻找空闲区时就从上次结束的地方开始搜索,而不从头开始。

还有几个算法是常用的。一个是最佳适配算法(best fit),它找出恰好够用的最小的空闲区来分配。当然,如果每次找出够用的最大的空闲区,那就是另外一种算法了。还有一种,就是快速适配算法(quick fit),它给那些常用到的长度的空闲区设立单独的链表。

记得在学操作系统的时候,眼睛都是盯着后面的算法。想实际的操作系统中,使用的应该是它们吧?现在明白了,算法在于实用,简单高效才是最好。

我们看UNIX的内核代码,呵呵,看一看实际的操作系统之算法实现程序。

如下:

/*percy说明:

*此文件乃 malloc.c ,主要过程为 malloc 和 mfree ,

*以对存储资源进行管理。

*编排方式遵照 莱昂氏UNIX版本6内核源代码 编排方式,

*为原 2500行 至 2599行。

*此次编辑器是VS.NET内置编辑器。

* 2003/8/15

*/

#

/*

*/

/*

*Structrue of the coremap and swapmap

*arrays.Consists of non-zero count

*and base address of that many

*contiguous units.

*(The coremap unit is 64 bytes,

*the swapmap unit is 512 bytes)

*The addresses are increasing and

*the list is terminated with the

*first zero count.

*/

struct map

{

char *m_size;

char *m_addr;

};

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

/*

*Allocate size units from the siven

*map.Return the base of the allocated

*space.

*Algorithm is first fit.

*/

malloc(mp,size)

struct map *mp;

{

register int a;

register struct map *bp;

for (bp=mp; bp->m_size; bp++) {

if (bp->m_size >= size) {

a = bp->m_addr;

bp->m_addr =+ size;

if ((bp->m_size =- size) == 0)

do {

bp++;

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

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

return(a);

}

}

return(0);

}

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

/*

*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;

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

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

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

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

(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 {

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

bp->m_addr =- size;

bp->m_size =+ size;

} else 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);

}

}

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

我们选的两个过程,这一次详细看看malloc,您来看一下,这是个首先适配算法的实现。

for (bp=mp; bp->m_size; bp++) {

if (bp->m_size >= size) {

a = bp->m_addr;

bp->m_addr =+ size;

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

/* 如果这里判断不为0 ……*/

if ((bp->m_size =- size) == 0)

do {

bp++;

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

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

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

return(a);

}

}

return(0);

如果那里判断不为0,说明寻到的空闲区比要分配的空间大,在内存中可能是这个情况:

则执行的是:

a = bp->m_addr;

bp->m_addr =+ size;

/*事实上还有这一句,在if判断里的,您可不要忘了*/

bp->m_size =- size;

return(a);

如果空闲区和要分配的空间一样大,那么有点麻烦了,因为mp链表就需要您来整理了,内存中的情况可能如下:

看操作(do-while):

if ((bp->m_size =- size) == 0)

do {

bp++;

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

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

这样才算把这一空间分配出去。

这一段程序,想有点c语言基础的都能看的明白,可是,您若想修改它,那可不容易。就这个算法来讲,写的几乎已无可改处。可是,它又在整个系统中(UNIX6),扮演如此重要的角色。我常常的想,如果我写程序能如此,则有何憾?!

另外的一个过程,是mfree,就有点麻烦了,我们下次就说说它;可是现在,您能动手分析一下它吗?

最后要说的是,您不妨准备准备,咱们来修改一下操作系统的内核。呵呵,分配算法就改为最佳适配算法(best fit)吧,这个程序应该如何写呢?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有