真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

操作系統(tǒng)實(shí)驗(yàn)——主存分配與釋放(C語言)-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的柳江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

實(shí)驗(yàn)要求

代碼實(shí)現(xiàn)

運(yùn)行結(jié)果

代碼解析


實(shí)驗(yàn)要求

1、模擬操作系統(tǒng)的主存分配,運(yùn)用可變分區(qū)的存儲(chǔ)管理算法設(shè)計(jì)主存分配和回收程序,并不實(shí)際啟動(dòng)裝入作業(yè)。

2、采用最先適應(yīng)法。

3、當(dāng)一個(gè)新作業(yè)要求裝入主存時(shí),必須查空閑區(qū)表,從中找出一個(gè)足夠大的空閑區(qū)。若找到的空閑區(qū)大于作業(yè)需要量,這是應(yīng)把它分成二部分,一部分為占用區(qū),加一部分又成為一個(gè)空閑區(qū)。

4、當(dāng)一個(gè)作業(yè)撤離時(shí),歸還的區(qū)域如果與其他空閑區(qū)相鄰,則應(yīng)合并成一個(gè)較大的空閑區(qū),登在空閑區(qū)表中。

5、運(yùn)行所設(shè)計(jì)的程序,輸出有關(guān)數(shù)據(jù)結(jié)構(gòu)表項(xiàng)的變化和內(nèi)存的當(dāng)前狀態(tài)。?

代碼實(shí)現(xiàn)
#include#define CAP 1024    //初始化內(nèi)存容量 
#define SYSCAP 100  //系統(tǒng)所占地址,從低位開始 
#define N 1000		//進(jìn)程大個(gè)數(shù) 

//作業(yè)分區(qū) 
struct USED{
	int id,sp,ep,longsize;
}a[N];

//空閑分區(qū) 
struct FREE{
	int id,sp,ep,longsize;
}b[N];

//anum為作業(yè)分區(qū)塊數(shù),bnum為空閑分區(qū)塊數(shù)。初始時(shí)作業(yè)分區(qū)0塊,空閑分區(qū)有1塊
int anum=0,bnum=1;        
void Init()              //初始化函數(shù),程序開始時(shí)只有一個(gè)空閑分區(qū) 
{
	b[0].id=0;b[0].sp=SYSCAP;b[0].ep=CAP;b[0].longsize=b[0].ep-b[0].sp;
	printf("\n\n--------------最先適應(yīng)算法--------------\n"); 
	printf("\n內(nèi)存總量為:%dk\n",CAP); 
	printf("系統(tǒng)占用容量為:%dk\n",SYSCAP);
	printf("---------------------------------------------\n"); 
	printf("空閑分區(qū)    起始地址    結(jié)束地址    長度\n");
	printf("   %d          %d         %d       %d\n",b[0].id,b[0].sp,b[0].ep,b[0].longsize);
	printf("---------------------------------------------\n"); 
}
void Print(int anum,int bnum)      //格式化輸出作業(yè)分區(qū)和空閑分區(qū)表 
{
	int i,j;
	printf("-----------------作業(yè)分區(qū)表---------------------\n"); 
	printf("作業(yè)分區(qū)    起始地址    結(jié)束地址    長度\n");
	for(i=0;i=size)     //找到第一個(gè)能放下進(jìn)程的空閑分區(qū) 
		{
			a[anum].id=anum;			//空閑區(qū)id 
			a[anum].sp=b[i].sp;			//作業(yè)內(nèi)存起始地址等于空閑分區(qū)起始地址 
			a[anum].ep=a[anum].sp+size; //作業(yè)的結(jié)束地址等于起始地址+作業(yè)長度 
			b[i].sp=b[i].sp+size;		//空閑分區(qū)起始地址應(yīng)向后移動(dòng)size 
			a[anum].longsize=size;		//更新作業(yè)地址長度到結(jié)構(gòu)體數(shù)組中 
			b[i].longsize=b[i].ep-b[i].sp;//更新空閑分區(qū)地址長度 
			anum++;						//作業(yè)數(shù)+1 
			break;						//一次只放入一個(gè)作業(yè),結(jié)束查找 
		}
	}
	Print(anum,bnum);                   //打印結(jié)果 
}

