freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

最新基于c語言的小型模擬操作系統(tǒng)設(shè)計-文庫吧

2025-06-07 07:39 本頁面


【正文】 用的是基于時間片調(diào)度算法模擬進程的運行過程,所以設(shè)定的進程基本狀態(tài)為就緒運行、運行狀態(tài)和完成狀態(tài)。如圖21運行運行完進入時間片用完進程調(diào)度釋放就緒完成圖21 進程基于時間片輪轉(zhuǎn)算法的基本狀態(tài) 進程控制塊進程控制塊PCB(Process Control Block)是進程最重要的數(shù)據(jù)結(jié)構(gòu),它用于描述和控制進程,是進程存在的唯一標(biāo)識。進程控制塊內(nèi)容有進程標(biāo)示符、處理機狀態(tài)、進程調(diào)度信息、進程控制信息。本系統(tǒng)采用鏈式方式來組織進程控制塊。把具有同一狀態(tài)的進程控制塊鏈接成一個隊列,這樣就形成了就緒狀態(tài)、運行狀態(tài)和完成狀態(tài)。 進程創(chuàng)建一旦操作系統(tǒng)接收到用戶輸入的創(chuàng)建命令,便調(diào)用進程創(chuàng)建函數(shù)按下列方式為用戶創(chuàng)建一個新進程。(1) 申請一個空白的PCB。(2) 為進程分配內(nèi)存。(3) 初始化PCB中的內(nèi)容。(4) 將PCB插入到就緒隊列,等待調(diào)度。 進程調(diào)度進程調(diào)度采用時間片輪轉(zhuǎn)調(diào)度算法,時間片大小由用戶自己定義。進程調(diào)度函數(shù)主要完成下列工作:(1) 從就緒隊列中選擇隊首進程插入到運行隊列。(2) 修改PCB中的信息。(3) 假如進程運行完便插入到完成隊列,從就緒隊列取下一進程到運行隊列。(4) 否則將這一進程插入到就緒隊列隊尾,等待下一次調(diào)度。進程撤銷函數(shù)主要完成下列工作:(1) 將進程控制塊PCB移出隊列。(2) 釋放進程所占內(nèi)存。(3) 將撤銷信息顯示在屏幕上。 存儲管理要求 內(nèi)存分配由于本系統(tǒng)采用的內(nèi)存分配策略是基本分頁存儲管理方式,又稱為離散分配方式。所以有必要對內(nèi)存進行分塊和初始化。采用二維數(shù)組模擬基本分頁存儲。內(nèi)存分配主要完成下列工作:(1) 初始化內(nèi)存數(shù)組,將其分割成一組不連續(xù)的塊。(2) 為進程分配用戶提出請求的頁數(shù)。(3) 將分配的頁號和塊號顯示在屏幕上。 回收內(nèi)存當(dāng)進程運行完釋放內(nèi)存時,系統(tǒng)根據(jù)用戶的要求從相應(yīng)的鏈表上摘下,然后釋放內(nèi)存數(shù)組的數(shù)據(jù),此時可能出現(xiàn)兩種情況。(1) 回收的PCB在就緒隊列。(2) 回收的PCB在完成隊列。 總體設(shè)計要求本系統(tǒng)包括如下代碼塊:(1) 主函數(shù)模塊。調(diào)用初始化代碼塊和菜單代碼塊。(2) 初始化代碼塊。初始化內(nèi)存數(shù)組。(3) 菜單代碼塊。調(diào)用創(chuàng)建進程、查看內(nèi)存、運行進程、撤銷進程代碼塊。(4) 創(chuàng)建進程代碼塊。創(chuàng)建并初始化進程控制塊以及分配內(nèi)存空間。(5) 查看內(nèi)存代碼塊。查看內(nèi)存的分配情況。(6) 運行進程代碼塊。采用時間片輪轉(zhuǎn)調(diào)度算法調(diào)度進程運行。(7) 結(jié)束進程代碼塊。結(jié)束進程并釋放其占用的內(nèi)存空間。函數(shù)之間的調(diào)用的關(guān)系如圖23所示。 創(chuàng)建進程查看內(nèi)存 主函數(shù) 初始化 菜 單撤銷進程運行進程圖 23 總體設(shè)計模塊3 系統(tǒng)詳細設(shè)計 全局變量系統(tǒng)代碼中定義的一些全局變量define N 100 // 共有100個內(nèi)存塊int process[N][N+1]。 // 存放每個進程的頁表int block[N]。 // 內(nèi)存塊狀態(tài)標(biāo)志數(shù)組,0:空閑,1:使用int blockCount。 // 記錄當(dāng)前內(nèi)存剩余空間int processCount。 // 記錄當(dāng)前進程數(shù)bool flag = true。int M。typedef struct node{ int pid。 int round。 int needtime。 int cputime。 int count。 int state。 struct node *next。}PCB。PCB *finish,*ready,*tail,*run。 內(nèi)存初始化 內(nèi)存定義定義內(nèi)存塊共有N個,初始化后的內(nèi)存空間應(yīng)該有一部分已經(jīng)被使用,這可以用系統(tǒng)提供的隨機數(shù)函數(shù)rand()完成。假定內(nèi)存空間已經(jīng)按塊劃分,目標(biāo)程序無需關(guān)心內(nèi)存塊大小等底層細節(jié),只需按算法對內(nèi)存塊進行分配即可。采用二維數(shù)組321來模擬進程使用內(nèi)存塊情況。用一個內(nèi)存狀態(tài)標(biāo)志數(shù)組來記錄內(nèi)存的占用情況。012N10 1 2 N1 N...進程號進程塊數(shù)塊占用標(biāo)志圖 321 內(nèi)存二維數(shù)組示意圖 主要代碼void init(){ int i, j。 for (i=0。 iN。 i++) block[i] = 0。 for (i=0。 i80。 i++) block[rand()%(N1)] = 1。 blockCount = 0。 for (i=0。 iN。 i++) if (block[i] == 0) blockCount++。 for (i=0。 iN。 i++){ process[i][0] = 0。 for (j=1。 jN。 j++) process[i][j] = 1。 } processCount = 0。 printf(初始化結(jié)果如下:)。 output()。 flag = false。} 測試結(jié)果圖 322 創(chuàng)建進程 進程結(jié)構(gòu)PCB的描述每個進程用一個進程控制塊(PCB)表示。進程控制塊包含如下信息:進程名、輪數(shù)、需要運行時間、已用CPU時間、進程狀態(tài)、指針。typedef struct node{ int pid。 int round。 int needtime。 int cputime。 int count。 int state。 struct node *next。}PCB。 進程隊列的描述進程隊列包括就緒隊列、運行隊列和完成隊列,指向進程隊列的指針有就緒頭隊列指針ready、運行隊列頭指針run、完成隊列頭指針finish以及隊列尾指針tail。圖332把具有統(tǒng)一狀態(tài)的PCB用鏈接字鏈接成一個隊列。現(xiàn)做如下定義。PCB *finish,*ready,*tail,*run。 PCB1PCB2PCB3PCB6PCB7PCB9PCB8PCB5PCB4...43087901運行指針就緒隊列指針完成隊列指針圖 332 PCB鏈接隊列示意圖輸入進程數(shù):Mj=0JM輸入進程號:na運行時間:time 頁面數(shù):pagesp=(PCB *)malloc(sizeof(PCB))。ready!=NULLtailnext =q。tail=tailnext。pnext=ready。 ready=p。 tail=ready。ppid=na。pcputime=0。 pneedtime=time。 pstate=39。W39。 pround =0。pcount =0。blockCount = pages。process[na][0] = pages。i=1i=pagesprocess[na][i] = k。block[k] = 1。k++。i++。falsetrueetruefalsej++。truefalse開始結(jié)束圖 333 創(chuàng)建進程流程圖 主要代碼bool createProcess(){ int na。 int pages, k = 0。 PCB *p。 int time。 //char na[10]。 ready=NULL。 finish=NULL。 run=NULL。 printf( 輸入進程數(shù):)。 scanf(%d,amp。M)。 int a[N]。 for(int j=0。jM。j++) { loop:printf(請輸入進程號(小于%d)和運行時間和所需頁面數(shù):, N)。 scanf(%d%d%d, amp。na, amp。time,amp。pages)。 a[j]=na。 for(int k=0。kj。k++) { if(a[k]==a[k+1]) { printf(進程號輸入重復(fù),請重新輸入!\n\n)。 goto loop。 } } if (na 99) { printf(錯誤!進程號過大!\n)。 goto loop。 } if (pages blockCount) { printf(錯誤!內(nèi)存分配失敗,沒有你要求的進程塊數(shù)!\n)。 return false。 } blockCount = pages。 process[na][0] = pages。 for (int i=1。 i=pages。 i++) { while (block[k]==1 amp。amp。 k100) k++。 process[na][i] = k。 block[k] = 1。 k++。 } p=(PCB *)malloc(sizeof(PCB))。 //strcpy(ppid,pid)。 ppid=na。 pcputime=0。 pneedtime=time。 pstate=39。W39。 pround =0。 pcount =0。 if(ready!=NULL) insert(p)。 else { pnext=ready。 ready=p。 tail=ready。 } processCount++。 printf(創(chuàng)建新進程成功!\n\n)。 } return true。} 測試結(jié)果圖 335 查看內(nèi)存 頁表在分頁系統(tǒng)中,允許將進程的各個頁離散的存儲在內(nèi)存的不同物理塊中,但系統(tǒng)應(yīng)能保證進程的正確運行,即能在內(nèi)存中找到每個頁面對應(yīng)的物理塊。為此,系統(tǒng)又為每個進程建立了一張頁面映像表,簡稱頁表。在進程地址空間內(nèi)的所有頁(0~n),依次在頁表中有一頁表項,其中記錄了相應(yīng)頁在內(nèi)存中對應(yīng)的物理塊號,見圖341。在配置了頁表后,進程執(zhí)行時通過查找頁表,即可找到每頁在內(nèi)存中的物理塊號。內(nèi)存輸出函數(shù)output()主要
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1