1. 程式人生 > >作業系統: 最佳適配演算法和鄰近適配演算法的模擬實現(記憶體分配演算法)

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

實現動態分割槽的分配演算法。

(1) 最佳適配演算法:選擇記憶體空閒塊中最適合程序大小的塊分配。

(2) 鄰近適配演算法:從上一次分配的地址開始查詢符合要求的塊,所查詢到的第一個滿足要求的空閒塊就分配給程序。

模擬新增程序的時候,假定記憶體是一塊完整的空閒區,對於演算法(1)來說,分配的時候遍歷所有的空閒記憶體塊,找出其中最適合的一塊,注意此時記憶體分割槽的總塊數可能已經發生了變化;

對於演算法(2)來說,則需要從上次分配的記憶體塊(使用變數記錄即可)接著向下找到第一個滿足條件的塊即可,記憶體分割槽的總塊可能也已經發生了變化。

模擬刪除程序(釋放記憶體)的時候,則需要注意如果當前記憶體塊的上下有空閒塊,則需要將其合併為一整個空閒塊,也需要注意記憶體總塊的數量變化。

最佳適配演算法

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
	int num;
	int is_data;
};
int main()
{
	vector<node> cluster;
	vector<node> TTemp;
	map <int,int> mp;
	mp.clear();
	node temp;
	int R_num;
	int curnum;
	
	temp.is_data=0;
	temp.num=10;
	cluster.push_back(temp);
   
    cout<<"請使用add命令新增一個程序,delete命令刪除一個程序!"<<endl;
    while(1)
    {
   	   string s;
   	   cin>>s;
   	   if(s=="add")
   	   {
      	cout<<"請輸入程序號及其的大小"<<endl;
	   	cin>>R_num>>curnum;

		int flag=0;
		int curIndex;
	
		int cmp=11;
    	for(int i=0;i<cluster.size();i++)
		{
			if(cluster[i].is_data==0&&cluster[i].num>=curnum)
			{
				flag=1;
				if(cluster[i].num-curnum<cmp)
				{
					curIndex=i;
					cmp=cluster[i].num-curnum;
				}
			}
		}
		if(flag)
		{
			cluster[curIndex].is_data=1;
			mp[R_num]=curIndex;

			node op;
			TTemp.clear();
			int is_flag=0;
			if(cluster[curIndex].num>curnum)
			{
				op.is_data=0;
				op.num=cluster[curIndex].num-curnum;
				is_flag=1;
			}

		for(int i=0;i<cluster.size();i++)
		{
			if(i==curIndex)
			{
				cluster[curIndex].num=curnum;
				TTemp.push_back(cluster[curIndex]);
				mp[R_num]=i;

				if(is_flag)
				{
					TTemp.push_back(op);
				}
			}
			else
			TTemp.push_back(cluster[i]);
		}
		
		cluster.swap(TTemp);
		
		
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;
		
	}
	else
	{
		cout<<"記憶體不足!"<<endl;
	}
 }
   	      
     else if(s=="delete")
     {
   	   	  	int deletenum;
			cout<<"請輸入刪除的程序:"<<endl;
			cin>>deletenum;

		int i=mp[deletenum];
		while(--i>=0 && cluster[i].is_data==0)
		{
		
		}
		int j=mp[deletenum];
		while(++j<cluster.size() && cluster[j].is_data==0)
		{
		
		}

		node kk;
		kk.num=0;
		for(int e=i+1;e<=j-1;e++)
		{
			kk.num+=cluster[e].num;
		}	
		kk.is_data=0;

		TTemp.clear();
		for(int p=0;p<cluster.size();)
		{
			if(p==i+1)
			{
				p=j;
				TTemp.push_back(kk);
			}
			else{
				TTemp.push_back(cluster[p]);
	      		p++;
		}
		
	}
		cluster.swap(TTemp);
	
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;

   	   }
   }
	return 0;
}


