這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進(jìn)行windows操作系統(tǒng)動態(tài)分區(qū)分配方式原理詳解與代碼測試,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

操作系統(tǒng)的動態(tài)分區(qū)分配方式是操作系統(tǒng)中存儲器管理中連續(xù)分配方式的其中一種,另外三種分配方式分別是:單一連續(xù)分配、固定分區(qū)分配、動態(tài)分區(qū)分配、動態(tài)重定位分區(qū)分配。連續(xù)分配方式,是指為一個用戶程序分配一個連續(xù)的內(nèi)存空間。
內(nèi)容:
(1).用C或其他語言分別實現(xiàn)采用首次適應(yīng)算法和很好適應(yīng)算法的動態(tài)分區(qū)分配過程和回收過程。
(2).設(shè)置初始狀態(tài),每次分配和回收后顯示出空閑內(nèi)存分區(qū)鏈的情況。
原理:
源代碼(只進(jìn)行了小規(guī)模的數(shù)據(jù)測驗):
#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è)號
STATEstate; //分區(qū)狀態(tài)
subAreaNode *pre; // 分區(qū)前向指針
subAreaNode *nxt; // 分區(qū)后向指針
}subHead;// 初始化空閑分區(qū)鏈void intSubArea()
{
//分配初始分區(qū)內(nèi)存
subAreaNode *fir = (subAreaNode*)malloc(sizeof(subAreaNode));
//給首個分區(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:合并上下兩個分區(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è)號 **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("請選擇要模擬的分配算法:
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("錯誤:請輸入 0/1nn");
}
} //模擬動態(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("請輸入作業(yè)號: ");
scanf("%d", &taskId);
printf("請輸入需要分配的內(nèi)存大小(KB): ");
scanf("%d", &size);
if(size <= 0) {
printf("錯誤:分配內(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("請輸入要回收的作業(yè)號: ");
scanf("%d", &taskId);
freeSubArea(taskId);
// 顯示空閑分區(qū)鏈情況
showSubArea();
} else {
printf("錯誤:請輸入 0/1/2n");
}
}
printf("分配算法模擬結(jié)束n");
return0;
}上述就是小編為大家分享的如何進(jìn)行windows操作系統(tǒng)動態(tài)分區(qū)分配方式原理詳解與代碼測試了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章標(biāo)題:如何進(jìn)行windows操作系統(tǒng)動態(tài)分區(qū)分配方式原理詳解與代碼測試-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.chinadenli.net/article26/dgeccg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、手機(jī)網(wǎng)站建設(shè)、App設(shè)計、企業(yè)網(wǎng)站制作、App開發(fā)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容