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

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

首次適應(yīng)算法動(dòng)態(tài)分區(qū)分配方式的模擬C語言——課程設(shè)計(jì)實(shí)習(xí)-創(chuàng)新互聯(lián)

設(shè)計(jì)目的

所謂動(dòng)態(tài)分區(qū)分配,就是指內(nèi)存在初始時(shí)不會(huì)劃分區(qū)域,而是會(huì)在進(jìn)程裝入時(shí),根據(jù)所要裝入的進(jìn)程大小動(dòng)態(tài)地對(duì)內(nèi)存空間進(jìn)行劃分,以提高內(nèi)存空間利用率,降低碎片的大小 動(dòng)態(tài)分區(qū)分配算法有以下四種:

網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作的開發(fā),更需要了解用戶,從用戶角度來建設(shè)網(wǎng)站,獲得較好的用戶體驗(yàn)。成都創(chuàng)新互聯(lián)公司多年互聯(lián)網(wǎng)經(jīng)驗(yàn),見的多,溝通容易、能幫助客戶提出的運(yùn)營(yíng)建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇成都創(chuàng)新互聯(lián)公司,不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來訪用戶感受到浩方產(chǎn)品的價(jià)值服務(wù)。
  • 首次適應(yīng)算法(First Fit)
    空閑分區(qū)以地址遞增的次序鏈接。分配內(nèi)存時(shí)順序查找,找到大小滿足要求的第一個(gè)空閑分區(qū)就進(jìn)行分配
  • 鄰近適應(yīng)算法(Next Fit)
    又稱循環(huán)首次適應(yīng)法,由首次適應(yīng)法演變而成,不同之處是分配內(nèi)存時(shí)從上一次查找結(jié)束的位置開始繼續(xù)查找
  • 最佳適應(yīng)算法(Best Fit)
    空閑分區(qū)按容量遞增形成分區(qū)鏈,找到第一個(gè)能滿足要求的空閑分區(qū)就進(jìn)行分配
  • 最壞適應(yīng)算法(Next Fit)
    又稱大適應(yīng)算法(Largest Fit),空閑分區(qū)以容量遞減的次序鏈接,找到第一個(gè)能滿足要求的空閑分區(qū)(也就是大的分區(qū))就進(jìn)行分配
設(shè)計(jì)內(nèi)容及要求
  • 用C語言實(shí)現(xiàn)采用首次適應(yīng)算法的動(dòng)態(tài)分區(qū)分配過程alloc()和回收過程free()。其中,空閑分區(qū)通過空閑分區(qū)鏈表來管理,在進(jìn)行內(nèi)存分配時(shí),系統(tǒng)優(yōu)先使用空閑區(qū)低端的空間
  • 假設(shè)初始狀態(tài)如下,可用的內(nèi)存空間為640KB,并有下列的請(qǐng)求序列;采用首次適應(yīng)算法進(jìn)行內(nèi)存塊的分配和回收,同時(shí)顯示內(nèi)存塊分配和回收后空閑內(nèi)存分區(qū)鏈的情況
  • 假設(shè)初始狀態(tài)如下,可用的內(nèi)存空間為640KB,并有下列的請(qǐng)求序列;
    作業(yè)1申請(qǐng)130KB
    作業(yè)2申請(qǐng)60KB
    作業(yè)3申請(qǐng)100KB
    作業(yè)2釋放60KB
    作業(yè)4申請(qǐng)200 KB
    作業(yè)3釋放100 KB
    作業(yè)1釋放130 KB
    作業(yè)5申請(qǐng)140 KB
    作業(yè)6申請(qǐng)60 KB
    作業(yè)7申請(qǐng)50KB
    作業(yè)6釋放60 KB
    請(qǐng)采用循環(huán)首次適應(yīng)算法進(jìn)行內(nèi)存塊的分配和回收,同時(shí)顯示內(nèi)存塊分配和回收后空閑內(nèi)存分區(qū)鏈的情況。
