1. 設計目的
了解動態分割槽分配中使用的資料結構和分配演算法,並進一步加深對動態分割槽儲存管理方式及其實現過程的理解。
2. 設計內容
1)用c語言實現採用首次適應演算法的動態分割槽分配過程alloc()和**過程free()。其中,空閒分割槽通過空閒分割槽鍊錶來管理,在進行記憶體分配時,系統優先使用空閒區低端的空間。
2)假設初始狀態如下,可用的記憶體空間為640kb,並有下列的請求序列;
作業1申請130kb
作業2申請60kb
作業3申請100kb
作業2釋放60kb
作業4申請200 kb
作業3釋放100 kb
作業1釋放130 kb
作業5申請140 kb
作業6申請60 kb
作業7申請50kb
作業6釋放60 kb
請採用陣列四種演算法進行記憶體塊的分配和**,同時顯示記憶體塊分配和**後空閒記憶體分割槽鏈的情況。
3.code
#include#include#include#include#include#include#include#includeusing namespace std;
struct ready_node;
struct free_node;
vectorfree_list;//儲存空閒區域表的內容,分別是區域首址和區域長度
vectorused_list;//儲存已占用區域表的內容,分別是區域首址和區域長度
queueready_list;//就緒的程序佇列,主要儲存第一次匹配為成功的程序
queuewait_list;//等待的程序佇列
//函式定義
int cmp(free_node a,free_node b);//定義排序的比較方式
void show();//顯示空閒區域表和已占用表的資訊
void init();//初始化等待序列
void alloc(ready_node node);//動態分割槽分配函式
void free(ready_node node);//**過程函式
void oper_firo();//操作函式
void print();//顯示最後控制台的空想區域表的狀態,輸入檔案中
int main()
int cmp(free_node a,free_node b)
ok=1;//已找到匹配
break;}}
if(ok==0)
printf("程序%d申請進入記憶體,記憶體占用大小為%dkb:\n",node.id,node.size);
show();
}void free(ready_node node)
break;}}
printf("程序%d申請撤銷,收回記憶體大小為%dkb:\n",node.id,node.size);
show();
}void oper_firo()
while(!wait_list.empty())
else
}}void print();
struct free_node;
vectorfree_list;//儲存空閒區域表的內容,分別是區域首址和區域長度
vectorused_list;//儲存已占用區域表的內容,分別是區域首址和區域長度
queueready_list;//就緒的程序佇列,主要儲存第一次匹配為成功的程序
queuewait_list;//等待的程序佇列
size_t k=0;//迴圈指標;g
int cmp(free_node a,free_node b)
k=i+1;
if(k>=free_list.size()) k=0;
ok=1;//已找到匹配
break;}}
if(ok==0)
printf("程序%d申請進入記憶體,記憶體占用大小為%dkb:\n",node.id,node.size);
show();
}void free(ready_node node)
break;}}
printf("程序%d申請撤銷,收回記憶體大小為%dkb:\n",node.id,node.size);
show();
}void oper()
while(!wait_list.empty())
else
}}int main()
#include#include#include#include#include#include#include#includeusing namespace std;
struct ready_node;
struct free_node;
vectorfree_list;//儲存空閒區域表的內容,分別是區域首址和區域長度
vectorused_list;//儲存已占用區域表的內容,分別是區域首址和區域長度
queueready_list;//就緒的程序佇列,主要儲存第一次匹配為成功的程序
queuewait_list;//等待的程序佇列
int cmp(free_node a,free_node b)
ok=1;//已找到匹配
break;}}
if(ok==0)
printf("程序%d申請進入記憶體,記憶體占用大小為%dkb:\n",node.id,node.size);
show();
}void free(ready_node node)
break;}}
printf("程序%d申請撤銷,收回記憶體大小為%dkb:\n",node.id,node.size);
show();
}void oper()
while(!wait_list.empty())
else
}}int main()
#include#include#include#include#include#include#include#includeusing namespace std;
struct ready_node;
struct free_node;
vectorfree_list;//儲存空閒區域表的內容,分別是區域首址和區域長度
vectorused_list;//儲存已占用區域表的內容,分別是區域首址和區域長度
queueready_list;//就緒的程序佇列,主要儲存第一次匹配為成功的程序
queuewait_list;//等待的程序佇列
int cmp(free_node a,free_node b)
ok=1;//已找到匹配
break;}}
if(ok==0)
printf("程序%d申請進入記憶體,記憶體占用大小為%dkb:\n",node.id,node.size);
show();
}void free(ready_node node)
break;}}
printf("程序%d申請撤銷,收回記憶體大小為%dkb:\n",node.id,node.size);
show();
}void oper()
while(!wait_list.empty())
else
}}int main()
附錄:
input.txt輸入檔案格式:
1 1 130
2 1 60
3 1 100
2 0 60
4 1 200
3 0 100
1 0 130
5 1 140
6 1 60
7 1 50
6 0 60
brain stroming
1.採用首次適應演算法和最佳適應演算法,對記憶體塊進行分配和回収速度有什麼不同的影響?
首次適應演算法從空閒分割槽表的第乙個表目起查詢該錶,把最先能夠滿足要求的空閒區分配給作業,這種方法目的在於減少查詢時間。該演算法傾向於優先利用記憶體中低址部分的空閒分割槽,從而保留了高址部分的大空閒區,這為以後到達的大作業分配大的記憶體空間創造了條件。低址部分不斷被劃分,會留下許多難以利用的,很小的空閒分割槽,稱為碎片。而每次查詢又都是從低址部分開始的,這無疑又會增加查詢可用空閒分割槽時的開銷。而最佳適應演算法是指從全部空閒區中找出能滿足作業要求的、且大小最小的空閒分割槽的一種計算方法,這種方法能使碎片盡量小。
2.如何解決因碎片而造成的記憶體分配速度降低的問題?
調整演算法,盡量少的產生不能被利用的記憶體空間,例如可以採用快速適應演算法,將空閒分割槽根據容量大小進行分類,對於每一類具有相同容量的所有空閒分割槽,單獨設立乙個空閒分割槽(鏈)表。系統中存在多個空閒分割槽(鏈)表,同時在記憶體中設立一張管理索引表,每個表項對應了一種空閒分割槽型別,並指向該型別的空閒分割槽表的表頭。空閒分割槽的分類是根據程序常用的空間大小進行劃分的。這種方法具有的優點如查詢效率高,找到該類後,取下第一塊分配即可;不會產生碎片;故可以從根源上減少碎片的產生,從而提高記憶體分配速度和利用率。
使用動態分割槽分配方式的模擬
1 實驗目的 了解動態分割槽分配方式中使用的資料結構和分配演算法,並進一步加深對動態分割槽 儲存管理方式及其實現過程的理解。2 實驗內容 1 用 c 語言分別實現採用首次適應演算法和最佳適應演算法的動態分割槽分配過程 alloc 和 過程 free 其中,空閒分割槽通過空閒分割槽鏈來管理 在進行記憶...
可變分割槽分配方案
當收回主存時,應檢查是否有與歸還區相鄰的空閒區,若有,則應合併成乙個空閒區。有上鄰空閒區 只修改上鄰空閒區長度 為收回的空閒區長度與原上鄰區長度之和 即可 有下鄰空閒區 改記錄這個下鄰空閒區記錄的位址為收回空閒區的位址,長度為下鄰空閒區的長度和收回空閒區的長度即可 既有上鄰又有下鄰空閒區 修改記錄上...
動態分割槽分配
一 實驗目的 1.通過這次實驗,加深對動態分割槽分配的理解,進一步掌握首次適應演算法和最佳適應演算法的理解。了 解動態分割槽分配方式中使用的資料結構和分配演算法,進一步加深對動態分割槽儲存管理方式及其實現 過程的理解。提高學生設計實驗 發現問題 分析問題和解決問題的能力。2.學會可變式分割槽管理的原...