2025年操作系統(tǒng)實驗進程管理與調(diào)度實踐解析_第1頁
2025年操作系統(tǒng)實驗進程管理與調(diào)度實踐解析_第2頁
2025年操作系統(tǒng)實驗進程管理與調(diào)度實踐解析_第3頁
2025年操作系統(tǒng)實驗進程管理與調(diào)度實踐解析_第4頁
2025年操作系統(tǒng)實驗進程管理與調(diào)度實踐解析_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

用IN學(xué)/多

操作系統(tǒng)試驗匯報

學(xué)院計算機學(xué)院

專業(yè)08軟件工程

班級___________04班______________

學(xué)號_________________

姓名劉賢生

指導(dǎo)教師_______________________

(12月)

度U多

計算機學(xué)院軟件工程專業(yè)04班學(xué)號:_

姓名:劉賢生協(xié)作者:教師評估:

程序運行狀況試驗技能試驗匯報

考勤狀況

程序質(zhì)量創(chuàng)新精神設(shè)計文檔

試驗.—題目進程調(diào)度第8周星期四

試驗二題目-作業(yè)調(diào)度__________第10周星期四

試驗三(綜合性)題日主存空間的分派與回收第15周星期四

試驗.四題目文獻系統(tǒng)第16周星期四

試驗平臺:

】、計算機及操作系統(tǒng):PC機,WindowsXP

2、編程環(huán)境:dp/plopc++60

源程序名和可執(zhí)行程序名:

試驗一:進程調(diào)度.c,進程調(diào)度.exe

試驗二:單道—作業(yè)調(diào)度.c,單道一作業(yè)調(diào)度.exe

試驗三(綜合,性):主存空間的分派與回收.c,主存空間的分派與回收.exe

試驗四:文獻管理.c,文獻管理.exe

-N:/多

學(xué)號:―姓名:劉賢生協(xié)作者:

試驗--題目進程調(diào)度-第8周星期一四

一、試驗?zāi)康?/p>

用高級語言編寫和調(diào)試一種進程調(diào)度程序,以加深對進程的概念及進程調(diào)度算法的理解。

二、試驗內(nèi)容和規(guī)定

進程調(diào)度,設(shè)計一種有'個進程并發(fā)的進程調(diào)度程序。規(guī)定采用最高優(yōu)先數(shù)優(yōu)先算法。

三、試驗重要儀器設(shè)備和材料

試驗環(huán)境

硬件環(huán)境:PC機

軟件環(huán)境:develcpC++5.0

四、試驗原理及設(shè)計方案

試驗原理:把CPU分派給就緒隊列中優(yōu)先數(shù)最高的進程。

試驗措施:采用“最高優(yōu)先數(shù)”調(diào)度算法對五個進程進行調(diào)度,優(yōu)先數(shù)高的先運行,優(yōu)先數(shù)低

的進入就緒隊列。

試驗環(huán)節(jié):

1、畫出流程圖

2、代碼實現(xiàn),其進程控制塊定義為構(gòu)造體pcb,如卜

關(guān)鍵代碼如下:

#include<stdio.h>

#include<stdlib.h>

★include<string.h>

#inc1ude<conio.h>

typedefstructnode

(

charname[10];

intprio;

intround;

intcputime:

intneedtime;

intcount;

charstate:

structnode*nexl;

)PCB:

PCB"finish,"ready,*run;

intN;

firstinO

(

run=ready;

rnn->stato="R':

ready=ready->next;

)

voidprtl()

