操作系統(tǒng)課程設計_第1頁
操作系統(tǒng)課程設計_第2頁
操作系統(tǒng)課程設計_第3頁
操作系統(tǒng)課程設計_第4頁
操作系統(tǒng)課程設計_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、軟件設計文檔2014操作系統(tǒng)小學期實訓XX公司版權所有 不得復制文檔變更記錄學號:2011*姓名:李*班級:2011級軟件工程*班 一前言41.編寫目的42.背景43.定義54.任務提取55.實訓過程66.參考資料6二總體設計61.需求規(guī)定62. 運行規(guī)定73.基本設計74.處理流程85.功能需求與程序的關系86.人工處理過程97.尚未解決的問題9三運行設計91.運行模塊組合92.運行控制93.運行時間9四系統(tǒng)數(shù)據(jù)結構設計101.邏輯結構設計要點102.數(shù)據(jù)結構與程序的關系11五程序設計說明111.程序描述112.功能123.性能124.算法135.流程邏輯156.接口177.存儲分配188.

2、結果示例189.測試計劃2610.尚未解決的問題2611.源碼附錄26一前言1.編寫目的此設計文檔為配合軟件工程系夏季小學期操作系統(tǒng)實訓,對于實訓項目進行分析設計,從而開展編碼模擬。2.背景2014年夏季小學期開展的操作系統(tǒng)實訓,旨在提高學生查閱資料的能力、分析設計能力及編碼能力。要求完成對于操作系統(tǒng)原理上的簡單模擬。實訓具體要求:本設計的目的是使學生熟悉內存管理系統(tǒng)的設計方法;加深對所學各種內存管理方案的了解;要求采用一些常用的內存分配算法,設計一個內存管理模擬系統(tǒng)并調試運行,模擬環(huán)境應當盡量接近真實。3.定義本實訓對于操作系統(tǒng)的定義為操作系統(tǒng)功能模擬分項設計以及操作系統(tǒng)整體設計。操作系統(tǒng)的

3、分項功能包括進程管理系統(tǒng)設計,內存管理系統(tǒng)設計,文件管理系統(tǒng)設計,同步算法跟蹤與驗證系統(tǒng)設計,死鎖避免的模擬,磁盤調度系統(tǒng)設計等。操作系統(tǒng)整體設計要求將分項設計的部分或者整體結合起來構成一個小型的操作系統(tǒng)功能演示系統(tǒng)。4.任務提取1) 了解內存管理方案2) 了解死鎖避免原理及成因3) 了解進程管理方案4) 掌握常用內存分配算法5) 掌握銀行家算法6) 掌握幾種常見的進程管理算法7) 設計并實現(xiàn)內存管理系統(tǒng)8) 設計銀行家算法的邏輯及代碼實現(xiàn)5.實訓過程1) 查閱資料:核心問題是內存管理方案以及內存分配算法2) 設計系統(tǒng):根據(jù)所學課程結合查詢結果設計內存管理系統(tǒng)3) 編碼模擬:采用一種編程語言實

4、現(xiàn)上述模擬4) 總結反思:總結實訓過程,查找自己的不足并改進6.參考資料l 操作系統(tǒng)概念 (操作系統(tǒng)恐龍書)(Operating System Concepts)英文第七版原版(作者: Abraham Silberschatz / Greg Gagne / Peter B. Galvin );l 計算機操作系統(tǒng)(修訂版)(湯子瀛),西安交大出版社;二總體設計1.需求規(guī)定本實訓規(guī)定每人至少實現(xiàn)3個分項模塊設計,故選定內存管理系統(tǒng)設計,死鎖避免的模擬,進程管理的模擬。主要關注內存的分配方式,銀行家算法以及進程管理的資源分配方式。2. 運行規(guī)定能夠基本初步的模擬算法的運行原理,采用VS2010作為開

5、發(fā)工具,采用C+作為開發(fā)語言,項目能夠正常運行并實現(xiàn)分項模塊間集成與運行。3.基本設計死鎖避免部分:死鎖避免算法。操作系統(tǒng)按照銀行家制定的規(guī)則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。內存管理部分:操作系統(tǒng)的內存管理,是指軟件運行時對計算