鄰近適配演算法
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
	int num;
	int is_data;
};
int main()
{
	vector<node> cluster;
	vector<node> TTemp;
	map <int,int> mp;
	mp.clear();
	node temp;
	int R_num;
	int curnum;
	int last_ID=0;
	temp.is_data=0;
	temp.num=10;
	cluster.push_back(temp);
   
    cout<<"請使用add命令新增一個程序,delete命令刪除一個程序!"<<endl;
  
    while(1)
    {
   	   string s;
   	   cin>>s;
   	   if(s=="add")
   	   {
      	cout<<"請輸入程序號及其的大小"<<endl;
	   	cin>>R_num>>curnum;

		int flag=0;
		int curIndex;
		
    	//for(int i=beg_pos;i<cluster.size();i++)
    	int i=last_ID+1;
    	while(1)
		{
			if(i==cluster.size())
			i=0;
			if(cluster[i].is_data==0&&cluster[i].num>=curnum)
			{
				flag=1;
			    curIndex=i;
			    break;
			}
			i++;
		}
		if(flag)
		{
			cluster[curIndex].is_data=1;
			mp[R_num]=curIndex;

			node op;
			TTemp.clear();
			int is_flag=0;
			if(cluster[curIndex].num>curnum)
			{
				op.is_data=0;
				op.num=cluster[curIndex].num-curnum;
				is_flag=1;
			}

		for(int i=0;i<cluster.size();i++)
		{
			if(i==curIndex)
			{
				cluster[curIndex].num=curnum;
				TTemp.push_back(cluster[curIndex]);
				mp[R_num]=i;
                last_ID=i; 
				if(is_flag)
				{
					TTemp.push_back(op);
				}
			}
			else
			TTemp.push_back(cluster[i]);
		}
		
		cluster.swap(TTemp);
		
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;
		
	}
	else
	{
		cout<<"記憶體不足!"<<endl;
	}
 }
   	      
     else if(s=="delete")
     {
   	   	  	int deletenum;
			cout<<"請輸入刪除的程序:"<<endl;
			cin>>deletenum;

		int i=mp[deletenum];
		while(--i>=0 && cluster[i].is_data==0)
		{
		
		}
		int j=mp[deletenum];
		while(++j<cluster.size() && cluster[j].is_data==0)
		{
		
		}

		node kk;
		kk.num=0;
		for(int e=i+1;e<=j-1;e++)
		{
			kk.num+=cluster[e].num;
		}	
		kk.is_data=0;

		TTemp.clear();
		for(int p=0;p<cluster.size();)
		{
			if(p==last_ID)
			last_ID=TTemp.size();
			if(p==i+1)
			{
				p=j;
				TTemp.push_back(kk);
			}
			else{
				TTemp.push_back(cluster[p]);
	      		p++;
		}
		
	}
		cluster.swap(TTemp);
	
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;

   	   }
   }
	return 0;
}


相關推薦

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

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

講座 跨過演算法程式之間的那道溝帶視訊連結

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

對於iphone X 相容性處理的css方法js方法

1. 如果想全屏覆蓋,html裡面請使用 <meta name="viewport" content="width=device-width,initial-scale=1,viewport-

iPhone X以及iOS 11可能出現的常見崩潰info.plist配置

iPhone X適配 程式啟動圖,引導圖等 iPhone X畫素尺寸1125x2436,也就是說,你的啟動圖或者是閃屏頁,App引導圖等得新加一個圖了,另外iPhone X用的是三倍圖,開發用的邏輯解

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

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

查詢演算法 淺談演算法資料結構: 七 二叉查詢樹 淺談演算法資料結構: 十一 雜湊表

閱讀目錄 1. 順序查詢 2. 二分查詢 3. 插值查詢 4. 斐波那契查詢 5. 樹表查詢 6. 分塊查詢 7. 雜湊查詢   查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文

作業系統】C語言模擬作業系統實現動態分割槽分配演算法

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #defi

作業系統常見記憶體分配演算法及優缺點

常見記憶體分配演算法及優缺點如下:  (1)首次適應演算法。使用該演算法進行記憶體分配時,從空閒分割槽鏈首開始查詢,直至找到一個能滿足其大小需求的空閒分割槽為止。然後再按照作業的大小,從該分割槽中劃出一塊記憶體分配給請求者,餘下的空閒分割槽仍留在空閒分割槽鏈中。  該演算法

