您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何進(jìn)行windows操作系統(tǒng)動(dòng)態(tài)分區(qū)分配方式原理詳解與代碼測(cè)試,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
操作系統(tǒng)的動(dòng)態(tài)分區(qū)分配方式是操作系統(tǒng)中存儲(chǔ)器管理中連續(xù)分配方式的其中一種,另外三種分配方式分別是:?jiǎn)我贿B續(xù)分配、固定分區(qū)分配、動(dòng)態(tài)分區(qū)分配、動(dòng)態(tài)重定位分區(qū)分配。連續(xù)分配方式,是指為一個(gè)用戶程序分配一個(gè)連續(xù)的內(nèi)存空間。
內(nèi)容:
(1).用C或其他語(yǔ)言分別實(shí)現(xiàn)采用首次適應(yīng)算法和最佳適應(yīng)算法的動(dòng)態(tài)分區(qū)分配過(guò)程和回收過(guò)程。
(2).設(shè)置初始狀態(tài),每次分配和回收后顯示出空閑內(nèi)存分區(qū)鏈的情況。
原理:
源代碼(只進(jìn)行了小規(guī)模的數(shù)據(jù)測(cè)驗(yàn)):
#include<stdio.h> #include<stdlib.h> #define SIZE 640 // 內(nèi)存初始大小 #define MINSIZE 5 // 碎片最小值 enum STATE { Free, Busy }; struct subAreaNode { intaddr; // 起始地址 intsize; // 分區(qū)大小 inttaskId; //作業(yè)號(hào) STATEstate; //分區(qū)狀態(tài) subAreaNode *pre; // 分區(qū)前向指針 subAreaNode *nxt; // 分區(qū)后向指針 }subHead;// 初始化空閑分區(qū)鏈void intSubArea() { //分配初始分區(qū)內(nèi)存 subAreaNode *fir = (subAreaNode*)malloc(sizeof(subAreaNode)); //給首個(gè)分區(qū)賦值 fir->addr = 0; fir->size = SIZE; fir->state = Free; fir->taskId = -1; fir->pre =&subHead; fir->nxt =NULL; //初始化分區(qū)頭部信息 subHead.pre = NULL; subHead.nxt = fir; }// 首次適應(yīng)算法int firstFit(int taskId, int size) { subAreaNode *p = subHead.nxt; while(p!= NULL) { if(p->state ==Free && p->size>= size) { // 找到要分配的空閑分區(qū) if(p->size - size<= MINSIZE) { //整塊分配 p->state = Busy; p->taskId = taskId; } else { //分配大小為size的區(qū)間 subAreaNode *node = (subAreaNode*)malloc(sizeof(subAreaNode)); node->addr = p->addr +size; node->size = p->size -size; node->state = Free; node->taskId = -1; //修改分區(qū)鏈節(jié)點(diǎn)指針 node->pre = p; node->nxt = p->nxt; if(p->nxt != NULL) { p->nxt->pre =node; } p->nxt = node; //分配空閑區(qū)間 p->size = size; p->state = Busy; p->taskId = taskId; } printf("內(nèi)存分配成功!n"); return 1; } p =p->nxt; } printf("找不到合適的內(nèi)存分區(qū),分配失敗...n"); return0; }// 最佳適應(yīng)算法int bestFit(int taskId, int size) { subAreaNode *tar = NULL; inttarSize = SIZE + 1; subAreaNode *p = subHead.nxt; while(p!= NULL) { // 尋找最佳空閑區(qū)間 if(p->state ==Free && p->size>= size &&p->size < tarSize) { tar = p; tarSize = p->size; } p =p->nxt; } if(tar!= NULL) { // 找到要分配的空閑分區(qū) if(tar->size -size <= MINSIZE) { //整塊分配 tar->state = Busy; tar->taskId = taskId; } else { //分配大小為size的區(qū)間 subAreaNode *node = (subAreaNode*)malloc(sizeof(subAreaNode)); node->addr = tar->addr +size; node->size = tar->size -size; node->state = Free; node->taskId = -1; //修改分區(qū)鏈節(jié)點(diǎn)指針 node->pre = tar; node->nxt = tar->nxt; if(tar->nxt != NULL) { tar->nxt->pre =node; } tar->nxt = node; //分配空閑區(qū)間 tar->size = size; tar->state = Busy; tar->taskId = taskId; } printf("內(nèi)存分配成功!n"); return 1; } else{ // 找不到合適的空閑分區(qū) printf("找不到合適的內(nèi)存分區(qū),分配失敗...n"); return 0; } }// 回收內(nèi)存int freeSubArea(int taskId) { intflag = 0; subAreaNode *p = subHead.nxt, *pp; while(p!= NULL) { if(p->state ==Busy && p->taskId ==taskId) { flag = 1; if((p->pre !=&subHead &&p->pre->state ==Free) && (p->nxt != NULL&&p->nxt->state == Free)) { //情況1:合并上下兩個(gè)分區(qū) //先合并上區(qū)間 pp =p; p =p->pre; p->size += pp->size; p->nxt = pp->nxt; pp->nxt->pre = p; free(pp); //后合并下區(qū)間 pp =p->nxt; p->size += pp->size; p->nxt = pp->nxt; if(pp->nxt != NULL) { pp->nxt->pre = p; } free(pp); } else if((p->pre ==&subHead ||p->pre->state == Busy) && (p->nxt != NULL&&p->nxt->state == Free)) { //情況2:只合并下面的分區(qū) pp =p->nxt; p->size += pp->size; p->state = Free; p->taskId = -1; p->nxt = pp->nxt; if(pp->nxt != NULL) { pp->nxt->pre = p; } free(pp); } else if((p->pre !=&subHead &&p->pre->state == Free) && (p->nxt == NULL|| p->nxt->state == Busy)){ //情況3:只合并上面的分區(qū) pp =p; p =p->pre; p->size += pp->size; p->nxt = pp->nxt; if(pp->nxt != NULL) { pp->nxt->pre = p; } free(pp); } else { //情況4:上下分區(qū)均不用合并 p->state = Free; p->taskId = -1; } } p =p->nxt; } if(flag== 1) { // 回收成功 printf("內(nèi)存分區(qū)回收成功...n"); return 1; } else{ // 找不到目標(biāo)作業(yè),回收失敗 printf("找不到目標(biāo)作業(yè),內(nèi)存分區(qū)回收失敗...n"); return 0; } }// 顯示空閑分區(qū)鏈情況void showSubArea() { printf("*********************************************n"); printf("** 當(dāng)前的內(nèi)存分配情況如下: **n"); printf("*********************************************n"); printf("** 起始地址 | 空間大小 | 工作狀態(tài) | 作業(yè)號(hào) **n"); subAreaNode *p = subHead.nxt; while(p!= NULL) { printf("**-----------------------------------------**n"); printf("**"); printf("%d k |", p->addr); printf("%d k |", p->size); printf(" %s |", p->state == Free ? "Free": "Busy"); if(p->taskId> 0) { printf("%d ", p->taskId); } else { printf(" "); } printf("**n"); p =p->nxt; } printf("*********************************************n"); } int main() { intoption, ope, taskId, size; //初始化空閑分區(qū)鏈 intSubArea(); //選擇分配算法 while(1) { printf("請(qǐng)選擇要模擬的分配算法: 0 表示首次適應(yīng)算法,1 表示最佳適應(yīng)算法n"); scanf("%d",&option); if(option == 0) { printf("你選擇了首次適應(yīng)算法,下面進(jìn)行算法的模擬n"); break; } else if(option == 1){ printf("你選擇了最佳適應(yīng)算法,下面進(jìn)行算法的模擬n"); break; } else { printf("錯(cuò)誤:請(qǐng)輸入 0/1nn"); } } //模擬動(dòng)態(tài)分區(qū)分配算法 while(1) { printf("n"); printf("*********************************************n"); printf("** 1: 分配內(nèi)存 2:回收內(nèi)存 0: 退出 **n"); printf("*********************************************n"); scanf("%d",&ope); if(ope == 0)break; if(ope == 1) { // 模擬分配內(nèi)存 printf("請(qǐng)輸入作業(yè)號(hào): "); scanf("%d", &taskId); printf("請(qǐng)輸入需要分配的內(nèi)存大小(KB): "); scanf("%d", &size); if(size <= 0) { printf("錯(cuò)誤:分配內(nèi)存大小必須為正值n"); continue; } // 調(diào)用分配算法 if(option == 0) { firstFit(taskId, size); } else { bestFit(taskId, size); } // 顯示空閑分區(qū)鏈情況 showSubArea(); } else if(ope == 2){ // 模擬回收內(nèi)存 printf("請(qǐng)輸入要回收的作業(yè)號(hào): "); scanf("%d", &taskId); freeSubArea(taskId); // 顯示空閑分區(qū)鏈情況 showSubArea(); } else { printf("錯(cuò)誤:請(qǐng)輸入 0/1/2n"); } } printf("分配算法模擬結(jié)束n"); return0; }
上述就是小編為大家分享的如何進(jìn)行windows操作系統(tǒng)動(dòng)態(tài)分區(qū)分配方式原理詳解與代碼測(cè)試了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。