6、機內存資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,并且在適當?shù)臅r候釋放和回收內存資源。 本設計采用活動分區(qū)方案,能處理內存回收的時候上下鄰合并的問題;對隨機出現(xiàn)的進程申請內存,程序能判斷是否能分配;允許用戶手動分配內存并自動判斷是否有誤;手動釋放任意地址的內存塊;同時輸出內存使用情況和空閑情況。進程管理部分:在多道處理程序運行環(huán)境下,進程數(shù)目一般多于處理機數(shù)目,使得進程要通過競爭來使用處理機。這就要求系統(tǒng)能按照某種算法,動態(tài)地把處理機分配給就緒隊列中的一個進程,使之運行,分配處理機的任務是由金城調度程序完成的。一個進程被創(chuàng)建后,系統(tǒng)為了便于對進程進行管理,將系統(tǒng)中的所有進程按

7、照其狀態(tài),將其組成不同的進程隊列。于是系統(tǒng)中有運行進程隊列、就緒隊列和各種事件的進程等待隊列。進程調度的功能就是從就緒隊列中挑選一個進程到處理機上運行。進程調度的算法有多種,常用的有優(yōu)先級調度算法、先來先服務算法、時間片輪轉算法。4.處理流程以內存分配方式為例,從用戶界面輸入相應的要求和分配方式,通過不同分配方式的算法計算出分配結果并返回相應的內存狀態(tài)。5.功能需求與程序的關系參見功能需求的三個分項設計要求,則主要的實現(xiàn)方式是模擬。限制于軟件和硬件平臺,本實訓采用VS2010和C+來實現(xiàn)操作系統(tǒng)基本原理的模擬。6.人工處理過程進行系統(tǒng)的分析設計,提取功能模塊,設計核心功能模塊,編碼實現(xiàn)核心模塊

8、的模擬。7.尚未解決的問題界面較為粗糙,未實現(xiàn)更為人性化的功能;內存分配算法較少。編碼過程化,系統(tǒng)層次不突出。三運行設計1.運行模塊組合將系統(tǒng)分成三個主要的功能模塊:內存管理與分配模塊、死鎖避免模塊、進程管理系統(tǒng)的模擬。將所有的模塊以及類設計部署在一個項目中,這樣不同的模塊之間可以配合演示,從而實現(xiàn)多模塊功能的集成。2.運行控制運行控制在項目運行中由人為的添加代碼與注釋代碼進行模擬。在項目的執(zhí)行過程中可以由用戶進行自由選擇以及終止程序3.運行時間采用優(yōu)良的設計算法,可以通過反復的比較,從而確定用時最短最高效的設計算法,盡量減少運行時間和空間的開支。四系統(tǒng)數(shù)據(jù)結構設計1.邏輯結構設計要點結構體b

9、lockArea記為內存的分配單位,內部屬性包括分區(qū)號ID、分區(qū)大小size、分區(qū)地址address、分配狀態(tài)state。雙線鏈表LinkList用來記錄各內存塊之間的聯(lián)系以及提供遍歷線索。鏈表元素data屬性為blockArea類型,各元素均含有前驅指針和后繼指針。#define MAX_length 32767 /最大內存空間為32767KB#define M 4#define N 4/數(shù)據(jù)結構聲明部分typedef struct blockAreaint ID; /分區(qū)號long size; /分區(qū)大小long address; /分區(qū)地址int state; /狀態(tài)ElemType;t

10、ypedef struct LinkNode ElemType data; struct LinkNode *prior; /前趨指針struct LinkNode *next; /后繼指針LinkNode,*LinkList;/函數(shù)聲明部分int distribute(int);/內存分配int free(int); /內存回收int FirFit(int,int);/首次適應算法int BestFit(int,int); /最佳適應算法int ManFit(int,int); /手動分配void display();/查看分配int mem();int InitMem();/初始化模擬內存

