1. 程式人生 > >最佳適應演算法模擬記憶體分配

最佳適應演算法模擬記憶體分配

最佳適應演算法

從全部空閒區中找出能滿足作業要求的,且大小最小的空閒分割槽,這種方法能使碎片儘量小。

問題描述

  • Given five memory partitions of 100 KB, 500 KB, 200 KB, 300 KB, and 600 KB (in order), how would each of the first-fit, best-fit, and worst-fit algorithms place processes of 212 KB, 417 KB, 112 KB, and 426 KB (in order)? Which algorithm makes the most efficient use of memory?

問題解決

  • 為212k分配空間:

    找到第一個跟212k大小最接近的空閒區
    
    找到第四個空閒區300>212k,剩餘88k空閒區
    
  • 為417k分配空間:

    找到第一個跟417k大小最接近的空閒區
    
    找到第二個空閒區500>417,剩餘83k空閒區
    
  • 為112k分配空間:

    找到第一個跟112k大小最接近的空閒區
    
    找到第三個空閒區200>112k,剩餘88k空閒區
    
  • 為426k分配空間:

    找到第一個跟426大小最接近的空閒區
    
    找到第五個空閒區600k>426,剩餘74k空閒區
    

code

#include<stdio.h>
#include<stdlib.h>
#define N 5 #define M 5 int buf[N]={100,500,200,300,600}; int need_dis[M]={212,417,112,426,200}; typedef struct LNode *List; struct LNode{ int order; int buffer; LNode *next; }; List list_init(){ List head,p,m; int i; for(i=0;i<N;i++){ if(i==0){ m=(LNode*)malloc
(sizeof(struct LNode)); if(!m){ printf("Error:memory!\n"); exit(0); } m->order=i; m->buffer=buf[i]; m->next=NULL; head=p=m; } else{ m=(LNode*)malloc(sizeof(struct LNode)); if(!m){ printf("Error:memory wrong\n"); exit(0); } m->order=i; m->buffer=buf[i]; m->next=NULL; p->next=m; p=p->next; } } return head; } void best_fit(List head){ int i,j,k; int min; int order; List p; for(i=0;i<M;i++){ min=-1; order=-1; p=head; while(p){ if(p->buffer>=need_dis[i]){ if(min<0){ min=p->buffer-need_dis[i]; order=p->order; } else{ if(min>p->buffer-need_dis[i]){ min=p->buffer-need_dis[i]; order=p->order; } } } p=p->next; } if(order==-1){ printf("\n"); printf("分配完成%d個\n",i); printf("第%d個程序失敗\n",i+1); printf("\n"); break; } else{ p=head; while(p){ if(p->order==order) p->buffer-=need_dis[i]; p=p->next; } } } } void print(List p){ while(p){ printf("%d:%d\n",p->order,p->buffer); p=p->next; } } int main(){ List p; p=list_init(); printf("分配記憶體前\n"); print(p); best_fit(p); printf("分配記憶體後\n"); print(p); return 0; }

相關推薦

最佳適應演算法模擬記憶體分配

最佳適應演算法 從全部空閒區中找出能滿足作業要求的,且大小最小的空閒分割槽,這種方法能使碎片儘量小。 問題描述 Given five memory partitions of 100 KB, 500 KB, 200 KB, 300 KB, and 600

系統記憶體分配的首次適應演算法最佳適應演算法連結串列模擬實現

#include<iostream> #include<stdlib.h> using namespace std; #define Free 0 //空閒狀態 #define Busy 1 //已用狀態 #define OK 1    //完成

