實驗二-動態(tài)高優(yōu)先權優(yōu)先調度算法-王子瑜_第1頁
實驗二-動態(tài)高優(yōu)先權優(yōu)先調度算法-王子瑜_第2頁
實驗二-動態(tài)高優(yōu)先權優(yōu)先調度算法-王子瑜_第3頁
實驗二-動態(tài)高優(yōu)先權優(yōu)先調度算法-王子瑜_第4頁
實驗二-動態(tài)高優(yōu)先權優(yōu)先調度算法-王子瑜_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

./《操作系統(tǒng)》課程實驗報告實驗名稱:動態(tài)分區(qū)存儲管理姓名:王子瑜學號:5地點:四教樓指導老師:放美專業(yè)班級:軟件工程〔測試技術14-02實驗成績:實驗要求:熟悉并掌握動態(tài)分區(qū)分配的各種算法。熟悉并掌握動態(tài)分區(qū)中分區(qū)回收的各種情況,并能夠實現(xiàn)分區(qū)合并。二、實驗容:用高級語言模擬實現(xiàn)動態(tài)分區(qū)存儲管理,要求:分區(qū)分配算法至少實現(xiàn)首次適應算法、最佳適應算法和最壞適應算法中的至少一種。熟悉并掌握各種算法的空閑區(qū)組織方式。分區(qū)的初始化——可以由用戶輸入初始分區(qū)的大小。〔初始化后只有一個空閑分區(qū),起始地址為0,大小是用戶輸入的大小分區(qū)的動態(tài)分配過程:由用戶輸入作業(yè)號和作業(yè)的大小,實現(xiàn)分區(qū)過程。分區(qū)的回收:用戶輸入作業(yè)號,實現(xiàn)分區(qū)回收,同時,分區(qū)的合并要體現(xiàn)出來?!沧⒁猓翰淮嬖诘淖鳂I(yè)號要給出錯誤提示!分區(qū)的顯示:任何時刻,可以查看當前存的情況〔起始地址是什么,大小多大的分區(qū)時空閑的,或者占用的,能夠顯示出來要求考慮:〔1存空間不足的情況,要有相應的顯示;〔2作業(yè)不能同名,但是刪除后可以再用這個名字;〔3作業(yè)空間回收是輸入作業(yè)名,回收相應的空間,如果這個作業(yè)名不存在,也要有相應的提示。三、實驗代碼#include<stdio.h>#include<stdlib.h>#defineSIZE640//存初始大小#defineMINSIZE5//碎片最小值enumSTATE{Free,Busy};structsubAreaNode{intaddr;//起始地址intsize;//分區(qū)大小inttaskId;//作業(yè)號STATEstate;//分區(qū)狀態(tài)subAreaNode*pre;//分區(qū)前向指針subAreaNode*nxt;//分區(qū)后向指針}subHead;//初始化空閑分區(qū)鏈voidintSubArea<>{//分配初始分區(qū)存subAreaNode*fir=<subAreaNode*>malloc<sizeof<subAreaNode>>;//給首個分區(qū)賦值fir->addr=0;fir->size=SIZE;fir->state=Free;fir->taskId=-1;fir->pre=&subHead;fir->nxt=NULL;//初始化分區(qū)頭部信息subHead.pre=NULL;subHead.nxt=fir;}//首次適應算法intfirstFit<inttaskId,intsize>{subAreaNode*p=subHead.nxt;while<p!=NULL>{if<p->state==Free&&p->size>=size>{//找到要分配的空閑分區(qū)if<p->size-size<=MINSIZE>{//整塊分配p->state=Busy;p->taskId=taskId;}else{//分配大小為size的區(qū)間subAreaNode*node=<subAreaNode*>malloc<sizeof<subAreaNode>>;node->addr=p->addr+size;node->size=p->size-size;node->state=Free;node->taskId=-1;//修改分區(qū)鏈節(jié)點指針node->pre=p;node->nxt=p->nxt;if<p->nxt!=NULL>{p->nxt->pre=node;}p->nxt=node;//分配空閑區(qū)間p->size=size;p->state=Busy;p->taskId=taskId;}printf<"存分配成功!\n">;return1;}p=p->nxt;}printf<"找不到合適的存分區(qū),分配失敗...\n">;return0;}//最佳適應算法intbestFit<inttaskId,intsize>{subAreaNode*tar=NULL;inttarSize=SIZE+1;subAreaNode*p=subHead.nxt;while<p!=NULL>{//尋找最佳空閑區(qū)間if<p->state==Free&&p->size>=size&&p->size<tarSize>{tar=p;tarSize=p->size;}p=p->nxt;}if<tar!=NULL>{//找到要分配的空閑分區(qū)if<tar->size-size<=MINSIZE>{//整塊分配tar->state=Busy;tar->taskId=taskId;}else{//分配大小為size的區(qū)間subAreaNode*node=<subAreaNode*>malloc<sizeof<subAreaNode>>;node->addr=tar->addr+size;node->size=tar->size-size;node->state=Free;node->taskId=-1;//修改分區(qū)鏈節(jié)點指針node->pre=tar;node->nxt=tar->nxt;if<tar->nxt!=NULL>{tar->nxt->pre=node;}tar->nxt=node;//分配空閑區(qū)間tar->size=size;tar->state=Busy;tar->taskId=taskId;}printf<"存分配成功!\n">;return1;}else{//找不到合適的空閑分區(qū)printf<"找不到合適的存分區(qū),分配失敗...\n">;return0;}}//回收存intfreeSubArea<inttaskId>{intflag=0;subAreaNode*p=subHead.nxt,*pp;while<p!=NULL>{if<p->state==Busy&&p->taskId==taskId>{flag=1;if<<p->pre!=&subHead&&p->pre->state==Free>&&<p->nxt!=NULL&&p->nxt->state==Free>>{//情況1:合并上下兩個分區(qū)//先合并上區(qū)間pp=p;p=p->pre;p->size+=pp->size;p->nxt=pp->nxt;pp->nxt->pre=p;free<pp>;//后合并下區(qū)間pp=p->nxt;p->size+=pp->size;p->nxt=pp->nxt;if<pp->nxt!=NULL>{pp->nxt->pre=p;}free<pp>;}elseif<<p->pre==&subHead||p->pre->state==Busy>&&<p->nxt!=NULL&&p->nxt->state==Free>>{//情況2:只合并下面的分區(qū)pp=p->nxt;p->size+=pp->size;p->state=Free;p->taskId=-1;p->nxt=pp->nxt;if<pp->nxt!=NULL>{pp->nxt->pre=p;}free<pp>;}elseif<<p->pre!=&subHead&&p->pre->state==Free>&&<p->nxt==NULL||p->nxt->state==Busy>>{//情況3:只合并上面的分區(qū)pp=p;p=p->pre;p->size+=pp->size;p->nxt=pp->nxt;if<pp->nxt!=NULL>{pp->nxt->pre=p;}free<pp>;}else{//情況4:上下分區(qū)均不用合并p->state=Free;p->taskId=-1;}}p=p->nxt;}if<flag==1>{//回收成功printf<"存分區(qū)回收成功...\n">;return1;}else{//找不到目標作業(yè),回收失敗printf<"找不到目標作業(yè),存分區(qū)回收失敗...\n">;return0;}}//顯示空閑分區(qū)鏈情況voidshowSubArea<>{printf<"*********************************************\n">;printf<"**當前的存分配情況如下:**\n">;printf<"*********************************************\n">;printf<"**起始地址|空間大小|工作狀態(tài)|作業(yè)號**\n">;subAreaNode*p=subHead.nxt;while<p!=NULL>{printf<"****\n">;printf<"**">;printf<"%dk|",p->addr>;printf<"%dk|",p->size>;printf<"%s|",p->state==Free?"Free":"Busy">;if<p->taskId>0>{printf<"%d",p->taskId>;}else{printf<"">;}printf<"**\n">;p=p->nxt;}printf<"*********************************************\n">;}intmain<>{intoption,ope,taskId,size;//初始化空閑分區(qū)鏈intSubArea<>;//選擇分配算法while<1>{printf<"請選擇要模擬的分配算法:0表示首次適應算法,1表示最佳適應算法\n">;scanf<"%d",&option>;if<option==0>{printf<"你選擇了首次適應算法,下面進行算法的模擬\n">;break;}elseif<option==1>{printf<"你選擇了最佳適應算法,下面進行算法的模擬\n">;break;}else{printf<"錯誤:請輸入0/1\n\n">;}}//模擬動態(tài)分區(qū)分配算法while<1>{printf<"\n">;printf<"*********************************************\n">;printf<"**1:分配存2:回收存0:退出**\n">;printf<"*********************************************\n">;scanf<"%d",&ope>;if<ope==0>break;if<ope==1>{//模擬分配存printf<"請輸入作業(yè)號:">;scanf<"%d",&taskId>;printf<"請輸入需要分配的存大小<KB>:">;scanf<"%d",&size>;if<size<=0>{printf<"錯誤:分配存大小必須為正值\n">;continue;

溫馨提示

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

評論

0/150

提交評論