11、int TestSecu();#define FOS#endif2.數(shù)據(jù)結構與程序的關系在程序中使用C或者C+對內存數(shù)據(jù)進行訪問。五程序設計說明1.程序描述1)該程序是操作系統(tǒng)核心模塊管理功能的簡單模擬。通過該程序的演示,用戶可以模擬計算機系統(tǒng)的內存管理以及不同種類的分配方式,體會虛擬內存的實際作用。2) 深入分析死鎖產生的必要條件并實現(xiàn)銀行家算法。3) 通過各種算法動態(tài)地把處理機分配給就緒隊列中的一個進程,使之運行,分配處理機2.功能1)能夠加深自己對于各種內存管理方案的理解,提高自己對操作系統(tǒng)內存方案的設計能力。2)掌握死鎖發(fā)生原理和解決死鎖問題的方案,利用一種程序設計語言模擬實現(xiàn)利用銀行

12、家算法實現(xiàn)死鎖避免。3)要求系統(tǒng)能按照某種算法,動態(tài)地把處理機分配給就緒隊列中的一個進程,使之運行,分配處理機。通過編程一方面加深對原理的理解,另一方面提高學生根據(jù)已有原理解決實際問題的能力,為學生將來進行系統(tǒng)軟件開發(fā)和針對實際問題提出高效的軟件解決方案打下基礎。3. 性能由于規(guī)模和時間限制,本程序在性能方面未做優(yōu)化4.算法1) 首次適應算法:基本思想是從空閑分區(qū)表的第一個表目起查找該表,把最先能夠滿足要求的空閑區(qū)分配給作業(yè),這種方法目的在于減少查找時間。為適應這種算法,空閑分區(qū)表(空閑區(qū)鏈)中的空閑分區(qū)要按地址由低到高進行排序。但本實驗中未實現(xiàn)空閑分區(qū)排序功能,故按內存地址順序由低到高依次查

13、找,找到滿足要求的內存區(qū)域即進行分配。2) 最佳適應算法:它從全部空閑區(qū)中找出能滿足作業(yè)要求的、且大小最小的空閑分區(qū),這種方法能使碎片盡量小。為適應此算法,空閑分區(qū)表(空閑區(qū)鏈)中的空閑分區(qū)要按從小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區(qū)分配。該算法保留大的空閑區(qū),但造成許多小的空閑區(qū)。3) 銀行家算法:(1)設置兩個工作向量:Work=AVAILABLE;FINISH(2)從進程集合中找到一個滿足下述條件的進程,F(xiàn)INISH=false;NEED<=Work;如找到,執(zhí)行(3);否則,執(zhí)行(4)(3)設進程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。Work=Work+

14、ALLOCATION;Finish=true;GOTO 2(4) 如所有的進程Finish= true,則表示安全;否則系統(tǒng)不安全最高優(yōu)先級優(yōu)先調度算法:動態(tài)優(yōu)先數(shù)是指在進程創(chuàng)建時先確定一個初始優(yōu)先數(shù), 以后在進程運行中隨著進程特性的改變不斷修改優(yōu)先數(shù),這樣,由于開始優(yōu)先數(shù)很低而得不到CPU的進程,就能因為等待時間的增長而優(yōu)先數(shù)變?yōu)樽罡叨玫紺PU運行。例如:在進程獲得一次CPU后就將其優(yōu)先數(shù)減少3。或者,進程等待的時間超過某一時限時增加其優(yōu)先數(shù)的值,等等。4) 簡單輪轉法調度算法:所有就緒進程按 FCFS排成一個隊列,總是把處理機分配給隊首的進程,各進程占用CPU的時間片相同。即將CPU的處

15、理時間劃分成一個個相同的時間片,就緒隊列的諸進程輪流運行一個時間片。當一個時間片結束時,如果運行進程用完它的時間片后還未完成,就強迫運行機制進程讓出CPU,就把它送回到就緒隊列的末尾,等待下一次調度。同時,進程調度又去選擇就緒隊列中的隊首進程,分配給它一時間片,以投入運行。直至所有的進程運行完畢。5) 短作業(yè)優(yōu)先調度算法:所有就緒進程按所需時間由少到多排成一個隊列,依次運行隊列中的進程,并列表顯示出來,每個進程的開始運行時間減去進入內存時間就是該進程的等待時間,每個進程的結束運行時間減去進入內存時間就是該進程的周轉時間,每個進程的周轉時間除于服務時間就是帶權周轉時間。5.流程邏輯圖.銀行家算法

