nullnulllinux动态异长存储资源分配算法的实现

发一下牢骚和主题无关:

    每日一道理
坚持的昨天叫立足,坚持的今天叫进取,坚持的明天叫成功。
#ifdef HAVA_CONFIG_H

#include <config.h>

#endif



#include<stdio.h>

#include<stdlib.h>

#define MAPSIZE 100



struct map//store resoure table'struct

{

	int m_addr;

	int m_size;

}

;

struct map map[MAPSIZE];



//best fit

int BF_malloc(struct map *mp,int size)

{

	register int a,s;

/*these var is recommend to be saved in register,so it can be vary fast

 *but only if its size is not bigger thar 'int' can be declared as 'register type'

 *more over,this var may not be in memory,so you can not use a '&' to get its address

 */

	register struct map *bp,*bpp;



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

	{

		if(bp->m_size >=size)

		{

			a=bp->m_addr;

			s=bp->m_size;

			for(bpp=bp;bpp->m_size;bpp++)

			{

				if(bpp->m_size >=size && bpp->m_size <s)

				{

					a=bpp->m_addr;

					s=bpp->m_size;

					bp=bpp;

				}

			}

			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 ); //while not null

			return(a);

		}

	}

	return(-1);

}



//worst fit

int WF_malloc(struct map *mp,int size)

{

	register int a,s;

	register struct map *bp,*bpp;

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

	{

		if(bp->m_size >= size)

		{

			a=bp->m_addr;

			s=bp->m_size;

			for(bpp=bp;bpp->m_size;bpp++)

			{

				if(bpp->m_size>s)

				{

					a=bpp->m_addr;

					s=bpp->m_size;

					bp=bpp;

				}

			}

			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(-1);

}



void mfree(struct map *mp,int aa,int size)

{

	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)

	{

		//if the point has moved and can combine with forword one

		//combine forword

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

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

		{ //combine backword

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

		{

			//combine backword

			bp->m_addr-=size;

			bp->m_size+=size;

		}else if(size)

			do

			{

				//no combination

				//move each one towards the tail

				t=bp->m_addr;

				bp->m_addr=a;

				a=t;

				t=bp->m_size;

				bp->m_size=size;

				bp++;

			}while(size=t);

	}

}



void init()

{

	struct map *bp; //not register

	int addr,size;

	int i=0;

	bp=map;

	printf("Please input starting addr and total size:");

	scanf("%d,%d",&addr,&size);

	bp->m_addr=addr;

	bp->m_size=size;

	(++bp)->m_size=0;//table's tail

}



void show_map()

{

	int i=0;

	struct map *bp;

	bp=map;

	printf("\nCurrent memory map...\n");

	printf("Address\t\tSize\n");

	while(bp->m_size!=0)

	{

		printf("<%d\t\t%d>\n",bp->m_addr,bp->m_size);

		bp++;

	}

	printf("\n");

}



main()

{

	int a,s;

	char c;

	int i;

	init();

	printf("Please input, b for BF, w for WF:");

	scanf("\n%c",&c);

	do

	{

		show_map();

		printf("Please input,1 for request,2for release,0 for exit:");

		scanf("%d",&i);

		switch(i)

		{

		case 1:

			printf("Please input size:");

			scanf("%d",&s);

			if(c=='b')//BF

				a=BF_malloc(map,s);

			else

				a=WF_malloc(map,s);

			if(a==-1)

				printf("request can't be satisfied\n");

			else

				printf("alloc memory at address:%d,siz:%d\n",a,s);

			break;

		case 2:

			printf("Please input addr and size:");

			scanf("%d,%d",&a,&s);

			mfree(map,a,s);

			break;

		case 0:

			exit(0);	

		}

	}while(1);

}

文章结束给大家分享下程序员的一些笑话语录: 一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
于是他去问Lippman。
Lippman说"程序员的未来就是驾驭程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
于是他去问Gates。
Gates说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")

你可能感兴趣的:(linux)