(

print!("namecputimeneedtimecountroundstate\n*);

)

voidprt2(PCB*q)

(

prinIf(*%-8s%-8d%-8d%-6d%~5d%-c\n*,q->name,

q->cputime,q->needtim?,q->count,q->round,q->state);

)

voidprt()

(

PCB*p:

if(run!=NULL)

prt2(run);

p=ready;

while(p!=NULL)

{

prt2(p);

p=p->ncxt;

}

p=finish;

while(p!=NULL)

prt2(p):

p=p->next;

)

printf("Pressanykeytocontinue...\n*);

_getch();

prtlO;

}

insnrt(PCR*p?)

(

tail->next=p2;

tail=p2:

p2->next=NULL;

)

voidcroat()

(

PCD+p;

inti,time:

charna[10];

ready=NULL;

finish=NULL;

run=NULL;

print!("Enternameandtimcofroundprocess\n*);

for(i=l;i<=N;i++)

(

p=4nalloc(sizeof(MJB)):

scanf(飛s*,na):

scanf(飛d”,&lime);

strepy(p->name,na);

p->cputime=O;

p->necdtimc=timc;

p->count=0:

p->state-'w';

p->round=2:

if(ready!=NULL)

insert(p);

else

{

p->next=r?ady;

ready=p;

tail=p;

}

)

printf(woutputofround\n*);

prt10;

prt():

run=ready;

rcady=roady->next;

run->stale='If;

roundrunO

(

while(run!=NULL)

(

run->cputime=run->cpulime+1:

run->ncedtimc=run->noedtime-l;

run->count=run->count+l;

if(run->needtime==O)

{

run->next=finish;

finish=rjn:

run->stat?=,F(xiàn)';

run=NULL;

if(ready!=NULL)

firstinO;

}

else

if(run->count==run->round)

(

run->2ount=0:

if(ready!=NULL)

run->state=*W';

insert(run);

firstinO;

)

)

prt();

)

)

mainO

printf("'Enterprocessnumber\n*);

scanf(飛d”,&N);

crealO;

rniindrun():

)

五、成果分析以及調(diào)試小結(jié)

1、運行成果

D輸入進程個數(shù),建立進程控制塊函數(shù)

Enterprocessnumber

5

Enternameandtimeofroundprocess

1

3

2

5

3

7

4

6

5

2

outputofround

nanecputineneedtimecountroundstate

10302w

20502w

30702w

40G02w

50202w

Press;anykeytocontinue...

nanecputineneedtinecountroundstate

2)查看進程的運行狀況,輸出目前的運行進程

0202w

Pt'-anykeytocontinue..■

nanecputineneedtinecountroundstate

20502R

30702w

40602w

50202w

2102W

Pressanykeytocontinue..■

nanecputineneedtimecountroundstate

21412R

30702w

E0602w

50202w

12102W

Pressanykeytocontinue..■

namecputineneedtinecountroundstate

30702R

40602w

50202w

2102W

b2302W

an9keytocontinue..■

Inanecputineneedtinecountroundstate

31612R

2、對成果的分析

在所有的進程都完畢之前,程序會一直循環(huán)運行,將目前運行的進程以及目前的就緒隊列所有都

輸出到屏幕上。

3、對調(diào)試過程中的小結(jié)

通過多次調(diào)試,不停地從原代碼找出錯誤的地方,進行改正。最終程序的運行與成果都與預(yù)期的

同樣,沒有碰到什么大的困難。

六、心得體會

跟以往編程同樣,要有耐心地調(diào)試程序,才能找到出錯的地方,加以改正。

七、思索題

1、最高優(yōu)先數(shù)的調(diào)度比較符合實際,按顧客設(shè)定的優(yōu)先級別次序進行操作,而輪轉(zhuǎn)法則比較公

平,按進隊次序進行操作,并且每次進程運行一次后,無論完畢與否都要退出運行狀態(tài),讓等待

隊列的進程也能得屆時間片去運行。最高優(yōu)先數(shù)適合在進程數(shù)比較多的狀況下對“有需要特殊照

顧”的進程優(yōu)先,而輪轉(zhuǎn)法則在進程數(shù)有較多短作業(yè)的時候使用,效果明顯。

2、偏重于I/O型。

條4?4/多

學(xué)號:―姓名:劉賢生協(xié)作者:

試驗一二一題目作業(yè)調(diào)度第10周星期四

一、試驗?zāi)康?/p>

本試驗規(guī)定學(xué)生模擬作業(yè)調(diào)度的實現(xiàn),用高級語言編寫和調(diào)試一種或多種作業(yè)調(diào)度的模擬程序,