路徑最短問題演算法總結實現Floyd,Dijkstra,SPFA

題目描述:求兩個點之間的最短路徑輸入:兩個整數n,m(1<=n,m<=100)n的含義是節點的個數,m的含義是邊的個數,接下來的m行輸入三個整數i j c,分別表示開始結束節點和之間的費用輸出:從1到n節點之間的路徑長度Floyd演算法:使用二維陣列ans[i][

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

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

作為無人機方面做嵌入式編寫的飛控總結6--IMU慣性系統GPS導航系統融合小結2組合導航演算法

導:3.基本理論:組合導航定義,想說的都在文獻之中...重點關注紅色下劃線處小結:慣性系統和GPS導航系統各有優缺點,但在誤差傳播效能上正好是互補的,前者長期穩定性差,但短期穩定性好,而後者正好相反;組合導航技術是指使用兩種或兩種以上的不同導航系統對同一資訊源作測量,從這些測

AngularJS $q $q.all 單個數據源多個數據源合並promise的說明

獲取 lar debug let index 被拒 可用 第一個 brush 這篇文章講的不錯, angular $q 和 promise!! -------------------------------------------------------------- 通

用maven來創建scalajava項目代碼環境圖文詳解Intellij IDEAUltimate版本、Intellij IDEACommunity版本Scala IDEA for Eclipse皆適用博主推薦

搭建 ava XML .com 自動 ado ima 強烈 mapred 為什麽要寫這篇博客?   首先,對於spark項目,強烈建議搭建,用Intellij IDEA(Ultimate版本),如果你還有另所愛好嘗試Scala IDEA for Eclipse,有時間自己去

隊友互看個人項目隨機生成算式後感想

流行 自己的 長度 下一個 描述 根據 空間 之間 對象 拿到隊友的項目,打開以後,第一感覺就是註釋太少,而且格式和自己的差很多,看的特別吃力;看到隊友的類裏面的函數和參數後,感覺和自己的實現方式有些類似,憑著這點相似性,我還是堅持看完了大部分代碼。順便在這裏大致描述一下我

FTP主動模式被動模式在VRP上實現實驗、報文理論解析

理解 客戶 warning 簡述 查看 inf 要求 sep mac 嗯~點關註不迷路 1.簡述主動模式的FTP建立連接的主要步驟 圖1-19 FTP主動模式示意圖基本原理FTP(文件傳輸協議)的特殊性: 大多數的TCP服務是使用單個的連接,一般是客戶向服務器的一個周知端口

sqrt函式實現神奇的演算法

我們平時經常會有一些資料運算的操作,需要呼叫sqrt,exp,abs等函式,那麼時候你有沒有想過:這個些函式系統是如何實現的?就拿最常用的sqrt函式來說吧,系統怎麼來實現這個經常呼叫的函式呢? 雖然有可能你平時沒有想過這個問題,不過正所謂

A*演算法實現圖形化表示——C++描述

概要   A*演算法是一種啟發式尋路演算法,BFS是一種盲目的無目標的搜尋演算法,相比於BFS,A*演算法根據適應度構建優先佇列,根據適應度值可以很好的向目標點移動,具體詳情,請看搜尋相關文件,我在只是實現了在無障礙的情況下的A*演算法,有障礙的情況類似。 開發環境   visual studio 20

通俗理解卡爾曼濾波及其演算法實現帶例項解析

1.簡介(Brief Introduction) 在學習卡爾曼濾波器之前,首先看看為什麼叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級數等等)一樣,卡爾曼也是一個人的名字,而跟他們不同的是,他是個現代人! 卡爾曼全名Rudolf Emil Kalman,匈牙利數學家,1930年出生於

JS中setInterval()clearInterval()的使用以及注意事項 實用,贊

原文出處:https://blog.csdn.net/YDesire/article/details/81124331 延伸閱讀:clearInterval(timer)和timer = null的區別 setInterval(): 間隔指定的毫秒數不停地執行指定的程式碼,定時器 clear