c模擬記憶體分配演算法(首次適應演算法最佳適應演算法,最壞適應演算法

#include<bits/stdc++.h> using namespace std; /*定義記憶體的大小為100*/ #define MEMSIZE 100 /*如果小於此值,將不再分割記憶體*/ #define MINSIZE 2 /*記憶體分割槽空間表結構*/ typedef str

作業系統可變分割槽用C語言實現按最佳適應演算法分配記憶體

類似上一篇部落格,在分配記憶體使用最佳使用演算法,即將空閒區按大小進行排序實現 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struc

首次適應演算法最佳適應演算法(指標模擬分配過程)

實現程式記憶體的動態分配 首次適應演算法: 找到第一個滿足程式的記憶體塊,並將其分配給程式 最佳適應演算法: 找到所有的滿足程式的記憶體塊,並將其中最小的記憶體塊分配給程式 #include <iostream> #include <stri

動態分割槽分配-迴圈首次適應演算法+最佳適應演算法

(文章待更新) (1)採用空閒區表,並增加已分配區表{未分配區說明表、已分配區說明表(分割槽號、起始地址、長度、狀態)}。分配演算法採用最佳適應演算法(記憶體空閒區按照尺寸大小從小到大的排列)和迴圈首次適應演算法,實現記憶體的分配與回收。 #include<iostr

計算機作業系統 ----記憶體空間回收(首次適應演算法最佳適應演算法

#include<iostream.h>  #include<stdlib.h>  #define Free 0 //空閒狀態  #define Busy 1 //已用狀態  #define OK 1    //完成  #define ERROR 0

作業系統實驗報告---主存分配與回收(最佳適應演算法

   動態分割槽主存的分配與回收                                                                      16網路工程二班 孫書魁目的:           1,瞭解動態分割槽分配中,使用的資料結構和演算法  

《深入理解java虛擬機器》筆記2——GC演算法記憶體分配策略

2019大三的寒假計劃——利用在公司每天早起的時間讀書,第一本是周志明老師的《深入理解Java虛擬機器——JVM高階特性與最佳實踐》,這一系列是通過對原文的拜讀與自己理解加上網路上的資料文章整理出的讀書筆記。 說起垃圾收集(Garbage Collection, GC),想

迴圈首次適應演算法、首次適應演算法最佳適應演算法_C語言版

#include <stdio.h> #define getpch(type) (type*)mallloc(sizeof(type)) strct LNode { int size; int start; int end; struct LNode *

模擬記憶體分配

作業系統的上機實驗報告程式碼,這裡分享給大家: #include<stdio.h> #include<stdlib.h> #define PROCESS_NAME_LEN 32 /*程序名稱的最大長度*/ #defi

例項分析首次適應演算法最佳適應演算法、最差適應演算法

關於首次適應演算法、最佳適應演算法和最差適應演算法,先看一下百度百科的解釋,已經說出了三者的最大區別。 首次適應演算法(first-fit):     從空閒分割槽表的第一個表目起查詢該表,把最先能

作業系統: 最佳適配演算法和鄰近適配演算法模擬實現(記憶體分配演算法

實現動態分割槽的分配演算法。 (1) 最佳適配演算法:選擇記憶體空閒塊中最適合程序大小的塊分配。 (2) 鄰近適配演算法:從上一次分配的地址開始查詢符合要求的塊,所查詢到的第一個滿足要求的空閒塊就分配給程序。 模擬新增程序的時候,假定記憶體是一塊完整的空閒區,對於演算法(1

作業系統可變分割槽用C語言實現按首次適應演算法分配記憶體

每個分割槽有4個數據項,起始地址,大小,狀態,程序號,其實地址和大小以KB為單位,狀態分為“已分”或“空閒”,程序號:若分割槽是已分,則填上此分割槽的程序號,若分割槽是空閒,則填入? 這裡先採用首次適應演算法,首次適應演算法是將空閒區按起始地址從小到大排序後,

記憶體分配(首次適應演算法

首次適應演算法:   使用該演算法進行記憶體分配時,從空閒分割槽鏈首開始查詢,直至找到一個能滿足其大小需求的空閒分割槽為止;然後再按照作業的大小,從該分割槽中劃出一塊記憶體分配給請求者,餘下的空閒分割槽仍留在空閒分割槽鏈中。   該演算法傾向於使用記憶體中低地址部分的空閒分

OS-記憶體分配回收(最佳適應,最差適應,首次適應

#include <iostream> using namespace std; class freeMemoryTable { public: int id; int begin; int size; int stat

記憶體分配演算法-(首次分配法和最佳分配法)

/* implement a memory allocation scheme by using algorithms first-fit, next-fit, and best-fit * freelist為空閒區連結串列的頭,它的下一個節點才指向空閒緩衝區 * fr

垃圾收集器與記憶體分配策略——垃圾收集演算法與HotSpot虛擬機器演算法實現

垃圾收集演算法的具體實現涉及大量的程式細節,這裡只描述其演算法的基本思想和發展過程 一、常見的垃圾收集演算法對比如下 收集演算法 具體實現 優點 不足 標記-清除演算法 1、首先標記出所有需要回收的物件 2、標記完成之後,統一回

記憶體分配-----夥伴演算法buddy和slab演算法

記憶體管理問題: 記憶體碎片大小和管理記憶體碎片的效率問題(即空間和時間效率的問題): 記憶體碎片是指當回收一塊記憶體時,一般將記憶體直接放入free連結串列中,由於記憶體越分配越小,記憶體塊就會特別多而且特別小,當需要一塊大的記憶體塊的時候無法找到.原因就在於回收記憶體

磁碟排程演算法記憶體排程,記憶體分配策略

磁碟是可供多個程序共享的裝置,當有多個程序都要求訪問磁碟時,應採用一種最佳排程演算法,以使各程序對磁碟的平均訪問時間最小。由於在訪問磁碟的時間中,主要是尋道時間。因此: 磁碟排程演算法的目標是使磁碟的平均尋道時間最少 1,先來先服務(FIFS,first c