設(shè)計(jì)準(zhǔn)備 首次適應(yīng)算法:
  • 算法思想:
    將空閑分區(qū)鏈以地址遞增的順序連接;在進(jìn)行內(nèi)存分配時(shí),從鏈?zhǔn)组_始順序查找,直到找到一塊分區(qū)的大小可以滿足需求時(shí),按照該作業(yè)的大小,從該分區(qū)中分配出內(nèi)存,將剩下的空閑分區(qū)仍然鏈在空閑分區(qū)鏈中
  • 優(yōu)點(diǎn):高址部分的大的空閑分區(qū)得到保留,為大作業(yè)的內(nèi)存分配創(chuàng)造了條件
  • 缺點(diǎn):(1)每次都是優(yōu)先利用低址部分的空閑分區(qū),造成低址部分產(chǎn)生大量的外碎片。(2)每次都是從低址部分查找,使得查找空閑分區(qū)的開銷增大
內(nèi)存回收:

將釋放作業(yè)所在內(nèi)存塊的狀態(tài)改為空閑狀態(tài),刪除其作業(yè)名,設(shè)置為空。并判斷該空閑塊是否與其他空閑塊相連,若釋放的內(nèi)存空間與空閑塊相連時(shí),則合并為同一個(gè)空閑塊,同時(shí)修改分區(qū)大小及起始地址

設(shè)計(jì)過程

我們以空閑分區(qū)鏈為例來說明采用FF算法時(shí)的分配情況,F(xiàn)F算法要求空閑分區(qū)鏈以地址遞增的次序鏈接

  • 在分配內(nèi)存時(shí),從鏈?zhǔn)组_始順序查找,直至找到一個(gè)大小能滿足要求的空閑分區(qū)為止
  • 然后再按照作業(yè)的大小,從該分區(qū)中劃出一塊內(nèi)存空間分配給請(qǐng)求者,余下的空閑分區(qū)仍留在空閑鏈中
  • 若從鏈?zhǔn)字敝伶溛捕疾荒苷业揭粋€(gè)能滿足要求的分區(qū),則此次內(nèi)存分配失敗,返回

了解動(dòng)態(tài)分區(qū)分配中使用的數(shù)據(jù)結(jié)構(gòu)和分配算法,并進(jìn)一步加深對(duì)動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式及其實(shí)現(xiàn)過程的理解。采用首次適應(yīng)算法的動(dòng)態(tài)分區(qū)分配過程alloc()和回收過程free()。空閑分區(qū)通過空閑分區(qū)鏈表來管理,在進(jìn)行內(nèi)存分配時(shí),系統(tǒng)優(yōu)先使用空閑區(qū)低端的空間,即每次分配內(nèi)存空間是總是從低址部分開始進(jìn)行循環(huán),找到第一個(gè)合適的空間,便按作業(yè)所需分配的大小分配給作業(yè)。 作業(yè)完成時(shí),需要釋放作業(yè)所占空間,此時(shí)要考慮到四種情況:

  • 回收區(qū)與插入點(diǎn)的前一個(gè)空閑分區(qū)相鄰接。此時(shí)將二者合并,修改前一分區(qū)的大小。
  • 回收區(qū)與插入點(diǎn)的后一空閑分區(qū)相鄰接,將二者合并,用回收區(qū)的首址作為新空閑區(qū)的首址。
  • 回收區(qū)同時(shí)與插入點(diǎn)的前后兩個(gè)空閑分區(qū)相鄰接,三者合并,使用前一空閑分區(qū)的表項(xiàng)和首址。
  • 回收區(qū)單獨(dú)存在。
設(shè)計(jì)結(jié)果并分析

