欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何進(jìn)行windows操作系統(tǒng)動態(tài)分區(qū)分配方式原理詳解與代碼測試-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)主要為客戶提供服務(wù)項目涵蓋了網(wǎng)頁視覺設(shè)計、VI標(biāo)志設(shè)計、營銷型網(wǎng)站建設(shè)、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)成都做手機(jī)網(wǎng)站、微商城、網(wǎng)站托管及網(wǎng)頁維護(hù)、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務(wù)器租用、視頻、平面設(shè)計、SEO優(yōu)化排名。設(shè)計、前端、后端三個建站步驟的完善服務(wù)體系。一人跟蹤測試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為成都混凝土攪拌機(jī)行業(yè)客戶提供了網(wǎng)站推廣服務(wù)。

操作系統(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ū)鏈的情況。

原理:

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

 

源代碼(只進(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)

營銷型網(wǎng)站建設(shè)