void Merge()	//合并空閑分區(qū),查找結(jié)束地址和開始地址重合的地址進(jìn)行合并 
{
	int i,j;
	if(bnum>=1)   //當(dāng)空閑分區(qū)大于等于兩個(gè)時(shí),才需要檢查是否存在可合并的區(qū)間 
	{
		for(i=0;i運(yùn)行結(jié)果

代碼解析

將內(nèi)存總量,系統(tǒng)內(nèi)存進(jìn)行宏定義(有需要的直接修改宏定義的數(shù)據(jù)即可)

定義兩個(gè)結(jié)構(gòu)體數(shù)組,分別用于存放和空閑分區(qū)的狀態(tài)數(shù)據(jù)

anum和bnum為全局變量,分別代表作業(yè)分區(qū)和空閑分區(qū)的數(shù)量?

#include#define CAP 1024    //初始化內(nèi)存容量 
#define SYSCAP 100  //系統(tǒng)所占地址,從低位開始 
#define N 1000		//進(jìn)程大個(gè)數(shù) 
//作業(yè)分區(qū) 
struct USED{
	int id,sp,ep,longsize;
}a[N];
//空閑分區(qū) 
struct FREE{
	int id,sp,ep,longsize;
}b[N];
int anum=0,bnum=1;

初始化函數(shù),在算法程序未開始處理前打印初始數(shù)據(jù)。這里數(shù)組下標(biāo)從0開始

void Init()              //初始化函數(shù),程序開始時(shí)只有一個(gè)空閑分區(qū) 
{
	b[0].id=0;b[0].sp=SYSCAP;b[0].ep=CAP;b[0].longsize=b[0].ep-b[0].sp;
	printf("\n\n--------------最先適應(yīng)算法--------------\n"); 
	printf("\n內(nèi)存總量為:%dk\n",CAP); 
	printf("系統(tǒng)占用容量為:%dk\n",SYSCAP);
	printf("---------------------------------------------\n"); 
	printf("空閑分區(qū)    起始地址    結(jié)束地址    長度\n");
	printf("   %d          %d         %d       %d\n",b[0].id,b[0].sp,b[0].ep,b[0].longsize);
	printf("---------------------------------------------\n"); 
}

打印結(jié)果,按順序打印對(duì)應(yīng)的結(jié)構(gòu)體數(shù)據(jù)

void Print(int anum,int bnum)      //格式化輸出作業(yè)分區(qū)和空閑分區(qū)表 
{
	int i,j;
	printf("-----------------作業(yè)分區(qū)表---------------------\n"); 
	printf("作業(yè)分區(qū)    起始地址    結(jié)束地址    長度\n");
	for(i=0;i

核心算法:將作業(yè)裝入內(nèi)存(具體實(shí)現(xiàn)方法全都寫入注釋里了,如果還有有不懂的可以私信我)

void Put()                   //進(jìn)程裝入作業(yè) 
{
	int size;
	printf("請輸入作業(yè)%d的大小\n",anum);
	scanf("%d",&size);
	int i;
	for(i=0;i=size)     //找到第一個(gè)能放下進(jìn)程的空閑分區(qū) 
		{
			a[anum].id=anum;			//空閑區(qū)id 
			a[anum].sp=b[i].sp;			//作業(yè)內(nèi)存起始地址等于空閑分區(qū)起始地址 
			a[anum].ep=a[anum].sp+size; //作業(yè)的結(jié)束地址等于起始地址+作業(yè)長度 
			b[i].sp=b[i].sp+size;		//空閑分區(qū)起始地址應(yīng)向后移動(dòng)size 
			a[anum].longsize=size;		//更新作業(yè)地址長度到結(jié)構(gòu)體數(shù)組中 
			b[i].longsize=b[i].ep-b[i].sp;//更新空閑分區(qū)地址長度 
			anum++;						//作業(yè)數(shù)+1 
			break;						//一次只放入一個(gè)作業(yè),結(jié)束查找 
		}
	}
	Print(anum,bnum);                   //打印結(jié)果 
}

核心算法:將作業(yè)回收,作業(yè)所占據(jù)的內(nèi)存重新收回變?yōu)榭臻e區(qū)

這里說一下代碼中寫的回收作業(yè)時(shí)為什么要分兩種情況

情況1:

在作業(yè)回收時(shí),進(jìn)入空閑分區(qū)能直接和空閑分區(qū)直接合并,不需要增加新的空閑分區(qū)塊(如下圖)

回收合并后:

情況2:

在作業(yè)回收時(shí),進(jìn)入空閑分區(qū)時(shí)不能直接和空閑分區(qū)直接合并,需要增加新的空閑分區(qū)塊(如下圖,黃色塊為待回收的作業(yè)分區(qū))

回收合并后:

void Remove()//回收作業(yè) 
{
	int i,j,flag=1;//flag是標(biāo)志位 
	printf("請輸入需要回收的作業(yè):\n");
	scanf("%d",&i);
	//回收作業(yè)存在下面兩種情況 
	
	for(j=0;j

排序算法,每次進(jìn)行回收后按地址從大到小進(jìn)行重新排序(這一步處理必須有)

作業(yè)回收時(shí)是任意的,如果先回收了高地址塊不排序,在下一次檢索空閑分區(qū)時(shí)會(huì)先把高地址分出去,顯然這是不符合最佳適應(yīng)算法的定義的

void Sort(int anum,int bnum)//簡單排序函數(shù),將空閑區(qū)間按起始地址遞增的順序排序 
{
	int i,j,min;
	for(i=0;i

合并函數(shù),進(jìn)行檢查再合并處理,這里其實(shí)是在處理前面兩種情況之后出現(xiàn)的第三種情況

回收合并后:?

void Merge()	//合并空閑分區(qū),查找結(jié)束地址和開始地址重合的地址進(jìn)行合并 
{
	int i,j;
	if(bnum>=1)   //當(dāng)空閑分區(qū)大于等于兩個(gè)時(shí),才需要檢查是否存在可合并的區(qū)間 
	{
		for(i=0;i

主函數(shù)。通過用戶輸入來調(diào)用對(duì)應(yīng)處理函數(shù)

int main()
{
	int input;//input 代表程序運(yùn)行狀態(tài)
	Init();//初始化,輸出 
	while(1)//寫一個(gè)死循環(huán) 
	{
		printf("裝入作業(yè):1  回收作業(yè):0  其他輸入結(jié)束程序\n");
		scanf("%d",&input);
		if(input==1)
		{
			Put();
		}else if(input==0)
		{
			Remove();
		}else break;//任意數(shù)字退出循環(huán),程序結(jié)束 
	}
	return 0;
}

感謝閱讀~各位有什么好的建議評(píng)論或者私信我都可以~有沒看懂的地方也可以私信我~

覺得有用的話點(diǎn)個(gè)贊再走吧~

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


文章標(biāo)題:操作系統(tǒng)實(shí)驗(yàn)——主存分配與釋放(C語言)-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/ddjgej.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部