理解作業(yè)調(diào)度在操作系統(tǒng)中的作用,以加深對作業(yè)調(diào)度算法的理解。

二、試驗內(nèi)容和規(guī)定

作業(yè)調(diào)度試驗,為單道批處理系統(tǒng)設(shè)計一種作業(yè)調(diào)度程序

三、試驗重要儀器設(shè)備和材料

試驗環(huán)境

硬件環(huán)境:PC機

軟件環(huán)境:develcpC++5.0

四、試驗原理及設(shè)計方案

試驗原理:編寫一種單道處理系統(tǒng)實現(xiàn)作業(yè)的調(diào)度

試驗措施:根據(jù)先來先服務(wù)、最短作業(yè)優(yōu)先、響應(yīng)比高考優(yōu)先的調(diào)度算法實現(xiàn)作業(yè)調(diào)度,需要

計算出作業(yè)的平均周轉(zhuǎn)時間和帶權(quán)的平均周轉(zhuǎn)時間。

試驗環(huán)節(jié):

1、畫出流程圖

I

2、代碼實現(xiàn),其有關(guān)數(shù)據(jù)構(gòu)造闡明如下

關(guān)鍵代碼如下:

#include"stdio.h"

#include<stdlib.h>

#include<conio.h>

tfdefinegetpch(type)(type*)malloc(sizeof(type))

//#defineNULL0

structworktime{

floatTb;

floatTc;

floatTi;

floatWi;);

structjcb{

charname[10];

floatsubtine;

floatruntine;

//charresource;

floatRp;

charstate;

structworktimewt;

structjcb*link;

}*jcb_ready=NULL,*j;

typedefstructjcbJCB;

floatT=0;

voidsort()

(

JCB*first,"second;

intinsert=0;

if((jcb_reatiyMNULL)I|((j>subtime)<(jcb_ready>subtime)))

(

j->link=jcb_ready;

jcb_ready=j;

T=j->subtime;

j->Rp=l;

)

else

(

first=jcb_ready;

second=first->link;

while(second!=NULL)

{

if((j->subtime)<(second->subtime))

(

j->link=second;

first->link=j;

second=NULL;

insert=l;

}

else

(

first=first->link;

second=second->link;

)

)

if(insert==0)first->link=j;

}

)

voidSJFget()

|

JCB*front,?mintime,*rear;

intipmove=0;

mintime=jcb_ready;

rear=mintime->link;

while(rear!=NULL)

if

((rear!=NULL)&&(T>=rear->subtime)&&(mintime->runtime)>(rear->runtime))

front=mintime;

mintime=rear;

rear=rear->link;

ipmove-1;

)

else

rear=rear->link;

if(ipmove=l){

front->link=mintime->link;

mintime->link=jcb_ready;

)

jcb_ready=mintime;

)

voidinput()

(

inti,num;

printf(*\n清輸入作業(yè)數(shù):“);

scanf&num);

for(i=0;i<num;i++)

printf(*\n作業(yè)號No.%d:\n”,i);

j=getpch(JCB);

printf(*\n輸入作業(yè)名:“);

scanfj->name);

printf(*\n輸入作業(yè)提交時刻:“);

scanf("%f”,&j->subtime);

printf(*\n輸入作業(yè)運行時間:”);

scanf("%f”,&j->runtime);

printfC\n*);

j->state=,w';

j->link=NULL;

sort();

)

)

intspace()

(

int1=0;JCB*jr=jcb_ready;

while(jr!=NULL)

(

1++;

jr=jr->link;

)

return(1);

)

voiddisp(JCB*Jr,intselect)