16、流程圖開始初始化PCB,輸入各進程信息按優(yōu)先級加入就緒隊列就緒隊列空結束就緒隊列中首進程運行標為Cpu時間+1,進入下一個進程進程運行時間滿足所需時間進程運行完成。進程優(yōu)先數(shù)減3,插入就緒隊列中。NYN圖.最高優(yōu)先級優(yōu)先調度算法流程圖初始化PCB、輸入進程信息和時間片大小開始進程按輸入順序插入到隊列中就緒隊列空結束就緒隊列首進程運行運行進程占用cup時間到達 所需時間進程完成把運行進程插入到隊尾NYN圖. 簡單輪轉法調度算法流程圖6.接口在本項目中主要是指函數(shù)接口,本項目是對操作系統(tǒng)的原理模擬。因此各功能模擬主要通過接口實現(xiàn)。7.存儲分配主要采用靜態(tài)分配方式。程序運行前,由編譯器編譯的時候進行

17、的內存分配,且到整個程序運行完才釋放內存空間(對應全局變量和靜態(tài)變量區(qū))。8.結果示例主界面運行如下所示:1)內存管理模擬輸入1進入內存管理界面??蛇x擇分配算法,共有三種可供選擇,首次適應算法最佳適應算法和手動分配算法,之后進入內存分配界面,如圖所示分配大小為1024KB.之后通過查看操作可進行分配情況的查看。按照上次輸入方式依次輸入一組數(shù)據(jù)顯示如下,動態(tài)內存分配過程實際上是按照一定的算法一步步地將大的內存區(qū)域變成小的內存塊,再由動態(tài)回收機制將不斷釋放的內存區(qū)域回收合并,達到內存的動態(tài)利用,動態(tài)平衡。然后是對內存的動態(tài)回收,釋放的內存區(qū)域必須及時回收才能保證操作系統(tǒng)的正常運行。在動態(tài)回收過程中

18、,若內存區(qū)域與上一塊內存均為未利用的區(qū)域,則應該達到合并的效果,同理,當下一塊內存區(qū)域為未利用的則應該自動合為一體,減少內存碎片。如圖所示:若將分區(qū)號為2和4的兩個內存區(qū)域分別釋放,分區(qū)號為2的區(qū)域應該變?yōu)榭捎脿顟B(tài),而分區(qū)號為4的內存區(qū)域應該與后一塊內存區(qū)域合并。2)死鎖避免模擬主界面輸入2進入死鎖避免模擬界面。輸入文件路徑程序從文件中自動讀取信息并寫入內存結果顯示如下:此時可判斷是否安全并允許任意進程提出請求任意資源數(shù),程序自動就合法性做出判斷并按照銀行家算法先進行預分配判斷分配后是否處于安全狀態(tài)并決定是否滿足進程請求,如不能滿足則必須撤回預分配。示意如下:或者:不滿足要求,如下所示3)進程

19、管理模擬在主界面輸入3進入進程管理頁面輸入1則按照優(yōu)先數(shù)進行進程調度,依圖輸入進程信息則得到如下所示模擬結果。繼續(xù)選擇2即可進行時間片輪轉調度方式選擇3則進行短作業(yè)優(yōu)先調度9.測試計劃詳細測試各個部分的核心功能。附加功能略測。具體測試計劃見測試文檔。10.尚未解決的問題項目整體的整合難以做好,界面缺乏人性化,部分功能尚有瑕疵,存在錯誤的輸入如數(shù)組越界非法字符等引起程序的異常退出的問題。11. 源碼附錄頭文件部分:FOS.h#ifndef FOS#include<iostream>#include<stdlib.h>#include<fstream>#incl

20、ude<iomanip>#include<string>#include<stdio.h>#include<queue>using namespace std;/-/宏定義部分#define MAX_length 32767 /最大內存空間為32767KB#define M 4 /資源數(shù)的宏#define N 4 /進程數(shù)的宏/-/數(shù)據(jù)結構聲明部分/進程控制塊鏈表typedef struct PCBchar name10;int prio;int round;int needtime;int cputime;int count;int state

21、;struct PCB *next;bool operator <(const PCB& o)const if(state = o.state) return prio < o.prio; return state > o.state;PCB;/進程控制塊鏈表typedef struct PCchar name10;int needtime;int cputime;int waittime;int state;struct PC *next;PC;/內存分區(qū)塊typedef struct blockAreaint ID; /分區(qū)號long size; /分區(qū)大小lon