菜單
菜單
作業(yè)1申請(qǐng)130KB
1
作業(yè)2申請(qǐng)60KB
2
作業(yè)3申請(qǐng)100KB
3
作業(yè)2釋放60KB
4
作業(yè)4申請(qǐng)200KB
5
作業(yè)3釋放100KB
6
作業(yè)1釋放100KB
7
作業(yè)5申請(qǐng)140KB
8
作業(yè)6申請(qǐng)60KB
9
作業(yè)7申請(qǐng)50KB
10
作業(yè)6釋放60KB
11

原理框圖

在這里插入圖片描述

模塊設(shè)計(jì)
  • void initNode(struct nodespace *p)
    創(chuàng)建一個(gè)雙鏈表存儲(chǔ)信息

  • void myMalloc1(int teskid,int size,struct nodespace *node)
    申請(qǐng)空間函數(shù)

  • void myFree(int teskid,struct nodespace *node)
    釋放空間函數(shù)

  • void printNode(struct nodespace *node)
    打印輸出節(jié)點(diǎn)存儲(chǔ)信息了,即內(nèi)存申請(qǐng)剩余情況

  • void destory(struct nodespace *node)
    退出程序并銷毀清空節(jié)點(diǎn)

  • void menu()
    主菜單,提示用戶進(jìn)行相應(yīng)的操作

C語言源程序——建議使用Devc ++ 運(yùn)行
#include#includestruct nodespace{int teskid;   // 作業(yè)號(hào) 
	int begin;    // 開始地址 
	int size;     // 大小 
	int status;   // 狀態(tài) 0代表占用,1代表空閑 
	struct nodespace *next;  // 后指針 
};
void initNode(struct nodespace *p){if(p == NULL){//如果為空則新創(chuàng)建一個(gè) 
		p = (struct nodespace*)malloc(sizeof(struct nodespace));
	}
	p->teskid = -1;
	p->begin = 0;
	p->size = 640;
	p->status = 1;
	p->next =NULL; 
}  
void myMalloc1(int teskid,int size,struct nodespace *node){while(node != NULL){if(node->status == 1){//空閑的空間 
			if(node->size >size){//當(dāng)需求小于剩余空間充足的情況 
				//分配后剩余的空間 
				struct nodespace *p = (struct nodespace*)malloc(sizeof(struct nodespace));
				p->begin = node->begin + size;
				p->size = node->size - size;
				p->status = 1;
				p->teskid = -1;
				//分配的空間 
				node->teskid = teskid; 
				node->size = size;
				node->status = 0;
				//改變節(jié)點(diǎn)的連接 
				p->next = node->next; 
				node->next = p;
				printf("==================================分配內(nèi)存成功!==================================\n");
				break; 
			}else if(node->size == size){//需求空間和空閑空間大小相等時(shí) 
				node->teskid = teskid; 
				node->size = size;
				node->status = 0;
				printf("==================================分配內(nèi)存成功!==================================\n");
				break;
			}	
		}
		if(node->next == NULL){	printf("===============================分配失敗,沒有足夠的空間!=============================\n");
			break;
		}
		node = node->next;
	}
} 
void myFree(int teskid,struct nodespace *node){if(node->next == NULL && node->teskid == -1){printf("================================您還沒有分配任何作業(yè)!================================\n");
	}
	
	while(node != NULL){if(node->status == 1 && node->next->status ==0 && node->next->teskid == teskid){	
			struct nodespace *q = node->next;
			node->next = node->next->next;
			free(q);
			printf("==================================釋放內(nèi)存成功!==================================\n");
			if(node->next->status == 1){//下一個(gè)空間是空閑空間時(shí) 
				node->size = node->size + node->next->size;
				struct nodespace *q = node->next;
				node->next = node->next->next;
				free(q);
				printf("==================================釋放內(nèi)存成功!==================================\n");
			}
			break;
		}else if(node->status == 0 && node->teskid == teskid){//釋放空間和空閑空間不連續(xù)時(shí)  
			node->status = 1;
			node->teskid = -1;
			if(node->next != NULL && node->next->status == 1){//下一個(gè)空間是空閑空間時(shí) 
				node->size = node->size + node->next->size;
				struct nodespace *q = node->next;
				node->next = node->next->next;
				free(q);
			}
			printf("==================================釋放內(nèi)存成功!==================================\n");
			break;
		}else if(node->next == NULL){//作業(yè)號(hào)不匹配時(shí) 
			printf("==================================沒有此作業(yè)??!==================================\n");
			break;
		}
		node = node->next;
	}
	
	 
} 
void printNode(struct nodespace *node){printf("                        內(nèi)存情況                        \n"); 
	printf(" -------------------------------------------------------\n");
	printf("| 起始地址\t結(jié)束地址\t大小\t狀態(tài)\t作業(yè)號(hào)\t|\n");
	while(node != NULL){if(node->status==1){	printf("| %d\t\t%d\t\t%dKB\tfree\t 無\t|\n", node->begin + 1, node->begin+node->size, node->size);
		}else{	printf("| %d\t\t%d\t\t%dKB\tbusy\t %d\t|\n", node->begin + 1, node->begin+node->size, node->size, node->teskid);
		}
		node = node->next;
	}
	printf(" -------------------------------------------------------\n");
}
void destory(struct nodespace *node){struct nodespace *q = node;
	while(node != NULL){node = node->next;
		free(q);
		q = node;
	}
} 
void menu(){printf("\n"); 
	printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");
		printf("\t\t\t\t   │    首次適應(yīng)算法的動(dòng)態(tài)分區(qū)分配方式模擬      │\n");
		printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");
		printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");
		printf("\t\t\t\t   │                                            │\n");
		printf("\t\t\t\t   │                 1. 申請(qǐng)內(nèi)存                │\n");
		printf("\t\t\t\t   │                                            │\n");
		printf("\t\t\t\t   │                 2. 回收內(nèi)存                │\n");
		printf("\t\t\t\t   │                                            │\n");
		printf("\t\t\t\t   │                 3. 查看內(nèi)存情況            │\n");
		printf("\t\t\t\t   │                                            │\n");
		printf("\t\t\t\t   │                 4. 退出                    │\n");
		printf("\t\t\t\t   │                                            │\n");
		printf("\t\t\t\t   └────────────────────────────────────────────┘\n");
		printf("\t\t\t\t\t\t  請(qǐng)您選擇(1-4):\t");
}
 
