資源描述:
《內(nèi)存分配,首次適應算法》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、實驗報告一、實驗名稱:內(nèi)存分配與回收二、實驗內(nèi)容:用首次適應算法實現(xiàn)存儲空間的分配,回收作業(yè)所占用的存儲空間。三、實驗目的:一個好的計算機系統(tǒng)不僅要有足夠的存儲容量,較高的存取速度和穩(wěn)定可靠的存儲器,而且能夠合理的分配和使用這些主存空間。當用戶提出申請主存空間的要求時,存儲管理能夠按照一定的策略分析主存的使用情況,找出足夠的空間分配給申請者;當作業(yè)運行完畢,存儲管理要回收作業(yè)占用的主存空間。本實驗實現(xiàn)在可變分區(qū)存儲管理方式下,采用最先適應算法對主存空間進行分配和回收,以加深了解操作系統(tǒng)的存儲管理功能。?四、實驗過程:a)基本思想空閑分區(qū)鏈以地址遞增的次序連接。
2、在分配內(nèi)存時,從鏈首開始順序查找,直至找到一個大小能夠滿足要求的空閑分區(qū)為止;然后再按照作業(yè)大小,從該分區(qū)中劃出一塊內(nèi)存空間分配給請求者,余下的空閑分區(qū)仍然留在空閑鏈中。若從鏈首直至鏈尾都不能找到一個能滿足要求的分區(qū),則此次內(nèi)存分配失敗。b)主要數(shù)據(jù)結構typedefstructFreeLink{//空閑鏈structFreeLink*prior;charname;intstart;intsize;boolflag;structFreeLink*next;}*ptr,*head;headtop;ptrp;c)內(nèi)存分配算法當有進程要求分配主存時,依據(jù)首次適應算法
3、從鏈頭開始,延鏈查找一個足以容納該進程的空閑區(qū)。若這個分區(qū)比較大,則一分為二,一部分分配給進程,另一部分作為空閑區(qū)仍留在鏈中的當前位置,修改它的上一個空閑區(qū)的前向指針值為再加上分配給進程的分區(qū)大小,下一個空閑區(qū)的后向指針值為再加上分配給進程的分區(qū)大小,使鏈保持完整。若這個分區(qū)的大小正好等于進程的大小,該分區(qū)全部分配給進程,并將該空閑區(qū)從鏈中摘除(即修改下一個空閑區(qū)的后向指針=該空閑區(qū)后向指針,上一個空閑區(qū)的前向指針=該空閑區(qū)的前向指針)。再在已分配區(qū)表中找一個空表目,登記剛剛分配的內(nèi)存始址、長度和進程號。d)內(nèi)存的回收當進程運行完成,釋放內(nèi)存時,通過輸入進程號
4、,來回收進程占用的分區(qū)。在回收時,釋放區(qū)與空閑區(qū)相鄰接的情況要考慮4種情況:⊙釋放區(qū)下鄰空閑區(qū)⊙釋放區(qū)上鄰空閑區(qū)⊙釋放區(qū)與上下空閑區(qū)均相鄰⊙釋放區(qū)與上下空閑區(qū)均不相鄰e)程序流程圖※空閑鏈的首次適應算法分配流程圖開始申請xkb內(nèi)存由鏈頭找到第一個空閑區(qū)分區(qū)大小≥xkb?大于分區(qū)大小=分區(qū)大小-xkb,修改下一個空閑區(qū)的后向指針內(nèi)容為(后向指針)+xkb;修改上一個空閑區(qū)的前向指針為(前向指針)+xkb將該空閑區(qū)從鏈中摘除:修改下一個空閑區(qū)的后向地址=該空閑區(qū)后向地址,修改上一個空閑區(qū)的前向指針為該空閑區(qū)的前向指針等于小于延鏈查找下一個空閑區(qū)到鏈尾了?作業(yè)等待返
5、回是否登記已分配表返回分配給進程的內(nèi)存首地址※空閑鏈的首次適應算法回收流程圖開始輸入完成進程的標號在分配區(qū)表中查找釋放區(qū)p下鄰分區(qū)空閑區(qū)前一個空閑區(qū)的后向指針指向p的后一個分區(qū),p的后一個分區(qū)的前向指針指向p的前一個分區(qū),且p的前一個分區(qū)大小更改為加上p的大小,釋放p釋放區(qū)p上鄰分區(qū)空前一個分區(qū)的后向指針指向p的后一個空閑分區(qū),p的后一個空閑分區(qū)的前向指針指向p的前一個分區(qū),且p的后一個分區(qū)大小更改為加上p的大小釋放區(qū)p上下均鄰空閑區(qū)前一個空閑區(qū)的后向指針指向p的后一個空閑分區(qū),p的后一個空閑分區(qū)的前向指針指向p的前一個空閑分區(qū),且p的前一個空閑分區(qū)大小更改為
6、加上p的大小再加上p的后一個空閑分區(qū)的大小,合并后的這個空閑區(qū)的后向指針指向p的下下個分區(qū),如果p的下下個分區(qū)不為空,則其前向指針指向合并后的這個空閑區(qū),釋放p和p的下一個分區(qū)釋放區(qū)p上下均不鄰空閑區(qū)將p放在鏈首,并修改其狀態(tài)位為空閑f)截屏五、源代碼#include#include#includeusingnamespacestd;typedefstructFreeLink{//定義空閑鏈structFreeLink*prior;charname;intstart;intsize;boolflag
7、;structFreeLink*next;}*ptr,*head;headtop;ptrp;voidprint(){//將內(nèi)存分配情況打印到屏幕上p=top;cout<<"************************內(nèi)存分配情況表************************"<name<<"tt"<start<<"tt"<size<<"tt";if(p->flag==false)//fla
8、g為false,表明該分區(qū)空閑{cou