22、g address; /分區(qū)地址int state; /狀態(tài)ElemType;/空閑分區(qū)鏈表typedef struct LinkNode ElemType data; struct LinkNode *prior; /前趨指針struct LinkNode *next; /后繼指針LinkNode,*LinkList;/-/函數(shù)聲明部分int distribute(int);/內存分配int free(int); /內存回收int FirFit(int,int);/首次適應算法int BestFit(int,int); /最佳適應算法int ManFit(int,int); /手動分配voi

23、d display();/查看分配int mem();/內存管理主函數(shù)int InitMem();/初始化模擬內存int TestSecu();/銀行家算法主函數(shù)int pro();/進程管理主函數(shù)#define FOS#endif主函數(shù):MainToRun.cpp#include"FOS.h"int main()while(1)char cho;int ch=0;cout<<endl;cout<<"=n"cout<<"= 簡單OS模擬算法 =n"cout<<"= 1.內存管理

24、模擬 2.死鎖避免模擬 =n"cout<<"= 3.進程管理模擬 0.退 出 =n"cout<<"=n"docout<<"請選擇模塊:"cin>>cho;if(cho='0')ch=0;else if(cho='1')ch=1;else if(cho='2')ch=2;else if(cho='3')ch=3;elsech=-1;cout<<"進程號輸入錯誤!n"while(ch=-

