作業系統適應演算法程式設計報告

2021-08-10 13:52:54 字數 3611 閱讀 1107

設計乙個實現適應演算法的程式

1. 只要求與空閒區於表有關的程式

2. 實現兩個過程

1) 申請記憶體

2) 釋放記憶體

其中,合併空閒區作為較高要求

採用c++程式語言,在vc6.0下開發

最先適應演算法

1. 申請記憶體

2. 釋放記憶體

3. 合併空閒區

4. 列印記憶體分配情況

結構體模擬空閒區域表和分配表,通過管理空閒區域表和分配表,完成動態分配記憶體。

1. 申請記憶體模組設計

由使用者輸入程序名稱以及所需分配記憶體空間大小,實現記憶體的動態分配。

1) 空閒區域表變化情況

若申請記憶體成功,則為相應程序分配的記憶體區首址一定是某個空閒區域的首址

<1> 申請記憶體空間大小恰好等於對應空閒區大小

只需在空閒區域表中刪除對應空閒區即可

<2> 申請記憶體空間大小小於對應空閒區大小

儲存對應空閒區,修改空閒區首址和大小

2) 分配表變化情況

在分配表中新增乙個分配區

2. 釋放記憶體模組設計

1) 空閒區域表變化情況

<1> 將釋放的分配區新增到空閒區域表中

<2> 按照空閒區首址從小到大的順序對空閒區進行排序

由於最先適應演算法要求找到的空閒區首址最小,因此,經過排序後只需找到第乙個記憶體大小滿足要求的空閒區即為所要空閒區

<3> 相連空閒區處理

釋放記憶體之後,釋放的分配區可能恰好和原來的記憶體區相連(釋放分配區的首址恰好是某個原記憶體區下乙個位置,或釋放分配區的下乙個位置恰好是某個原記憶體區的首址),由於空閒區都是等價的,所以相連的兩個或多個空閒區相當於乙個大的空閒區,因此在釋放操作之後需要判斷是否存在相連空閒區,若有,則合併。

說明:這裡所說的合併只是對釋放記憶體後導致的相連空閒區來說,與下面所說的合併空閒區不是乙個概念。

由於空閒區相連是有記憶體釋放引起的,而且在釋放之前沒有空閒區相連(若有,一定經過合併),所以相連空閒區最多只有3個(與釋放分配去相鄰的兩個原空閒區)。

2) 分配表變化情況

釋放成功只需將對應分配表中的記憶體區刪除即可。

3. 合併空閒區模組設計

只有當空閒區域表中任何乙個單獨空閒區的大小都不能滿足申請所需記憶體的要求,但所有空閒區之和能滿足要求時,才進行合併空閒區操作。

具體實現:合併空閒區時,將所有分散的空閒區合併成乙個大空閒區,然後再進行分配記憶體操作。

4. 列印記憶體分配情況

輸出分配表和空閒區域表中的內容。

1. 變數申明與資料結構

1) 程序結構

struct process;

程序名:用於標識乙個程序,兩個程序不能同名

首址、長度:程序在記憶體中的分配情況

說明:在空閒區域表中,程序結構儲存的是釋放的程序資訊。在釋放記憶體後,需要對空閒區域表按照區域首址從小到大排序,然後對相連程序進行處理,程序名用於尋找排序後對應的當前釋放記憶體區的位置。

2) int total_size;

全域性變數,記錄記憶體空間大小

3) table used_table; 記憶體分配表

table free_table; 空閒區域表

其中,記憶體分配表和空閒區域表結構相同

2. 申請記憶體

bool apply(string name,int size)

輸入引數:name 申請程序名稱

size 申請程序需要記憶體空間

返回值: 申請記憶體是否成功

if(free_table.tot_len < size) 如果空閒區總長度小於申請記憶體大小,則記憶體申請失敗。

