1. 程式人生 > >系統記憶體分配的首次適應演算法和最佳適應演算法連結串列模擬實現

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

#include<iostream>
#include<stdlib.h>
using namespace std;


#define Free 0 //空閒狀態
#define Busy 1 //已用狀態
#define OK 1    //完成
#define ERROR 0 //出錯
#define MAX_length 640 //最大記憶體空間為640KB
typedef int Status;


typedef struct freearea//定義一個空閒區說明表結構
{
int ID;   //分割槽號
long size;   //分割槽大小
long address; //分割槽地址
int state;   //狀態
}ElemType;


//----------  線性表的雙向連結串列儲存結構  ------------
typedef struct DuLNode //double linked list
{
ElemType data;
struct DuLNode *prior; //前趨指標
struct DuLNode *next;  //後繼指標
}DuLNode, *DuLinkList;


DuLinkList block_first; //頭結點
DuLinkList block_last;  //尾結點


Status alloc(int);//記憶體分配
Status free(int); //記憶體回收
Status First_fit(int, int);//首次適應演算法
Status Best_fit(int, int); //最佳適應演算法
void show();//檢視分配
Status Initblock();//開創空間表


Status Initblock()//開創帶頭結點的記憶體空間連結串列
{
block_first = (DuLinkList)malloc(sizeof(DuLNode));
block_last = (DuLinkList)malloc(sizeof(DuLNode));
block_first->prior = NULL;
block_first->next = block_last;
block_first->data.state = 3;
block_first->data.size = 0;
block_last->prior = block_first;
block_last->next = NULL;
block_last->data.address = 0;
block_last->data.size = MAX_length;
block_last->data.ID = 0;
block_last->data.state = Free;
return OK;
}


//----------------------- 分 配 主 存 -------------------------
Status alloc(int ch)
{
int ID, request;
cout << "請輸入作業(分割槽號(整數)):";
cin >> ID;
cout << "請輸入需要分配的主存大小(單位:KB):";
cin >> request;
if (request<0 || request == 0)
{
cout << "分配大小不合適,請重試!" << endl;
return ERROR;
}


if (ch == 2) //選擇最佳適應演算法
{
if (Best_fit(ID, request) == OK) cout << "分配成功!" << endl;
else cout << "記憶體不足,分配失敗!" << endl;
return OK;
}
else //預設首次適應演算法
{
if (First_fit(ID, request) == OK) cout << "分配成功!" << endl;
else cout << "記憶體不足,分配失敗!" << endl;
return OK;
}
}
//------------------ 首次適應演算法 -----------------------
Status First_fit(int ID, int request)//傳入作業名及申請量
{
DuLNode *p = block_first->next;
//請在此處新增為作業申請新空間且初始化的程式碼
//請在此處完成首次適應演算法的程式碼,分兩種情況:有大小恰好合適的空閒塊和有空閒塊能滿足需求且有剩餘。
//注意函式返回值。
DuLinkList block = (DuLinkList)malloc(sizeof(DuLNode));
memset(block, 0, sizeof(DuLNode));
block->data.ID = ID;
block->data.size = request;
block->data.state = Busy;
while (p)
{
if (p->data.state == Free && p->data.size >= request)
{
if ((p->data.size - request) > 1)
{

block->data.address = p->data.address;
p->data.address = p->data.address + request;
p->data.size = p->data.size - request;


p->prior->next = block;
block->next = p;
block->prior = p->prior;
p->prior = block;
return OK;
}
else
{
p->data.ID = ID;
p->data.state = Busy;
free(block);
return OK;
}
}
p = p->next;
}
free(block);
return ERROR;
}
//--------------------  最佳適應演算法  ------------------------
Status Best_fit(int ID, int request)
{
//請在此處新增為作業申請新空間且初始化的程式碼
DuLinkList block = (DuLinkList)malloc(sizeof(DuLNode));
memset(block, 0, sizeof(DuLNode));
block->data.ID = ID;
block->data.size = request;
block->data.state = Busy;
DuLNode *p = block_first->next;
DuLNode *q = NULL; //記錄最佳插入位置
int i = 0;
int num = 0;
DuLNode *q1 = NULL;

while (p)
{

if (p->data.state == Free && p->data.size >= request)
{
if (num == 0)
{
q = p;
i = q->data.size - request;


}
else if (p->data.size - request < i)
{
q = p;
i = q->data.size - request;
}
num++;

}


p = p->next;
}


//請在此處完成最佳適應演算法的程式碼,重點:要查詢到最小剩餘空間的分割槽,即最佳插入位置


if (q == NULL) return ERROR;//沒有找到空閒塊
else
{
//請插入找到了最佳位置並實現記憶體分配的程式碼!
if ((q->data.size - request) > 1)
{


block->data.address = q->data.address;
q->data.address = q->data.address + request;
q->data.size = q->data.size - request;


block->next = q;
block->prior = q->prior;
q->prior->next = block;
q->prior = block;
return OK;
}
else
{
q->data.ID = ID;
q->data.state = Busy;
free(block);
return OK;
}
}
}