25、1);while(!(ch=0|ch=1|ch=2|ch=3)char cho;cin>>cho;cout<<"請輸入正確的數(shù)字"<<endl;cin>>ch;if(ch=0) return 1;else if(ch=1)mem();else if(ch=2)TestSecu();else pro();return 0;內存管理部分:MemAlloc.cpp#include"FOS.h"/變量聲明部分LinkList BFirst; /頭結點LinkList BLast; /尾結點int mark,n=0;

26、 /首次分配內存標記int sID=1;/靜態(tài)自增分區(qū)號/主函數(shù)int mem()doif(n=0) InitMem(); /申請整塊模擬內存cout<<"+n"cout<<"+ 內存分配算法 +n"cout<<"+ 1.首次適應算法 2.最佳適應算法 +n"cout<<"+ 3.手動分配地址 0.退 出 +n"cout<<"+n"cout<<"請選擇分配算法:"int ch=0;cin>>c

27、h;while(!(ch=0|ch=1|ch=2|ch=3)cout<<"請輸入正確的數(shù)字"<<endl;cin>>ch;if(ch=0) return 1;int choice; /操作選擇標記while(1)cout<<"-n"cout<<"- 可選操作 -n"cout<<"- 1: 分配內存 2: 回收內存 -n"cout<<"- 3: 查看分配 0: 返 回 -n"cout<<"-n

28、"cout<<"請輸入你的操作 :"cin>>choice;if(choice=1) distribute(ch); / 分配內存n=1;else if(choice=2) / 內存回收int ID;cout<<"請輸入您要釋放的分區(qū)號:"cin>>ID;if(free(ID)cout<<"釋放指定區(qū)域內存成功n"n=1;else if(choice=3) display();/顯示主存分配情況n=1;else if(choice=0)n=1;mark=1;brea

29、k;else /輸入操作有誤cout<<"輸入有誤,請重試!"<<endl;continue;while(mark);return 0;/初始化模擬內存int InitMem()/初始化內存空間(雙向鏈表形式)BFirst=(LinkList)malloc(sizeof(LinkNode);/頭結點BLast=(LinkList)malloc(sizeof(LinkNode);/尾結點BFirst->prior=NULL;BFirst->next=BLast;BLast->prior=BFirst;BLast->next=NU

30、LL;BLast->data.address=0;/起始地址為0(重在模擬不要糾結)BLast->data.size=MAX_length;/將全部內存空間劃作一個整體BLast->data.ID=0;BLast->data.state=0;return 1;/處理交互int distribute(int ch)int ID,askSize;ID=sID+;cout<<"請輸入分配大小(單位:KB):" cin>>askSize;if(askSize<0 |askSize=0) cout<<"輸入有

31、誤請重試!"<<endl; return 0;if(ch=2) /選擇最佳適應算法 if(BestFit(ID,askSize)=1) cout<<"分配成功!"<<endl; else cout<<"分配失敗!"<<endl; return 1;else if(ch=1) if(FirFit(ID,askSize)=1) cout<<"分配成功!"<<endl; else cout<<"分配失敗!"<&

32、lt;endl; return 1;else /手動分配算法if(ManFit(ID,askSize)=1) cout<<"分配成功!"<<endl;else cout<<"分配失敗!"<<endl;return 1;/首次適應算法int FirFit(int ID,int askSize)/傳入作業(yè)名及申請量/為申請作業(yè)開辟新空間且初始化LinkList temp=(LinkList)malloc(sizeof(LinkNode); temp->data.ID=ID; temp->data.s

33、ize=askSize;temp->data.state=1;LinkNode *p=BFirst->next;while(p) if(p->data.state=0 && p->data.size=askSize) /有大小恰好合適的空閑塊p->data.state=1;p->data.ID=ID;return 1;break; if(p->data.state=0 && p->data.size>askSize) /有空閑塊能滿足需求且有剩余"temp->prior=p->prior

34、;temp->next=p; temp->data.address=p->data.address;p->prior->next=temp; p->prior=temp;p->data.address=temp->data.address+temp->data.size;p->data.size-=askSize;return 1;break; p=p->next;return 0;/最佳適應算法int BestFit(int ID,int askSize)int ch; /記錄最小剩余空間LinkList temp=(Link

35、List)malloc(sizeof(LinkNode); temp->data.ID=ID; temp->data.size=askSize;temp->data.state=1;LinkNode *p=BFirst->next;LinkNode *q=NULL; /記錄最佳插入位置while(p) /初始化最小空間和最佳位置 if(p->data.state=0 &&(p->data.size>askSize | p->data.size=askSize) ) q=p;ch=p->data.size-askSize;br

36、eak; p=p->next;while(p) if(p->data.state=0 && p->data.size=askSize) /空閑塊大小恰好合適p->data.ID=ID;p->data.state=1;return 1;break; if(p->data.state=0 && p->data.size>askSize) /空閑塊大于分配需求if(p->data.size-askSize<ch)/找到新的最小剩余空間 ch=p->data.size-askSize;/更新剩余最小值 q

37、=p;/更新最佳位置指向 p=p->next;if(q=NULL) return 0;/沒有找到空閑塊else/找到了最佳位置并實現(xiàn)分配temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;q->prior->next=temp;q->prior=temp;q->data.address+=askSize;q->data.size=ch;return 1;/以分區(qū)號為線索釋放分區(qū)int free(int ID)LinkNode *p=BFirst

38、;int mark=0;while(p) if(p->data.ID=ID) if(p->data.state=0) cout<<"該區(qū)域內存未分配n" return 0; else p->data.state=0;if(p->prior->data.state=0)/連接前空閑區(qū)域 p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior;if(p->next-&g

39、t;data.state=0)/連接后空閑區(qū)域 p->data.size+=p->next->data.size; if(p->next->next) p->next->next->prior=p;p->next=p->next->next; else p->next=NULL;mark=1; break; else p=p->next;if(mark=0)cout<<"沒有該區(qū)域!n"<<endl;return mark;/顯示內存分配情況void display()co

40、ut<<"*n"cout<<"* 分 配 情 況 *n"cout<<"*n"LinkNode *p=BFirst->next;while(p) cout<<"分 區(qū) 號:"cout<<p->data.ID<<endl; cout<<"起始地址:"<<p->data.address<<endl; cout<<"分區(qū)大?。?quot;<<p-

41、>data.size<<" KB"<<endl; cout<<"狀 態(tài):" if(p->data.state=0) cout<<"可用"<<endl; else cout<<"已分配!"<<endl; cout<<endl; p=p->next;/手動分配算法int ManFit(int ID,int askSize)/顯示已分配情況供用戶參考cout<<"主存已分配情況如下:&q

42、uot;<<endl;display();cout<<"請輸入分區(qū)起始地址:"int addr;cin>>addr;LinkList temp=(LinkList)malloc(sizeof(LinkNode); LinkList temp1=(LinkList)malloc(sizeof(LinkNode); temp->data.size=askSize;temp->data.state=1;temp->data.ID=sID+;temp->data.address=addr;LinkNode *p=BFirs

43、t->next;while(p) /遍歷尋找插入位置if( (p->data.state=0) &&(p->data.address<=addr)&&(p->data.size>=askSize) )/找到目標區(qū)域且區(qū)域未經分配int m=p->data.size;if(p->data.address)<addr)/指定地址小于目標區(qū)域所在區(qū)域(p)地址if(m-(addr-p->data.address)>askSize)/有剩余部分temp1->next=p->next;p->

44、;data.size=addr-(p->data.address);p->next=temp;temp->prior=p;temp->next=temp1;temp1->data.ID=sID+;temp1->data.size=m-p->data.size-askSize;temp1->data.address=temp->data.address+askSize;temp1->data.state=0;temp1->prior=temp;if(temp1->next!=NULL)if(temp1->next-&g

45、t;data.state=0)temp1->data.size+=temp1->next->data.size;temp1->next=temp1->next->next;return 1;else if(m-(addr-p->data.address)=askSize)/正好分完,無剩余部分p->data.size=addr-(p->data.address);p->data.state=0;p->next=temp;temp->prior=p;temp->next=NULL;return 1;else retur

46、n 0;/不夠分else /起始位置與q相同if(p->data.size)>askSize)/有剩余部分temp->data.ID=sID+;temp->prior=p->prior;temp->next=p; temp->data.address=p->data.address;p->prior->next=temp; p->prior=temp;p->data.address=temp->data.address+temp->data.size;p->data.size-=askSize;retur

47、n 1;break;else if(p->data.size)=askSize)/正好夠分p->data.ID=ID;p->data.state=1;return 1;break;else return 0;/不夠分/if結束else if(p->data.address)>addr)return 0;/沒有滿足條件的區(qū)域p=p->next;/while 結束return 0;/消除警告而寫的可以去掉銀行家算法部分:Banker.cpp#include "FOS.h"int TotalN;/資源總數(shù)int MaxMN;/各進程最大需求量i

48、nt AllocationMN;/已經分配量int AvaliableN;/可用資源數(shù)int NeedMN;/各進程還需分配數(shù)int WorkN;/工作數(shù)組int RequestN;/某進程請求資源數(shù)bool FinishM=false;/標記數(shù)組/打印函數(shù)void show(int aMN)cout<<"ntR1tR2tR3tR4n"for(int i=0;i<M;i+)cout<<"進程"<<i; for(int j=0;j<N;j+) cout<<"t"<<

49、aij;if(j=3)cout<<endl; /打印函數(shù)重載void show(int aN)for(int j=0;j<N;j+) cout<<"t"<<aj;if(j=3)cout<<endl; /打印函數(shù)重載void show(bool aM) for(int j=0;j<M;j+) cout<<aj<<"n"/文件讀取函數(shù)int read (string s) ifstream in(s); if (!in.is_open() cout << &quo

50、t;文件無法打開" exit (1); for(int j=0;j<N;j+) in>>Totalj; for(int i=0;i<M;i+) for(int j=0;j<N;j+) in>>Maxij; for(int i=0;i<M;i+) for(int j=0;j<N;j+) in>>Allocationij; in.close(); return 1; /計算Need函數(shù)int calNeed()int mark=1;for(int i=0;i<M;i+) for(int j=0;j<N;j+)

51、Needij=Maxij-Allocationij;if (Needij<0)mark=0; cout<<"Need矩陣:" show(Need);return mark;/計算可用資源數(shù)函數(shù)int calAval()int mark=1;for(int j=0;j<N;j+) int temp=0;for(int i=0;i<M;i+) temp+=Allocationij; Avaliablej=Totalj-temp;if (Avaliablej<0)mark=0;cout<<"n可用:"show(A

52、valiable);return mark;/檢測是否安全函數(shù)int assure()int queM=0;for(int j=0;j<N;j+)int t=0;Workj=Avaliablej;for(int k=0;k<M;k+) for(int i=0;i<M;i+)/對每一個進程進行判別int ne=1;for(int j=0;j<N;j+)if(Workj<Needij)ne=0;if(Finishi=false&&ne)for(int j=0;j<N;j+)Workj+=Allocationij;Finishi=true;quek=i;break;for(int i=0;i&l

溫馨提示

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

評論

0/150

提交評論