如果空閒區總長度不小於申請記憶體大小,則先遍歷每乙個空閒區,查詢是否有單個空閒區滿足要求,if(free_table.process[i].size >= size) 如果找到滿足要求的空閒區;進一步判斷空閒區是否恰好等於申請記憶體大小,如果是,需要刪除該空閒區;否則,需要改變該空閒區首址和長度。

刪除空閒區的操作為:

for(int j=i+1; j free_table.process[j-1] = free_table.process[j];

其中,i是待刪除空閒區的索引。將第i個空閒區之後的所有空閒區依次往前移動乙個,這樣就覆蓋了第i個空閒區,從而達到刪除的目的。

當記憶體分配成功時,還需將程序插入到分配表中:insert(name,addr,size); 對應引數:程序名、分配記憶體首址、分配記憶體大小

3. 釋放記憶體

void release(int index)

輸入引數:刪除程序索引,即待釋放內存在分配表中位置

釋放記憶體需要修改空閒區域表和分配表

在修改空閒區域表時,先將釋放記憶體插入表中,然後需要進行一次對空閒區域表按首址從小到大排序(上面已經提及):

qsort(free_table.process,free_table.tot_num,sizeof(free_table.process[0]),cmp);

排序結束,需要判斷是否有相連空閒區,用cur,pre, next分別記錄當前釋放記憶體區,以及對應的前乙個和後乙個空閒區。if(pre >= 0) 存在前乙個空閒區,並且

free_table.process[pre].addr + free_table.

process[pre].size == free_table.process[cur].

addr

即釋放記憶體區域前乙個空閒區相連,則合併;判斷後乙個空閒區類似。

4. 合併空閒區

void union(string name,int size)

其中的引數用於呼叫申請記憶體時用,不影響合併空閒區操作。

合併空閒區時,先用bef_free_size陣列獲取分配表中每乙個分配區在它之前的空閒區大小,用於確定合併時每個分配去需要向前移動的距離(通過改變分配區首址實現:used_table.process[i].

addr -= bef_free_size[i])。然後將所有空閒區合併成乙個大空閒區。

#include

#include

using namespace std;

/*程序結構*/

struct process

;/*表結構*/

struct table

;table used_table; //記憶體分配表

table free_table; //空閒區域表

int total_size; //全域性變數,記錄記憶體空間大小

/*按照空閒區的首址addr從小到大排序*/

int cmp(const void *a ,const void *b)

/*初始化*/

void init()

/*待分配程序找到所需空閒區,分配記憶體,更新分配域表*/

void insert(string name,int addr,int size)

/*合併空閒區*/

void union(string name,int size)

}/*調成分配區(修改分配去首址)*/

for(int i=0; i

/*調整空閒區(進行合併後只剩下乙個空閒區)*/

free_table.tot_num = 1;

free_table.process[0].addr = total_size - free_table.tot_len;

《作業系統原理》演算法總結

先來先服務排程演算法 fcfs 每次排程是從就緒佇列中,選擇乙個最先進入就緒佇列的程序,把處理器分配給該程序,使之得到執行。該程序一旦占有了處理器,它就一直執行下去,直到該程序完成或因發生事件而阻塞,才退出處理器。特點 利於長程序,而不利於短程序。短程序 作業 優先排程演算法 spf 它是從就緒佇列...

作業系統之頁置換演算法

方法有二 1 計數器法 最為簡單的情況為,為每個頁表關聯乙個時間域 在我開來就是在原結構體中再增加乙個變數 並為cpu增加乙個邏輯時鐘或計數器。對每次記憶體引用,計數器都會增加。每次記憶體引用時,時鐘暫存器的內容會複製相應所對應的頁表項的使用時間域內。置換具有最小時間的頁。不過過這種搜尋頁表以查詢l...

64位作業系統程式設計規範

一 linux及windows主要型別位元組長度 二 不允許使用long型 三 不允許把int強制轉換為指標,反之亦然 下面是錯誤的 int i int ptr 或 void ptr void s32tmp 四 不允許在不同型別的指標 有繼承關係除外 進行強制轉換,如 int iptmp time ...