//-----------------------   主 存 回 收   --------------------
Status free(int ID)
{
DuLNode *p = block_first->next;
DuLNode *p1 = NULL;
while (p)
{
if (p->data.ID == ID)
{
p->data.state = Free;
p->data.ID = Free;
cout << "記憶體塊找到,準備回收!" << endl;
if (p->next == NULL){
if ((p->prior->data.state == Free) && (p->prior->data.address + p->prior->data.size == p->data.address))
{
p->prior->data.size += p->data.size;
p->prior->next = NULL;
free(p);
}
cout << "記憶體塊為最後一塊!" << endl;
break;
}
//請在此處新增其他情況的回收的程式碼,主要包括要回收的分割槽與前面的空閒塊相連或與後面的空閒塊相連,或者與前後空閒塊相連等。
   if ((p->next->next == NULL) && (p->next->data.state == Free) && (p->data.address + p->data.size == p->next->data.address))
{
p->data.size += p->next->data.size;
free(p->next);
p->next = NULL;
if ((p->prior->data.state == Free) && (p->prior->data.address + p->prior->data.size == p->data.address))
{
p->prior->data.size += p->data.size;
p->prior->next = NULL;
free(p);  


}
break;


}
else if ((p->prior->data.state == Free)&&(p->prior->data.address+p->prior->data.size == p->data.address))
{

if ( p->next->data.state == Free && (p->data.address + p->data.size == p->next->data.address))
{
p1 = p->next;
p->data.size += p->next->data.size;
p->next->next->prior = p;


p->next = p->next->next;
free(p1);

}
p->prior->data.size += p->data.size;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
break;
}
else if ((p->next->data.state == Free) && (p->data.address + p->data.size == p->next->data.address))
{
p1 = p->next;
p->data.size += p->next->data.size;
p->next = p->next->next;
p->next->prior = p;
free(p1);
break;
}
break;
}
p = p->next;
}
cout << "回收成功!" << endl;
return OK;
}


//---------------  顯示主存分配情況 ------------------
void show()
{
cout << "+++++++++++++++++++++++++++++++++++++++\n";
cout << "+++        主 存 分 配 情 況        +++\n";
cout << "+++++++++++++++++++++++++++++++++++++++\n";
DuLNode *p = block_first->next;
while (p)
{
cout << "分 區 號:";
if (p->data.ID == Free) cout << "Free" << endl;
else cout << p->data.ID << endl;
cout << "起始地址:" << p->data.address << endl;
cout << "分割槽大小:" << p->data.size << " KB" << endl;
cout << "狀    態:";
if (p->data.state == Free) cout << "空  閒" << endl;
else cout << "已分配" << endl;
cout << "——————————————" << endl;
p = p->next;
}
}


//----------------------- 主  函  數---------------------------
void main()
{
int ch;//演算法選擇標記
cout << "       動態分割槽分配方式的模擬       \n";
cout << "************************************\n";
cout << "** 1)首次適應演算法  2)最佳適應演算法 **\n";
cout << "************************************\n";
cout << "請選擇分配演算法:";
cin >> ch;
Initblock(); //開創空間表
int choice;  //操作選擇標記
while (1)
{
cout << "********************************************\n";
cout << "**    1: 分配記憶體        2: 回收記憶體      **\n";
cout << "**    3: 檢視分配        0: 退    出      **\n";
cout << "********************************************\n";
cout << "請輸入您的操作 :";
cin >> choice;
if (choice == 1) alloc(ch); // 分配記憶體
else if (choice == 2)  // 記憶體回收
{
int ID;
cout << "請輸入您要釋放的分割槽號:";
cin >> ID;
free(ID);
}
else if (choice == 3) show();//顯示主存
else if (choice == 0) break; //退出
else //輸入操作有誤
{
cout << "輸入有誤,請重試!" << endl;
continue;
}
}
}