(

printf(*\n作業(yè)服務(wù)時間運行時刻完畢時刻周轉(zhuǎn)時間帶權(quán)周轉(zhuǎn)時間

\nO;

printf("|jr->name);

printf(*|%.2f\t*,jr->runtime);

f

if(j=jr){

printf("|%.2f\t”,jr->wt.Tb);

printf(*|%.2fjr->wt.Tc);

printf(*|%.2f\t*?jr->wt.Ti);

printf(*|%.2f”,jr->wt.Wi);

)

printf('\n");

)

voidcheck(intselect)

(

JCB*jr;

printf(*\n?*?*目前正在運行的作業(yè)是:%s",j->name);

disp(j,select);

jr=jcb_ready;

printf("\n?***目前就緒隊列狀態(tài)為:\n");

while(jr!=NULL)

jr->Rp=(T-jr->subtime)/jr->runtime;

disp(jr,select);

jr=jr->link;

)

destroy();

)

intdestroy0

(

printf(*\n作業(yè)[%s]己完畢.\n”,j->name);

free(j);

}

voidrunning(JCB*jr)

(

if(T>=jr->subtime)jr->wt.Tb=T;elsejr->wt.Tb=jr->subtime;

jr->wt.Tc=jr->wt.Tb+jr->runtime;

jr>wt.Ti-jr>wt.Tcjr>subtime;

jr->wt.Wi=jr->wt.Ti/jr->runtime;

T=jr->wt.Tc;

)

intmain()

(

intselect=0,len,h=0;

floatsumTi=0,sumWi=0;

input();

len=space();

printf(*\n\tl.FCFS2.SJF3.HRN\n\n請選擇作業(yè)調(diào)度算法:?”);

scanfIselect);

while((len!=0)&&(jcb_ready!=NULL))

(

h++;

printf(*\n執(zhí)行第%d個作業(yè)\n”,h);

j=jcb_ready;

jcb_ready=j->link;

j->link=NULL;

j->state=,R';

running(j);

sumTi+=;->wt.Ti;

sumWi+=;->wt.Wi;

check(select);

if(select==24&h<len-l)SJFget():

printfC\n按任一鍵繼續(xù).....\n*);

getcharO;

getchar();

printf(*\n\n作業(yè)已經(jīng)完畢.\n");

printf(*\t此組作業(yè)的平均周轉(zhuǎn)時間:%.2f\n*?sumTi/h);

printf(*\t此組作業(yè)的帶權(quán)平均周轉(zhuǎn)時間:%.2f\n\sumWi/h);

getchar();

)五、成果分析以及調(diào)試小結(jié)

1、運行成果

運行界面

請輸入作業(yè)數(shù)

作業(yè)號No.0:

輸入作業(yè)名:one

輸入作業(yè)提交時刻:2

輸入作業(yè)運行時間:4

作業(yè)號No.

輸入作業(yè)名:two

輸入作業(yè)提交時刻:4

輸入作業(yè)運行時間:3

作業(yè)號No.2:

輸入作業(yè)名:thi'ee

D選擇了先來先服務(wù)算法進行實例,輸入數(shù)據(jù)

輸入作業(yè)運行時間

l.FCFS2.SJF3.HRN

請選擇作業(yè)調(diào)度算法:?]

運行狀況及分析:

執(zhí)行第1個作業(yè)

****當前正在運行的作業(yè)是:。ne

作業(yè)服務(wù)時間運行時刻完成時刻周轉(zhuǎn)時叵帶權(quán)周轉(zhuǎn)時間

:one:4.00:2.00:6.00:4.00:1.00

*****當前就緒隊列狀態(tài)為:

作業(yè)服務(wù)時間運行時刻完成時刻周轉(zhuǎn)時i瓦帶權(quán)周轉(zhuǎn)時間

■two53.00

作業(yè)服務(wù)時間運行時刻完成時刻周轉(zhuǎn)時間帶權(quán)周轉(zhuǎn)時間

'three'7.00

作業(yè)Cone]已完成.

按任一鍵繼續(xù)……

2)選擇了短作'也優(yōu)先算法進行實例,輸入數(shù)據(jù)

1F21LloneJ匕兀只乂.

按任一鍵繼續(xù)……

執(zhí)行第2個作業(yè)

****當前正在運行的作業(yè)是:U。

作業(yè)服務(wù)時間運行日賽U完成時刻周轉(zhuǎn)時間帶權(quán)周轉(zhuǎn)時間

;two;3.00;6.00!9.00;5.0051.67

””當前就緒隊列狀態(tài)為:

作業(yè)服務(wù)時間運行時刻完成時刻周轉(zhuǎn)時間帶權(quán)周轉(zhuǎn)時間

?three!7.00

作業(yè)[Mo]已完成.

按任一鍵繼續(xù)……

2、對成果的分析

幾經(jīng)修改,終于得出對的的成果,運行成果的輸出不夠明顯,尚有待修改。

3、對調(diào)試過程中的小結(jié)

成果的輸出很繁雜,要仔細辨別每一種的含義,與理論上的成果進行對比,然后找出bug,再進

行校正。

六、思索題

1、FCFS算:法邏輯思緒比較簡樸,直接按進程抵達時刻進行排序就可以了,而短作業(yè)和最高響應(yīng)

比這兩個算法則規(guī)定對進程參數(shù)做一番比較才能排序,并且在一種進程完畢后還要重新對隊

列中的進程進行排序。由此可見,F(xiàn)CFS的長處就是編寫以便,但由于次序是固定的,產(chǎn)沒有

對進程的優(yōu)先級別進行考慮,不那么符合實際:短作業(yè)的長處就是可?以在行長作業(yè)的隊列里

先優(yōu)先短作業(yè)的操作,不用由于等待長作業(yè)而拖慢了運行時間,最高響應(yīng)比則比較符合實際,

按“需”進行排序,但這兩種算法在進程比較少的狀況卜.效果不如FCFS明顯,并且在編寫的

時候要尾慎考慮其邏輯思緒,防止出錯。因此,在進程較少的狀況下首先可以選用的是FCFS,

而在進程較多的狀況下則看需要采用短作業(yè)或者高響應(yīng)比效果會好些。

2、面向顧客的準則:周轉(zhuǎn)時間短:響應(yīng)時間快:截止時間的保證:優(yōu)先權(quán)準則

面向系統(tǒng)的準則:系統(tǒng)吞吐量高:處理機運用率好:各類資源的平衡運用

條4/4/多

學(xué)號:_姓名:劉賢生協(xié)作者:

試驗三題目主存空間的分派與回收第15周星期_0_

一、試驗?zāi)康?/p>

