目錄
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的柳江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!實(shí)驗(yàn)要求
代碼實(shí)現(xiàn)
運(yùn)行結(jié)果
代碼解析
1、模擬操作系統(tǒng)的主存分配,運(yùn)用可變分區(qū)的存儲(chǔ)管理算法設(shè)計(jì)主存分配和回收程序,并不實(shí)際啟動(dòng)裝入作業(yè)。
2、采用最先適應(yīng)法。
3、當(dāng)一個(gè)新作業(yè)要求裝入主存時(shí),必須查空閑區(qū)表,從中找出一個(gè)足夠大的空閑區(qū)。若找到的空閑區(qū)大于作業(yè)需要量,這是應(yīng)把它分成二部分,一部分為占用區(qū),加一部分又成為一個(gè)空閑區(qū)。
4、當(dāng)一個(gè)作業(yè)撤離時(shí),歸還的區(qū)域如果與其他空閑區(qū)相鄰,則應(yīng)合并成一個(gè)較大的空閑區(qū),登在空閑區(qū)表中。
5、運(yùn)行所設(shè)計(jì)的程序,輸出有關(guān)數(shù)據(jù)結(jié)構(gòu)表項(xiàng)的變化和內(nèi)存的當(dāng)前狀態(tài)。?
代碼實(shí)現(xiàn)#include#define CAP 1024 //初始化內(nèi)存容量
#define SYSCAP 100 //系統(tǒng)所占地址,從低位開始
#define N 1000 //進(jìn)程大個(gè)數(shù)
//作業(yè)分區(qū)
struct USED{
int id,sp,ep,longsize;
}a[N];
//空閑分區(qū)
struct FREE{
int id,sp,ep,longsize;
}b[N];
//anum為作業(yè)分區(qū)塊數(shù),bnum為空閑分區(qū)塊數(shù)。初始時(shí)作業(yè)分區(qū)0塊,空閑分區(qū)有1塊
int anum=0,bnum=1;
void Init() //初始化函數(shù),程序開始時(shí)只有一個(gè)空閑分區(qū)
{
b[0].id=0;b[0].sp=SYSCAP;b[0].ep=CAP;b[0].longsize=b[0].ep-b[0].sp;
printf("\n\n--------------最先適應(yīng)算法--------------\n");
printf("\n內(nèi)存總量為:%dk\n",CAP);
printf("系統(tǒng)占用容量為:%dk\n",SYSCAP);
printf("---------------------------------------------\n");
printf("空閑分區(qū) 起始地址 結(jié)束地址 長度\n");
printf(" %d %d %d %d\n",b[0].id,b[0].sp,b[0].ep,b[0].longsize);
printf("---------------------------------------------\n");
}
void Print(int anum,int bnum) //格式化輸出作業(yè)分區(qū)和空閑分區(qū)表
{
int i,j;
printf("-----------------作業(yè)分區(qū)表---------------------\n");
printf("作業(yè)分區(qū) 起始地址 結(jié)束地址 長度\n");
for(i=0;i=size) //找到第一個(gè)能放下進(jìn)程的空閑分區(qū)
{
a[anum].id=anum; //空閑區(qū)id
a[anum].sp=b[i].sp; //作業(yè)內(nèi)存起始地址等于空閑分區(qū)起始地址
a[anum].ep=a[anum].sp+size; //作業(yè)的結(jié)束地址等于起始地址+作業(yè)長度
b[i].sp=b[i].sp+size; //空閑分區(qū)起始地址應(yīng)向后移動(dòng)size
a[anum].longsize=size; //更新作業(yè)地址長度到結(jié)構(gòu)體數(shù)組中
b[i].longsize=b[i].ep-b[i].sp;//更新空閑分區(qū)地址長度
anum++; //作業(yè)數(shù)+1
break; //一次只放入一個(gè)作業(yè),結(jié)束查找
}
}
Print(anum,bnum); //打印結(jié)果
}
void Merge() //合并空閑分區(qū),查找結(jié)束地址和開始地址重合的地址進(jìn)行合并
{
int i,j;
if(bnum>=1) //當(dāng)空閑分區(qū)大于等于兩個(gè)時(shí),才需要檢查是否存在可合并的區(qū)間
{
for(i=0;i運(yùn)行結(jié)果代碼解析將內(nèi)存總量,系統(tǒng)內(nèi)存進(jìn)行宏定義(有需要的直接修改宏定義的數(shù)據(jù)即可)
定義兩個(gè)結(jié)構(gòu)體數(shù)組,分別用于存放和空閑分區(qū)的狀態(tài)數(shù)據(jù)
anum和bnum為全局變量,分別代表作業(yè)分區(qū)和空閑分區(qū)的數(shù)量?
#include#define CAP 1024 //初始化內(nèi)存容量
#define SYSCAP 100 //系統(tǒng)所占地址,從低位開始
#define N 1000 //進(jìn)程大個(gè)數(shù)
//作業(yè)分區(qū)
struct USED{
int id,sp,ep,longsize;
}a[N];
//空閑分區(qū)
struct FREE{
int id,sp,ep,longsize;
}b[N];
int anum=0,bnum=1;
初始化函數(shù),在算法程序未開始處理前打印初始數(shù)據(jù)。這里數(shù)組下標(biāo)從0開始
void Init() //初始化函數(shù),程序開始時(shí)只有一個(gè)空閑分區(qū)
{
b[0].id=0;b[0].sp=SYSCAP;b[0].ep=CAP;b[0].longsize=b[0].ep-b[0].sp;
printf("\n\n--------------最先適應(yīng)算法--------------\n");
printf("\n內(nèi)存總量為:%dk\n",CAP);
printf("系統(tǒng)占用容量為:%dk\n",SYSCAP);
printf("---------------------------------------------\n");
printf("空閑分區(qū) 起始地址 結(jié)束地址 長度\n");
printf(" %d %d %d %d\n",b[0].id,b[0].sp,b[0].ep,b[0].longsize);
printf("---------------------------------------------\n");
}
打印結(jié)果,按順序打印對(duì)應(yīng)的結(jié)構(gòu)體數(shù)據(jù)
void Print(int anum,int bnum) //格式化輸出作業(yè)分區(qū)和空閑分區(qū)表
{
int i,j;
printf("-----------------作業(yè)分區(qū)表---------------------\n");
printf("作業(yè)分區(qū) 起始地址 結(jié)束地址 長度\n");
for(i=0;i
核心算法:將作業(yè)裝入內(nèi)存(具體實(shí)現(xiàn)方法全都寫入注釋里了,如果還有有不懂的可以私信我)
void Put() //進(jìn)程裝入作業(yè)
{
int size;
printf("請輸入作業(yè)%d的大小\n",anum);
scanf("%d",&size);
int i;
for(i=0;i=size) //找到第一個(gè)能放下進(jìn)程的空閑分區(qū)
{
a[anum].id=anum; //空閑區(qū)id
a[anum].sp=b[i].sp; //作業(yè)內(nèi)存起始地址等于空閑分區(qū)起始地址
a[anum].ep=a[anum].sp+size; //作業(yè)的結(jié)束地址等于起始地址+作業(yè)長度
b[i].sp=b[i].sp+size; //空閑分區(qū)起始地址應(yīng)向后移動(dòng)size
a[anum].longsize=size; //更新作業(yè)地址長度到結(jié)構(gòu)體數(shù)組中
b[i].longsize=b[i].ep-b[i].sp;//更新空閑分區(qū)地址長度
anum++; //作業(yè)數(shù)+1
break; //一次只放入一個(gè)作業(yè),結(jié)束查找
}
}
Print(anum,bnum); //打印結(jié)果
}
核心算法:將作業(yè)回收,作業(yè)所占據(jù)的內(nèi)存重新收回變?yōu)榭臻e區(qū)
這里說一下代碼中寫的回收作業(yè)時(shí)為什么要分兩種情況
情況1:
在作業(yè)回收時(shí),進(jìn)入空閑分區(qū)能直接和空閑分區(qū)直接合并,不需要增加新的空閑分區(qū)塊(如下圖)
回收合并后:
情況2:
在作業(yè)回收時(shí),進(jìn)入空閑分區(qū)時(shí)不能直接和空閑分區(qū)直接合并,需要增加新的空閑分區(qū)塊(如下圖,黃色塊為待回收的作業(yè)分區(qū))
回收合并后:
void Remove()//回收作業(yè)
{
int i,j,flag=1;//flag是標(biāo)志位
printf("請輸入需要回收的作業(yè):\n");
scanf("%d",&i);
//回收作業(yè)存在下面兩種情況
for(j=0;j排序算法,每次進(jìn)行回收后按地址從大到小進(jìn)行重新排序(這一步處理必須有)
作業(yè)回收時(shí)是任意的,如果先回收了高地址塊不排序,在下一次檢索空閑分區(qū)時(shí)會(huì)先把高地址分出去,顯然這是不符合最佳適應(yīng)算法的定義的
void Sort(int anum,int bnum)//簡單排序函數(shù),將空閑區(qū)間按起始地址遞增的順序排序
{
int i,j,min;
for(i=0;i
合并函數(shù),進(jìn)行檢查再合并處理,這里其實(shí)是在處理前面兩種情況之后出現(xiàn)的第三種情況
回收合并后:?
void Merge() //合并空閑分區(qū),查找結(jié)束地址和開始地址重合的地址進(jìn)行合并
{
int i,j;
if(bnum>=1) //當(dāng)空閑分區(qū)大于等于兩個(gè)時(shí),才需要檢查是否存在可合并的區(qū)間
{
for(i=0;i
主函數(shù)。通過用戶輸入來調(diào)用對(duì)應(yīng)處理函數(shù)
int main()
{
int input;//input 代表程序運(yùn)行狀態(tài)
Init();//初始化,輸出
while(1)//寫一個(gè)死循環(huán)
{
printf("裝入作業(yè):1 回收作業(yè):0 其他輸入結(jié)束程序\n");
scanf("%d",&input);
if(input==1)
{
Put();
}else if(input==0)
{
Remove();
}else break;//任意數(shù)字退出循環(huán),程序結(jié)束
}
return 0;
}
感謝閱讀~各位有什么好的建議評(píng)論或者私信我都可以~有沒看懂的地方也可以私信我~
覺得有用的話點(diǎn)個(gè)贊再走吧~
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:操作系統(tǒng)實(shí)驗(yàn)——主存分配與釋放(C語言)-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/ddjgej.html