所謂動(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è)所在內(nèi)存塊的狀態(tài)改為空閑狀態(tài),刪除其作業(yè)名,設(shè)置為空。并判斷該空閑塊是否與其他空閑塊相連,若釋放的內(nèi)存空間與空閑塊相連時(shí),則合并為同一個(gè)空閑塊,同時(shí)修改分區(qū)大小及起始地址
設(shè)計(jì)過程我們以空閑分區(qū)鏈為例來說明采用FF算法時(shí)的分配情況,F(xiàn)F算法要求空閑分區(qū)鏈以地址遞增的次序鏈接
了解動(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í)要考慮到四種情況:
菜單
作業(yè)1申請(qǐng)130KB
作業(yè)2申請(qǐng)60KB
作業(yè)3申請(qǐng)100KB
作業(yè)2釋放60KB
作業(yè)4申請(qǐng)200KB
作業(yè)3釋放100KB
作業(yè)1釋放100KB
作業(yè)5申請(qǐng)140KB
作業(yè)6申請(qǐng)60KB
作業(yè)7申請(qǐng)50KB
作業(yè)6釋放60KB
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)的操作
#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)查看詳情吧