熟悉主存的分派與回收。理解在不一樣的存儲管理方式下,怎樣實現(xiàn)主存空間的分派與回

收。掌握動態(tài)分辨別配方式中的數(shù)據(jù)構(gòu)造和分派算法及動態(tài)分區(qū)存儲管理方式及其實現(xiàn)過程。

一、試驗內(nèi)容和規(guī)定

主存空間的分派和回收,試驗規(guī)定使用可變分區(qū)存儲管理方式,分辨別配中所用的數(shù)據(jù)構(gòu)造

采用空閑分區(qū)表和空閑分區(qū)鏈來進行,分辨別配中所用的算法采用初次適應(yīng)算法、循環(huán)初次適應(yīng)

算法、最佳適應(yīng)算法三種算法來實現(xiàn)主存的分派與回收。同步,規(guī)定設(shè)計一種實用友好的顧客界

面,并顯示分派與回收的過程。

三、試驗重要儀器設(shè)備和材料

試驗環(huán)境:

硬件環(huán)境:PC機,WindowsXP

軟件環(huán)境:developC++5.0

四、試驗原理及設(shè)計方案

試驗原理:可變分區(qū)管理是指在處理作業(yè)過程中建立分區(qū),使分區(qū)大小恰好適合作業(yè)的需求,并

且分區(qū)個數(shù)是可以調(diào)整的。當要裝入一種作業(yè)時,根據(jù)作業(yè)需要的主存量查看與否有足夠的空閑

空間,若有,則按需要量分割一種分辨別配給該作業(yè):若無,則作業(yè)不能裝入,作業(yè)等待。伴隨

作業(yè)的裝入、完畢,主存空間被提成許多大大小小的分區(qū),有的分區(qū)被作業(yè)占用,而有的分區(qū)是

空閑的。

試驗措施:采用可變分區(qū)存儲管理,用fif。算法設(shè)計主存分派和回收程序。

試驗環(huán)節(jié):

1、畫出流程圖

2、關(guān)鍵代碼,其有關(guān)數(shù)據(jù)構(gòu)造如下

關(guān)鍵代碼如下:

#include<stdio.h>

#include<stdlib.h)

#include<conio.h>

^include〈time,h)

Sinclude<string.h>

#definegetpch(typc)(type*)malloc(sizeof(type))

才defineMEMTT0

^defineleast50

structfen(

charname[10]

intsize;

intstart:

intend:

intstate;

intstartimo;

intendtime:

structfen*ncxt;

structfen+prc;

}*freetab=NULL,*ful1=NUI.L,*second=XUI.L,*fullend=NUI.L,*p=NULL,*tempfen=NULI.;

structpcb{

charname[10]

intstartime

intneedtime

intendtime;

intsize:

structpcb*ink:

}*ready=NliLL,*tcrapeb=NULL,*wait=NULL:

intsysT=O;

intfreetablt=MEMTT:

intmaxsize=0;

voidaddfreetabO:

voidprintpeb()

structpcb*tcmp=ready:

printf(*\n\n日靖隊列如下:\n\n");

while(temp!=NVLL)

printf("作業(yè)名:\t待提交時間:\t所需時間:\n");

printf(飛s\l\ttemp->name,temp->slartime,temp->needtime);

temp=tem^->link:

//getch(>:

}

getch():

tomp=wait;

printf("\n\n等待隊列如下:\n\n");

while(temp!=NUl.l.)

{

//getch0:

printf("作業(yè)名:\t所需時間:\t所需內(nèi)存、n");

printf{飛tcmp->narae,tcmp-)necdtime,tcmp->size);

tcmp=temo->link;

}

getch():

}

printO

(

structfen*tcmp=freetab:

//clrscrO;

system("cls")

printf("空閑內(nèi)存如下:\n\rT);

while(temp!=NULL)

(

printf("起始地址:\t大小:\t結(jié)束地址\n.);

prinlf(飛temp->start,temp>size,temp>slart+lemp->size);

tcmp=tem3->next;

//getch0;

}

getch();

temp=full;

prinlf("\n'n內(nèi)存作業(yè)塊如下:\n\n*);

while(teinp!=NULL)

{

printfC1名字:\t起始地址:\l大?。哼M入內(nèi)存時間:\t結(jié)束時間:\n");

printf■(飛s\t蔣d\t\t*d\t%d\t\t%d\rT,tomp->name,tcmp->start,tomp->size,temp->startimo,tomp->cndt

ime);

tcmp=tem^->next;

}

getch():

}

sort()

{

structpcb*f;rst,"second:

intinsert=0:

if((ready==NULL)I((tempcb->startime)<(ready->startime)))/*申清時間最早者,插入隊}*/

{

Icmpcb->1ink=ready:

ready=tempcb:

}

else

first=ready:

second=first->link;

while(second!=NUI.L)

if((tcmpcb->startime)<(sccond->startinc))

tempcb->link=sccond;

first->link=terapcb:

second=NULL:

insert=l:

)

else

first=first->link:

second=second->link;

)

)

if(insert==O)first->link=tempcb;

)

)

input()

{

inti,num;

syslcm("cls"):

printf「\n請諭入作業(yè)總數(shù)?”);

scanf&num);

for(i-0;i<numi++)

(

printf(*\n作業(yè)號No.i);

tempcb=g?tpch(struetpeb);

printf(*\n輸入作業(yè)名

scanW,lempcb->name);

prinlf(\n輸入作業(yè)提交時間

scan1■(飛廣,&lempcb->slarlime);

printf("\n輸入作業(yè)運行時間

scanf(*%>1*,4tempcb->needtime);

printf(*\n*);

tcmpcb->?ndtimo=tompcb->startimc+1empcb->n(edtimo;

tempcb->link=NULL;

sort();

voidinit()

charch='y';

printf(*\n\t開始初始空閑表\n");

while(ch!='n';

p=getpch(structfen):

printf("\n\t請輸入空閑塊的起址和大小\n"):

scanf%d*.&p->start.&p->size):

if(p->si!e<50)

printfr\n\t空閑塊太小沒故意義,程序自動將其修改成%d\n"Jeasl);

p->size=least:

)

p->pre=N'JLL;p->next=NULL:

p->slale=0:

addfreetab();

print():

printfC\n\t假如不需要繼續(xù)揄入空閑表請輸入n\n'i");

getcharO;

ch=getchar();

)

p=frcctab:

while(p!=NUI.I.'

{

if(p->sizc>maxsizc)maxsizo=p->sizc:

p=p->next;

}

input():

}

add(structfen*temp)

{

p->state=O;

if((temp->start+terap->size)>=p->start)

(

if(temp->start+temp->size<p->start+p->size)

lenp->size=p->size+p->start-terap->start;

free(p);

p=lemp;

printfC\n回收(輸入)的空闈塊與前面的塊相鄰(交),已合并\n");

getchO;

else

(

p->pre=temp;

p->next=tcmp->nexl:

temp->neKt=p:

p->next->pre=p:

temp=p;

}

p=temp:

if(p->next!=NULL)

if((p->5tart+p->size)>=p->next->start)

(

if(p->start+p->size<p->next->start+p->next->size)

p->size=p->noxt->start+p->next->sizc-p->start;

tenp=temp->next;

p->next=temp->next;

if(temp->ncxt!=NUL[.)

temp->next->pre=p;

free(temp);

printfC\n回收(輸入)的空閑塊與背面的塊相鄰(交),已合并\n"):

gctchO;

)

|

voidaddfreetabO

(

intflag=l;

if(freetab==NULL){freetab-p;return;?

else

(

if((p->start)<(freetab->start))

f

if((p->start+p->size)>=freetab->start)

(

if(freetab->start+freetab->size(p->start+p->size)

freetab>size=p>size;

else

freetab->size=Freelab->start+freetab->size-p->slart;

freetab->start=p->start:

free(p);

printf(*\n回收(輸入)的空閑塊與背面的塊相鄰(交,含),己合并\n");

getchO;

)

else

(

frcctab->pre=p;

p->next=freetab:

freetab=p;

}

return;

)

else

second二freetab;

whilc(second->next!=NULL)

(

if((p->start)<(second->next->start))

{

add(second):

flag=O;

break;

)

elsesecond=second->next;

)

if(flag)

(

if((second->start+second->size)>=p->start)

(

i((second>start+second->size<p->start+p->size)

second->size=p>size?p>startsecond>slart;

free(p);

printf(*\n回收(輸入)的空閑塊與前面的塊相鄰(交,含),己合并\n0;

getchO;

}

else

{

p->pre=second;

second->next=p;

p->next=NULL;

)

I

)

}

)

addful1(structfen*temp)

{

structfen*frst,*second:

intinsert=0;

if((full—NULL)|((temp->endtime)<(lemp->endtime)))

temp->ne>it=ful1;

full=ten?:

}

else

first=full:

second=first->next:

while(second!=NUI.L)

if((temp->endtime)<(second->endtime))

temp->next=sccond;

first->ncxt=temp;

second=NULL:

insert=l:

)

else

first=first->next:

second=second->next:

)

)

if(insert==O)first->next=temp;

}

)

addwaitO

structpcb*frst,"second;

intinscrt=0;

if((wait=NULL)I((tempcb->size)<(wait->size)))

tcmpcb->link=wait;

wait=tcmpcb:

else

first=wait:

second=first->link:

while(second!=NULL)

if((tempcb>size)<(second->size))

tcmpcb->link=second:

first->link=tempcb;

second=NULL:

insert=l:

)

else

(

first=first->link;

second=socond->link:

}

)

if(insert-=O)first->link=tempcb;

}

)

intdevideO

{

structfen*lcmp:

system("cls");

p=freetab;

while(p!=Nl-LL;

if((tempcb->size<=p->size))

if((p->size-tempcb->size)<least)

p->state=l;

p-)startime=sysT:

p->endtime=sysT+tempcb->needtime;

strcpy(p->name,tempcb->name):

if<p=freetab)

{

frcetab=frcctab->noxt;

)

else

p->prc->next=p->noxt;

if(p->next!=NULL)

p->next->pre=p->pre;

p-)pre=NULL;