相關推薦

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

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

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

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

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

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

演算法——資料結構(單向連結串列實現

單向連結串列也叫單鏈表,是連結串列中最簡單的一種形式,它的每個節點包含兩個域,一個資訊域(元素域)和一個連結域。這個連結指向連結串列中的下一個節點,而最後一個節點的連結域則指向一個空值。 表元素域el

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

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

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

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

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

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

記憶體分配方式以及堆棧的區別

轉載:https://blog.csdn.net/shanchangyi/article/details/51854795 對於一個程式要執行,涉及到的記憶體分配是一個首要問題,這裡簡單說一下一個簡單的程式執行所涉及到的記憶體分配方式。另外,在資料結構中存在堆和棧的概念,棧是一種先進後出的資料結

一個程式的記憶體分配原則、堆棧的本質及對比

一、預備知識—程式的記憶體分配 一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分  1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。  2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計

jvm記憶體分配及物件建立回收過程

Java歷史 2004.9 jdk1.5 tiger 自動裝箱拆箱,泛型,,註解,列舉,變長引數,增強for迴圈 spring2.x spring4.x 2006 jdk1.6 javaee Javase Javame jdk6 提供指令碼支援 提供編譯

淺談記憶體分配方式以及堆棧的區別(很清楚)

對於一個程式要執行,涉及到的記憶體分配是一個首要問題,這裡簡單說一下一個簡單的程式執行所涉及到的記憶體分配方式。另外,在資料結構中存在堆和棧的概念,棧是一種先進後出的資料結構,堆則是一種排序方式,而在記憶體分配中也存在堆(heap)和棧(stack)的概念,與資料結構中的概

設計一個演算法,刪除遞增有序連結串列中值大於mink且小於maxk的所有元素(minkmaxk是給定的兩個引數,其值可以表中的元素相同,也可以不同)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

【python 走進NLP】兩種高效過濾敏感詞演算法--DFA演算法AC自動機演算法

一道bat面試題:快速替換10億條標題中的5萬個敏感詞,有哪些解決思路? 有十億個標題,存在一個檔案中,一行一個標題。有5萬個敏感詞,存在另一個檔案。寫一個程式過濾掉所有標題中的所有敏感詞,儲存到另一個檔案中。 1、DFA過濾敏感詞演算法 在實現文字過濾的演算法中,DFA是

機器學習之Apriori演算法FP-growth演算法

1 關聯分析 無監督機器學習方法中的關聯分析問題。關聯分析可以用於回答"哪些商品經常被同時購買?"之類的問題。 2 Apriori演算法   頻繁項集即出現次數多的資料集   支援度就是幾個關聯的資料在資料集中出現的次數佔總資料集的比重。或者說幾個資料關聯出現的概率。   置信度體現了一個數據出現後,另

機器學習筆記 第3課:引數演算法非引數演算法

什麼是引數機器學習演算法?它與非引數機器學習演算法有何不同? “假設”通常會大大簡化學習過程,但也會限制學到的東西。將函式簡化為已知形式的演算法,稱為引數機器學習演算法。 它包括兩個步驟: 選擇函式的形式。 從訓練資料中學習該函式的係數。 常見的引數機器學習演算法是線

OpenJ_Bailian - 2757 最長上升子序列(O(n2)演算法O(nlogn)演算法

一個數的序列  bi,當  b1 <  b2 < ... <  bS的時候,我們稱這個序列是上升的。對於給定的一個序列(  a1,  a2, ...,  aN),我們可以得

遞推演算法遞迴演算法

#include<iostream> using namespace std; int fab(int n) { if (n == 1 || n == 2) { return 1; } else { return fab(n - 2) + fab(

[Python]實現DES加密演算法3DES加密演算法

pyDes.py ############################################################################# # Documentation

決策樹ID3演算法C4.5演算法實戰

老師給的題目: 程式碼實現【兩種演算法合在一個檔案裡】:  from numpy import * def createDataSet(): dataSet = [[1, 1, 1, 0, 'no'], [1, 1, 1, 1, '

作業系統中的頁面置換演算法磁碟排程演算法

頁面置換演算法:http://blog.csdn.net/y920312/article/details/47780253 頁面置換演算法小總結: 1.Optimal(最佳置換演算法)    最長時間內不被訪問,也就是說找最後面的。 2.FIFO(先進先出演算法)    按