溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行windows操作系統(tǒng)動(dòng)態(tài)分區(qū)分配方式原理詳解與代碼測(cè)試

發(fā)布時(shí)間:2021-10-14 10:45:56 來(lái)源:億速云 閱讀:153 作者:柒染 欄目:編程語(yǔ)言

這期內(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ū)鏈的情況。

原理:

    分區(qū)分配,首次適應(yīng)算法,最佳適應(yīng)算法等。 

 

源代碼(只進(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è)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI