操作系統(tǒng)原理內(nèi)存的動態(tài)存儲管理_第1頁
操作系統(tǒng)原理內(nèi)存的動態(tài)存儲管理_第2頁
操作系統(tǒng)原理內(nèi)存的動態(tài)存儲管理_第3頁
操作系統(tǒng)原理內(nèi)存的動態(tài)存儲管理_第4頁
操作系統(tǒng)原理內(nèi)存的動態(tài)存儲管理_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

內(nèi)存的動態(tài)存儲管理一、 實驗內(nèi)容編寫程序?qū)崿F(xiàn)動態(tài)分區(qū)存儲管理方式的主存分配與回收。具體內(nèi)容包括:首先確定主存空間分配表;然后采用最先適應算法完成主存空間的分配與回收;最后編寫主函數(shù)對所做工作進行測試二、 實驗原理模擬存儲管理中內(nèi)存空間的管理和分配內(nèi)存空間的管理分為固定分區(qū)管理方式,可變分區(qū)管理方式,頁式存儲管理,段式存儲管理。題目:模擬內(nèi)存分配與回收struct{floataddress;/*已分分區(qū)起始地址*/floatlength;/*已分分區(qū)長度,單位為字節(jié)*/intflag;/*已分配區(qū)表登記欄標志,用〃0〃表示空欄目*/}used_table[n];/*已分配區(qū)表*/struct{floataddress;/*空閑區(qū)起始地址*/floatlength;/*空閑區(qū)長度,單位為字節(jié)*/intflag;/*空閑區(qū)表登記欄標志,用〃0〃表示空欄目,用〃1〃表示未分配*/}free_table[m];/*空閑區(qū)表*/三、 實驗步驟(或過程)在MicrosoftVisualC++6.0環(huán)境下運行設計一個空閑分區(qū)表,空閑分區(qū)表通過空閑分區(qū)鏈表來管理,在進行內(nèi)存分配時,系統(tǒng)優(yōu)先使用空閑分區(qū)低端的空間。設計一個內(nèi)存分區(qū)表,可用鏈表管理,用以表示當前以內(nèi)存使用情況。設計一個進程申請隊列以及進程完成后的釋放順序,實現(xiàn)主存的分配和回收。要求每次分配和回收后把空閑分區(qū)的變化情況以及各進程的申請、釋放情況以及各進程的申請、釋放情況以圖形方式顯示、打印出來。最佳適應算法:該算法總是把滿足要求、又是最小的空閑區(qū)分配給作業(yè)。檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū),也分為三種情況:大于,等于,小于。若檢查到有“等于”的情況,就可以直接分配,若沒有,則繼續(xù)檢查是否有“大于”的情況運行代碼如下:#definen10/*假定系統(tǒng)允許的最大作業(yè)為,假定模擬實驗中n值為10*/#definem10/*假定系統(tǒng)允許的空閑區(qū)表最大為m,假定模擬實驗中m值為10*/#defineminisize100struct{floataddress;/*已分分區(qū)起始地址*/floatlength;/*已分分區(qū)長度,單位為字節(jié)*/intflag;/*已分配區(qū)表登記欄標志,用”0”表示空欄目*/}used_table[n];/*已分配區(qū)表*/struct{floataddress;/*空閑區(qū)起始地址*/floatlength;/*空閑區(qū)長度,單位為字節(jié)*/intflag;/*空閑區(qū)表登記欄標志,用”0”表示空欄目,用”1”表示未分配*/}free_table[m];/*空閑區(qū)表*/allocate(J,xk)charJ;floatxk;/*采用最優(yōu)分配算法分配xk大小的空間*/{inti,k;floatad;k=-1;for(i=0;i<m;i++)/*尋找空間大于xk的最小空閑區(qū)登記項k*/if(free_table[i].length>=xk&&free_table[i].flag==1)if(k==-1||free_table[i].length<free_table[k].length)k=i;if(k==-1)/*未找到可用空閑區(qū),返回*/{printf(”無可用空閑區(qū)\n”);return;}/*找到可用空閑區(qū),開始分配:若空閑區(qū)大小與要求分配的空間差小于msize大小,則空閑區(qū)全部分配;若空閑區(qū)大小與要求分配的空間差大于minisize大小,則從空閑區(qū)劃出一部分分配*/if(free_table[k].length-xk<=minisize){free_table[k].flag=0;ad=free_table[k].address;xk=free_table[k].length;}else{free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;}/*修改已分配區(qū)表*/i=0;while(used_table[i].flag!=0&&i<n)/*尋找空表目*/i++;if(i>=n)/*無表目填寫已分分區(qū)*/{printf("無表目填寫已分分區(qū),錯誤\n");/*修正空閑區(qū)表*/if(free_table[k].flag==0)/*前面找到的是整個空閑分區(qū)*/free_table[k].flag=1;else{/*前面找到的是某個空閑分區(qū)的一部分*/free_table[k].length=free_table[k].length+xk;return;}}else{/*修改已分配表*/used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;}return;}/*主存分配函數(shù)結(jié)束*/reclaim(J)charJ;/*回收作業(yè)名為J的作業(yè)所占主存空間*/{inti,k,j,s,t;floatS,L;/*尋找已分配表中對應登記項*/s=0;while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n)s++;if(s>=n)/*在已分配表中找不到名字為J的作業(yè)*/{printf("找不到該作業(yè)\n");return;}/*修改已分配表*/used_table[s].flag=0;/*取得歸還分區(qū)的起始地址S和長度L*/S=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;/*尋找回收分區(qū)的空閑上下鄰,上鄰表目k,下鄰表目j*/while(i<m&&(j==-1||k==-1)){if(free_table[i].flag==1){if(free_table[i].address+free_table[i].length==S)k=i;/*找到上鄰*/if(free_table[i].address==S+L)j=i;/*找到下鄰*/}i++;}if(k!=-1)if(j!=-1)/*上鄰空閑區(qū),下鄰空閑區(qū),三項合并*/{free_table[k].length=free_table[j].length+free_table[k].length+L;free_table[j].flag=0;}else/*上鄰空閑區(qū),下鄰非空閑區(qū),與上鄰合并*/free_table[k].length=free_table[k].length+L;elseif(j!=-1)/*上鄰非空閑區(qū),下鄰為空閑區(qū),與下鄰合并*/{free_table[j].address=S;free_table[j].length=free_table[j].length+L;}else/*上下鄰均為非空閑區(qū),回收區(qū)域直接填入*/{/*在空閑區(qū)表中尋找空欄目*/t=0;while(free_table[t].flag==1&&t<m)t++;if(t>=m)/*空閑區(qū)表滿,回收空間失敗,將已分配表復原*/{printf("主存空閑表沒有空間,回收空間失敗\n");used_table[s].flag=J;return;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return;}/*主存回收函數(shù)結(jié)束*/main(){inti,a;floatxk;charJ;/*空閑分區(qū)表初始化:*/free_table[0].address=10240;free_table[0].length=102400;free_table[0].flag=1;for(i=1;i<m;i++)free_table[i].flag=0;/*已分配表初始化:*/for(i=0;i<n;i++)used_table[i].flag=0;while(1){printf("選擇功能項(0-退出,1-分配主存,2-回收主存,3-顯示主存)\n");printf("選擇功項(0~3):");scanf("%d”,&a);switch(a){case0:exit(0);/*a=0程序結(jié)束*/case1:/*a=1分配主存空間*/printf("輸入作業(yè)名J和作業(yè)所需長度xk:");scanf("%*c%c%f”,&J,&xk);allocate(J,xk);/*分配主存空間*/break;case2:/*a=2回收主存空間*/printf("輸入要回收分區(qū)的作業(yè)名");scanf("%*c%c",&J);reclaim(J);/*回收主存空間*/break;case3:/*a=3顯示主存情況*//*輸出空閑區(qū)表和已分配表的內(nèi)容*/printf("輸出空閑區(qū)表:\n起始地址分區(qū)長度標志\n");for(i=0;i<m;i++)printf("%6.0f%9.0f%6d\n”,free_table[i].address,free_table[i].length,free_table[i].flag);printf("按任意鍵,輸出已分配區(qū)表\n");getch();printf(-輸出已分配區(qū)表:\n起始地址分區(qū)長度標志\n〃);for(i=0;i<n;i++)if(used_table[i].flag!=0)printf(〃%6.0f%9.0f%6c\n〃,used_table[i].address,used_table[i].length,used_table[i].flag);elseprintf(〃%6.0f%9.0f%6d\n〃,used_table[i].address,used_table[i].length,used_table[i].flag);break;default:printf("沒有該選項\n〃);}/*case*/}/*while*/}/*主函數(shù)結(jié)束*/四、實驗結(jié)論1、實驗結(jié)果〈CHOICE〉til請輸入進程規(guī)泰入進彳呈編號t青魏輸入需要分配內(nèi)存的3個作業(yè)內(nèi)存長度;203080Process Fdddress1 0Len20Eaddi'ess20State10201030003&2Q005B006056S02653095109S3012S0312580205102055025S0輸入進程數(shù)目:3,輸入3個進程的編號:1,2,3;輸入3個進程所需內(nèi)存的長度:20、30、80。程序運行結(jié)果如上圖所示:1號進程申請長度為20的空閑塊,則搜索鏈表發(fā)現(xiàn)第一個空閑塊30滿足要求,則把該空閑快分配給進程1;由于空閑塊長度大于進程所需值,則此快一分

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論