p->ncxt=NLLL;

printf(*\n\t分派成功!\n\t作業(yè)分派到的內(nèi)存首地址是\t加大,.、為:

\t%d\n*,p->start,p->size):

getch();

adcful1(p):

printpcbO;

return1;

}

else

(

temp=getpch(struetfen):

temp->next=NULL;

temp->pre=NULL:

temp->slale=l:

tcmp->startime=sysT;

temp->endtime=sysT+tempcb->nee<ltime;

temp->size=lempcb->size;

strepy(lcmp->name,tempcb->nanic);

temp->slart=p>start;

p->start+=tempcb->size;

p->size=p->size-tcmpcb->size;

addfull(temp);

printf(M\n\t分派成功!\n\t作業(yè)分派到的內(nèi)存首地址是:\t%d\t大小為:

\lM\n”,iemp->starl,temp->size):

getchO;

return1:

)

)

elsep=p->next:

printf(\n\t分派不成功!\n\t作業(yè)所需內(nèi)存太大,現(xiàn)無合適塊分派,將被放到等待隊列\(zhòng)n");

acldwai10:

return0:

runingO

{

intflag;

while(ready!=NULL11wait!=NULL||full!=NULL)

(

sysT++:

printf(*\n\t目前時間:\t%d\n*,sysT);

getchO;

if(full!=NULL)

(

while(ful1!=NULL&&full->endtime<=sysT'

(

printf("\n作業(yè)他已經(jīng)運行完,其所占用的空間將被回收\n”,full->name);

printf("\n回收的內(nèi)存塊如下\n'n");

printf("寄存作業(yè):\1起始地址:\t大小:\t結(jié)束時間:\n");

printf("%s\t\t%d\t\t%d\t%d\n\n\n*',full->name,full->start,full->size,full->endtime):

getchO:

p=full:

full=full->next;

p->next=NULL:

p->pre=NULL;

addfreetabO:

printO;

printpcbO:

)

if(wait!=NULL)

tempcb=wait:

wait=wait->link;

printf("\n\t1等待隊列|中的作業(yè)%s申請進入內(nèi)存tcmpcb->name);

getchO:

flag=devide();

if(!flag)2門加《飛八。等待隊列|中的作業(yè)%s申請進入內(nèi)存K成功

\n”,tempcb->name):getchO;}

else

|

printO;

printpcbO;

)

1

while(wait!=NUl.l^:&flag):

)

if(ready!=NULL)

while(ready!=NULI^i&ready->startime<=sysT)

tempcb=ready;

ready=ready->link;

tempcb->link=NULL:

printf(*\n\n\t|申請隊列|中的作業(yè)%s抵達預(yù)定申請內(nèi)存時

間:%d\n*,tempcb->name,tempcb->startime):

getchO;

printf("\t請為該作業(yè)輸入所需內(nèi)存數(shù)\n");

scanf("%(!*,&tempcb->size):

while(tompcb->size>maxsize)

{

printf("所需內(nèi)存數(shù)不小于空閃表也許最大塊,請重輸\n");

scand&tompcb->sizc);

}

if(tcmpcb->sizc<least)

{

printf("\n所需內(nèi)存數(shù)不不小于分派下限,系統(tǒng)為其分派內(nèi)存數(shù)將是下

限%d\n”,least);

tcrapcb->size=least:

getchO;

}

if(devide())

|

溫馨提示

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

最新文檔

評論

0/150

提交評論