




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、-. z.組號成績計算機操作系統課程設計報告題目基于可重定位分區分配算法的存管理的設計與實現專業:計算機科學與技術班級:*+:指導教師:2016年12月 23 日設計目的掌握存的連續分配方式的各種分配算法設計容基于可重定位分區分配算法的存管理的設計與實現。本系統模擬操作系統存分配算法的實現,實現可重定位分區分配算法,采用PCB定義構造體來表示一個進程,定義了進程的名稱和大小,進程存起始地址和進程狀態。存分區表采用空閑分區表的形式來模擬實現。要求定義與算法相關的數據構造,如PCB、空閑分區;在使用可重定位分區分配算法時必須實現緊湊。設計原理可重定位分區分配算法與動態分區分配算法根本上一樣,差異僅
2、在于:在這種分配算法中,增加了緊湊功能。通常,該算法不能找到一個足夠大的空閑分區以滿足用戶需求時,如果所有的小的空閑分區的容量總和大于用戶的要求,這是便須對存進展緊湊,將經過緊湊后所得到的大空閑分區分配給用戶。如果所有的小空閑分區的容量總和仍小于用戶的要求,則返回分配失敗信息詳細設計及編碼模塊分析分配模塊這里采用首次適應(FF)算法。設用戶請求的分區大小為u.size,存中空閑分區大小為m.size,規定的不再切割的剩余空間大小為size。空閑分區按地址遞增的順序排列;在分配存時,從空閑分區表第一個表目開場順序查找,如果m.sizeu.size且size,說明多余局部太小,不再分割,將整個分區
3、分配給請求者;如果m.sizeu.size且m.size-u.sizesize,就從該空閑分區中按請求的大小劃分出一塊存空間分配給用戶,剩余的局部仍留在空閑分區表中;如果m.sizeu.size的空閑區?按動態分區方式分配空閑分區總和u.size進展緊湊修改有關數據構造分配失敗返回返回分區號及首址否否是是代碼實現#include#include#include#include#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define SIZE 15
4、 /進程表/int ppNo=1; /用于遞增生成進程號int pLength=0;struct PCBint pNo; /進程號(名)int pSize; / 進程大小int pOccupy; / 實際占用的存int pStartAddr; / 進程起始地址int pState; /進程狀態;struct PCB pList200;/空閑分區表局部/typedef int Status;typedef struct emptyNode /空閑分區構造體int areaSize; /空閑分區大小int aStartAddr; /空閑分區始址struct emptyNode *ne*t;empt
5、yNode,*LinkList;int ListDelete(struct PCB *pList,int i);/AAA/刪除下標為i的進程void pSort(struct PCB *pList); /AAA/存中的進程按始址遞增排序void pact(LinkList &L,struct PCB *pList);/AAA/緊湊 ,存中進程移動,修改良程數據構造;空閑分區合并,修改空閑分區表數據構造void amalgamate(LinkList &L); /AAA/回收后進展合并空閑分區void recycle(LinkList &L,struct PCB *pList); /AAA/回收
6、,從進程表中刪除進程,把釋放出的空間插入到空閑分區鏈表中Status InitList(LinkList &L); /1AAA/構造一個新的有頭節點的空鏈表LStatus ClearList(LinkList &L); /2AAA/將鏈表L重置為空表Status ListInsert(LinkList &L,LinkList s1); /AAA/*根據始址進展插入void DeleteElem(LinkList &L,int aStartAddr);/*刪除線性表中始址值為aStartAddr的結點void PrintList(LinkList L); /AAA/*輸出各結點的值void cr
7、eatP(struct PCB *p); /AAA/初始化進程int search(LinkList &L,int pSize); /AAA/檢索分區表 ,返回適宜分區的首址int add(LinkList &L); /AAA/返回空閑分區總和void pListPrint(struct PCB *pList); /AAA/輸出存中空間占用情況void distribute(LinkList &L,struct PCB *process);int ListDelete(struct PCB *pList,int i)/AAA/刪除下標為i的進程for(;ipLength-1;i+)pListi
8、=pListi+1;pLength-;/ListDeletevoid pSort(struct PCB *pList) /AAA/存中的進程按始址遞增排序int i,j;struct PCB temp;for(i=0;ipLength-1;i+)for(j=0;jpListj+1.pStartAddr)temp=pListj;pListj=pListj+1;pListj+1=temp;/AAA/緊湊 ,存中進程移動,修改良程數據構造;空閑分區合并,修改空閑分區表數據構造void pact(LinkList &L,struct PCB *pList) printf(進展緊湊n); /1、進程移動
9、,修改良程數據構造int i;pList0.pStartAddr=0; /第一個進程移到最上面for(i=0;ine*t,s;int sumEmpty=0;while(p!=NULL)/求空閑區總和sumEmpty+=p-areaSize;p=p-ne*t;ClearList(L); /清空空閑分區表s=(LinkList)malloc(sizeof(emptyNode);s-aStartAddr=pListpLength-1.pStartAddr+pListpLength-1.pOccupy; s-areaSize=sumEmpty;ListInsert(L,s); printf(n緊湊后的
10、n); pListPrint(pList);PrintList(L);void amalgamate(LinkList &L)/AAA/回收后進展合并空閑分區LinkList p=L-ne*t,q=p-ne*t;while(q!=NULL)if(p-aStartAddr+p-areaSize=q-aStartAddr)p-areaSize+=q-areaSize;DeleteElem(L,q-aStartAddr);/刪除被合并的結點q=p-ne*t; elsep=q;q=q-ne*t;/AAA/回收,從進程表中刪除進程,把釋放出的空間插入到空閑分區鏈表中void recycle(LinkLi
11、st &L,struct PCB *pList) int inde*,delPNo,delPSize,delPOccupy,delPStartAddr; LinkList s; srand(time(0); inde*=rand()%pLength; delPNo=pListinde*.pNo; delPSize=pListinde*.pSize; delPOccupy=pListinde*.pOccupy; delPStartAddr=pListinde*.pStartAddr; printf(_); printf(回收存進程 P%d: 始址:%d K 占用:%d KBn,delPNo,de
12、lPStartAddr,delPOccupy); printf(n回收后n); ListDelete(pList,inde*); /pListPrint(pList); s=(LinkList)malloc(sizeof(emptyNode);s-areaSize=delPOccupy; s-aStartAddr=delPStartAddr; ListInsert(L,s); amalgamate(L); pListPrint(pList);/輸出存中空間占用情況 PrintList(L);/Status InitList(LinkList &L) /1AAA/構造一個新的有頭節點的空鏈表LL
13、inkList s;L=(LinkList)malloc(sizeof(emptyNode); /生成新節點(頭結點)if(!L) return ERROR; /申請存失敗s=(LinkList)malloc(sizeof(emptyNode);s-areaSize=900;s-aStartAddr=0;L-ne*t=s; /頭節點的指針域指向第一個結點s-ne*t=NULL;return OK;/InitListStatus ClearList(LinkList &L) /2AAA/將鏈表L重置為空表LinkList p,r;p=L-ne*t; r=p-ne*t;while(p!=NULL)
14、free(p);if(r=NULL)p=NULL;elsep=r; r=p-ne*t;L-ne*t=NULL;return OK;/ClearList /AAA/*根據始址進展插入Status ListInsert(LinkList &L,LinkList s1)LinkList r=L,p=L-ne*t,s;/指針s=(LinkList)malloc(sizeof(emptyNode);s-areaSize=s1-areaSize;s-aStartAddr=s1-aStartAddr;if(p=NULL)L-ne*t=s;s-ne*t=NULL;elsewhile(p!=NULL) if(s
15、1-aStartAddr aStartAddr) s-ne*t=r-ne*t; r-ne*t=s; break; r=p; p=p-ne*t; /后移 if(p=NULL) r-ne*t=s; s-ne*t=NULL; return OK;/ListInsert2void DeleteElem(LinkList &L,int aStartAddr)/*刪除線性表中始址值為aStartAddr的結點LinkList p=L,q;while(p-ne*t!=NULL)q=p-ne*t;if(q-aStartAddr=aStartAddr)p-ne*t=q-ne*t;free(q);elsep=p-
16、ne*t;/DeleteElem/void PrintList(LinkList L)/AAA/*輸出各結點的值 printf(n空閑分區情況: 始址t 大小n);LinkList p=L-ne*t;while(p!=NULL) printf( %d Kt%d KBn,p-aStartAddr,p-areaSize);p=p-ne*t;printf(n);/PrintListvoid creatP(struct PCB *p) /AAA/初始化進程int size;srand(time(NULL); size=rand()%7+1; size*=10;p-pNo=ppNo+;p-pSize=s
17、ize;p-pOccupy=0;p-pStartAddr=0;p-pState=0;int search(LinkList &L,int pSize) /檢索分區表 ,返回適宜分區的首址LinkList p=L-ne*t;while(p!=NULL)if(p-areaSize=pSize)return p-aStartAddr;p=p-ne*t;return -1;/沒有足夠大的int add(LinkList &L) /返回空閑分區總和LinkList p=L-ne*t;int sum=0; while(p!=NULL)sum+=p-areaSize;p=p-ne*t;return sum;
18、void pListPrint(struct PCB *pList)/AAA/輸出存中空間占用情況printf(n進程分配情況: 進程t 始址t占用n);for(int i=0;ine*t;while(p!=NULL)if(p-areaSize=process-pSize) break; p=p-ne*t;printf(%d KB pSize,p-areaSize);if(p-areaSize-process-pSizepStartAddr=p-aStartAddr; /進程始址變化process-pState=1; /進程狀態process-pOccupy=p-areaSize; /進程實際
19、占用存為改空閑分區的大小pListpLength+= *process; /把進程參加進程列表printf( 且 %d KB - %d KB = %d KB areaSize,process-pSize,p-areaSize-process-pSize,SIZE);pSort(pList); printf(n分配后n);pListPrint(pList);/輸出存中空間占用情況DeleteElem(L,p-aStartAddr);else/分割分配process-pStartAddr=p-aStartAddr; /進程始址變化process-pState=1; /進程狀態process-pOc
20、cupy=process-pSize; /進程實際占用存為該進程的大小pListpLength+= *process; /把進程參加進程列表printf( 且 %d KB - %d KB = %d KB %d KB 則劃分分配n, p-areaSize,process-pSize,p-areaSize-process-pSize,SIZE);pSort(pList); /進程排序printf(n分配后n);pListPrint(pList);/輸出存中空間占用情況/pact(L,pList);p-aStartAddr+=process-pSize; /空閑分區始址變化p-areaSize-=p
21、rocess-pOccupy; /空閑分區大小變化 int main()/0、創立一個進程,參數隨機數方式產生 struct PCB p; int i,num,dele,k,stAddr,flag; LinkList s,L; printf(*可重定位分區分配*); if(!InitList(L) /初始化空閑分區表 printf(創立表失敗n); while(1) srand(time(0); flag=rand()%100+1; if(flag%2=0) creatP(&p);/初始化進程 printf(_); printf(待裝入作業:%d Size = %d KBn,p.pNo,p.pSize); /1、請求分配 size /2、檢索空閑分區表(首次適應FF) PrintList(L); stAddr=search(L,p.pSize);/得到足夠大的分區的始址,沒有則返回-1 if(stAddr=-1)/沒有足夠大的分區 if(add(L)=p.pSize)/空閑區總和足夠大 printf(沒有足夠大的空閑分區但空閑總和足夠大n); /緊湊 pact(L,pList)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業園區設備的節能減排措施與計劃
- 工業廢棄地再開發與環保協同策略
- 工業旅游與文化產業發展
- 工業機器人與自動化技術結合的實踐
- 工業污染防治與效果評估
- 工業用高分子材料的性能與市場分析
- 工業機器人技術的發展及其在制造中的應用
- 工業污染防治的技術與挑戰
- 工業節能與綠色制造技術
- 工業環境下的智能決策支持系統研究
- 全套教學課件《工程倫理學》
- 高中英語3500詞(亂序版)
- 06-時態-上海2022年中考英語一模單項選擇語法分類匯編
- 肩袖損傷患者的護理查房課件
- 北京市2024年中考物理真題試卷(含答案)
- 【淺談中小企業員工流失現狀、原因及解決對策(論文)6100字】
- 人教版八年級體育與健康教學教學設計-1.1科學發展體能-
- 醫院培訓課件:《輸血相關法規及輸血知識培訓》
- 三方代付投資款協議書范本
- 山東省濟南市2024-2025學年高二化學下學期末考試試題含解析
- 四川省高職單招汽車類《汽車文化》歷年考試真題試題庫(含答案)
評論
0/150
提交評論