int main(){// node為整個(gè)空間 
	system("color 0f");
	//system("mode con cols=120 lines=50");
	struct nodespace *init = (struct nodespace*)malloc(sizeof(struct nodespace));
	struct nodespace *node = NULL;
	initNode(init);			//初始化主鏈 
	node = init; 			//指向鏈表頭 
	int option; 
	int teskid;
	int size;
	while(1){menu();		//打印想要進(jìn)行的操作
		scanf("%d",&option);
		if(option == 1){	printf("請(qǐng)輸入作業(yè)號(hào);");
			scanf("%d",&teskid);
			printf("此作業(yè)申請(qǐng)的空間大小(KB):");
			scanf("%d",&size);
			myMalloc1(teskid,size,node);
			printf("\n"); 
			printNode(node);
		}else if(option == 2){	printf("請(qǐng)輸入作業(yè)號(hào):");
			scanf("%d",&teskid);
			myFree(teskid,node);
			printf("\n"); 
			printNode(node);
		}else if(option == 3){	printNode(node);
		}else if(option == 4){	destory(node);
			initNode(init);
			node = init;
			break;
		}else{	printf("===========================您的輸入有誤,請(qǐng)重新輸入!============================\n");
			continue;
		}
	}
return 0;
}

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


新聞標(biāo)題:首次適應(yīng)算法動(dòng)態(tài)分區(qū)分配方式的模擬C語言——課程設(shè)計(jì)實(shí)習(xí)-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://weahome.cn/article/ieigj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部