2020年計算機(jī)操作系統(tǒng)課程設(shè)計報告_第1頁
2020年計算機(jī)操作系統(tǒng)課程設(shè)計報告_第2頁
2020年計算機(jī)操作系統(tǒng)課程設(shè)計報告_第3頁
2020年計算機(jī)操作系統(tǒng)課程設(shè)計報告_第4頁
2020年計算機(jī)操作系統(tǒng)課程設(shè)計報告_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

計算機(jī)操作系統(tǒng)課程設(shè)計報告

修4城*孝

《操作系統(tǒng)原理》

實(shí)驗(yàn)報告

院(部):管理工程學(xué)院

專業(yè):信息管理與信息

系統(tǒng)

實(shí)驗(yàn)項(xiàng)目:實(shí)驗(yàn)一二三

班級:信管102

姓名:張鳳丹

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

學(xué)號:021418

目錄

弓I言................................6

實(shí)驗(yàn)一、模擬進(jìn)程創(chuàng)立、終止、阻塞、喚醒原語

...................................................................................9

實(shí)驗(yàn)?zāi)康模?.....................9

實(shí)驗(yàn)內(nèi)容:.........................10

實(shí)驗(yàn)步驟:.........................10

實(shí)驗(yàn)代碼:.........................11

程序運(yùn)行結(jié)果及分析.................24

實(shí)驗(yàn)感想:..........................24

實(shí)驗(yàn)二、模擬進(jìn)程調(diào)度功能...............26

實(shí)驗(yàn)?zāi)康模?........................26

實(shí)驗(yàn)內(nèi)容:.........................26

實(shí)驗(yàn)步驟:.........................27

實(shí)驗(yàn)代碼:.........................28

程序運(yùn)行結(jié)果及分析.................37

實(shí)驗(yàn)感想:..........................38

實(shí)驗(yàn)三:模擬動態(tài)分區(qū)首次適應(yīng)分配和回收算法

.................................................................................38

實(shí)驗(yàn)?zāi)康模?....................38

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

實(shí)驗(yàn)內(nèi)容:.........................38

實(shí)驗(yàn)步驟:.........................39

實(shí)驗(yàn)代碼:.........................39

程序運(yùn)行結(jié)果及分析.................53

實(shí)驗(yàn)感想:..........................54

實(shí)驗(yàn)五:模擬使用銀行家算法判斷系統(tǒng)的狀態(tài)55

實(shí)驗(yàn)?zāi)康模?........................55

實(shí)驗(yàn)步驟:.........................55

實(shí)驗(yàn)代碼:.........................55

程序運(yùn)行結(jié)果及分析.................66

實(shí)驗(yàn)感想:..........................67

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

引言

操作系統(tǒng)是信息管理與信息系統(tǒng)專業(yè)一門

重要的專業(yè)理論課程,了解和掌握操作系統(tǒng)的基

本概念、功能和實(shí)現(xiàn)原理,對認(rèn)識整個計算機(jī)系

統(tǒng)的工作原理十分重要。

操作系統(tǒng)實(shí)驗(yàn)是操作系統(tǒng)課程的一個重要組成

部分,經(jīng)過試驗(yàn)環(huán)節(jié)的鍛煉使同學(xué)們不但能夠?qū)?/p>

以前的所學(xué)過的基礎(chǔ)知識加以鞏固,同時能夠經(jīng)

過上機(jī)實(shí)驗(yàn),對操作系統(tǒng)的抽象理論知識加以理

解,最終達(dá)到融會貫通的目的,因此,實(shí)驗(yàn)環(huán)節(jié)

是同學(xué)們理解、掌握操作系統(tǒng)基本理論的一個重

要環(huán)節(jié)。

本實(shí)驗(yàn)指導(dǎo)書,根據(jù)教材中的重點(diǎn)內(nèi)容設(shè)定了相

應(yīng)的實(shí)驗(yàn)題目,由于實(shí)驗(yàn)課程的學(xué)時有限,我們

規(guī)定了必做題目和選做題目,其中必做題目必須

在規(guī)定的上機(jī)學(xué)時中完成,必須有相應(yīng)的預(yù)習(xí)報

告和實(shí)驗(yàn)報告。選做題目是針對有能力或感興趣

的同學(xué)利用課余時間或上機(jī)學(xué)時的剩余時間完

成。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

實(shí)驗(yàn)一、模擬進(jìn)程創(chuàng)立、終止、阻塞、喚

醒原語

實(shí)驗(yàn)?zāi)康模?/p>

經(jīng)過設(shè)計并調(diào)試創(chuàng)立、終止、阻塞、喚

醒原語功能,有助于對操作系統(tǒng)中進(jìn)程控制

功能的理解,掌握操作系統(tǒng)模塊的設(shè)計方法

和工作原理。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

實(shí)驗(yàn)內(nèi)容:

1、設(shè)計創(chuàng)立、終止、阻塞、喚醒原語功能函

數(shù)。

2、設(shè)計主函數(shù),采用菜單結(jié)構(gòu)(參見后面給

出的流程圖)。

3、設(shè)計“顯示隊列”函數(shù),目的能將就緒、

阻塞隊列中的進(jìn)程信息顯示在屏幕上,以

供隨時查看各隊列中進(jìn)程的變化情況。

實(shí)驗(yàn)步驟:

1、進(jìn)程PCB中應(yīng)包含以下山家?

2、系統(tǒng)總體結(jié)構(gòu):

I^^臺

系統(tǒng)主菜單

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

1…創(chuàng)立

2…阻塞

3…喚醒

4…終止

5…顯示

0…退出

請輸入您需要

的功能(0

—5):

退出創(chuàng)立阻塞喚醒終止顯示

[結(jié)束

實(shí)驗(yàn)代碼:

#include<stdio.h>

#include<string.h>

structPCB

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

charname[4];

intpriority;

intruntime;

);

voidmain()

intx,t;

inta=0;

intk=0,r=l,i=0,j=0;//k為就緒隊列總數(shù),r堵

塞隊列總數(shù)

charname[4];

structPCBpcb[10];

structPCBpcbl[10];

structPCBpcb2[10];

printf(n...........................菜單

...........................\n\n\nn);

printf("0-退出系統(tǒng)\n");

printf「L…創(chuàng)立進(jìn)程\n”);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printf("2--堵塞進(jìn)程\n”);

printf("3--喚醒進(jìn)程W”);

printf(”4--終止進(jìn)程\n");

printf("5.…顯示進(jìn)程\n");

printf(M...................................................................\nM

);

strcpy(pcb1[0].nameJs'');〃堵塞隊歹l|

pcbl[0].priority=2;

pcbl[0].runtime=3;

//printf(n%s%d%dH,pcbl[O].name,pcbl[

0].priority,pcb1[0].runtime);

while(l)

(

printf("請輸入你的選擇;

scanf(H%dn,&x);

if(x==0)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

break;

if(x==l)

printf(u.......................創(chuàng)立進(jìn)程

..........\n");

printf("進(jìn)程名:”);

scanf(n%sn,&pcb[k].name);

printf("優(yōu)先級:”);

scanf(n%dn,&pcb[k].priority);

printf("運(yùn)行時間:");

scanf(n%dn,&pcb[k].runtime);

k=k+l;

)

if(x==2)

(

printf(H...................堵塞進(jìn)程

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

.....................\nH);

printf("請輸入要查找的進(jìn)程:");

scanf(n%sn,name);

for(j=0;j<=k;j++)

(

if(strcmp(pcb[j].name,name)==O)

{

t=j;

strcpy(pcb2[a].name,pcb[t].name);

pcb2[a].priority

pcb[t].priority;

pcb2[a].runtime

pcb[t].runtime;

strcpy(pcbl[r].name,pcb2[a].name);

pcbl[r].priority

pcb2[a].priority;

pcbl[r].runtime

pcb2[a].runtime;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

r=r+l;

a=a+l;

for(i=t;i<=k;i++)

(

strcpy(pcb[i].name,pcb[i+1].name);

pcb[i].priority=

pcb[i+l].priority;

pcb[i].runtime=

pcb[i+l].runtime;

)

k=k-l;

printfC將就緒序列調(diào)度為運(yùn)行:”);

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

printf(n%s%d%d\nn,pcb2[i].name,pcb2[i].p

riority,pcb2[i].runtime);

printf("堵塞進(jìn)程:\nH);

for(j=0;j<r;j++)

printf(n%s%d%d\nn,pcbl[j].name,pcbl[j].

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

priority,pcbl[j].runtime);

break;

)

else

printf("該進(jìn)程已是堵塞進(jìn)程!\n“);

break;

)

)

if(x==3)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printf(n........................喚醒進(jìn)程

.....................W);

printfC請輸入要喚醒的進(jìn)程:");

scanf(n%sn,name);

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

(

if(strcmp(pcbl[i].name,name)==O)

|

t=i;

strcpy(pcb[k].name9pcb1[t].name);

pcb[k].priority=pcbl[t].priority;

pcb[k].runtime=

pcbl[t].runtime;

k=k+l;

for(j=t;j<r;j++)

strcpy(pcbl[j].name,pcbl[j+l].name);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

pcbl[j].priority=

pcbl[j+l].priority;

pcbl[j].runtime=

pcbl[j+l].runtime;

)

r=r-l;

printf("就緒進(jìn)程:\nn);

for(j=0;j<k;j++)

printf(n%s%d%d\nn,pcb[j].name,pcb[j].pri

ority,pcb[j].runtime);

printf("堵塞進(jìn)程:\nn);

for(j=0;j<r;j++)

printf(n%s%d%d\nn,pcbl[j].name,pcbl[j].

priority,pcb1[j].runtime);

break;

)

else

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printfC該堵塞進(jìn)程為空,不能喚醒

進(jìn)程!\曖);

break;

)

)

//for(j=0;j<k;j++)

//printf(n%s%d%d\nn,pcb[j].name,pcb[j].p

riority,pcb[j].runtime);

if(x==4)

(

printf(n.......................終止進(jìn)程

....................\nn);

printfC請輸入你要終止的進(jìn)程:

”);

scanf(n%sn,name);

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

(

if(strcmp(pcb[i].name,name)==O)

(

t=i;

for(j=t;j<k;j++)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

strcpy(pcb[j].name,pcb[j+l].name);

pcb[j].priority

pcb[j+1].priority;

pcb[j].runtime

pcb[j+1].runtime;

)

k=k-l;

)

if(strcmp(pcbl[i].name,name)==O)

|

t=i;

for(j=t;j<r;j++)

(

strcpy(pcbl[j].name,pcbl[j+l].name);

pcbl[j].priority

pcbl[j+l].priority;

pcbl[j].runtime

pcbl[j+l].runtime;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

)

r=r-l;

)

)

printf("就緒進(jìn)程:\nH);

for(j=0;j<k;j++)

printf(n%s%d%d\nn,pcb[j].name,pcb[j].pri

ority,pcb[j].runtime);

printf("堵塞進(jìn)程:\nH);

for(j=0;j<r;j++)

printf(n%s%d%d\nn,pcbl[j].name,pcbl[j].

priority,pcbl[j].runtime);

)

if(x==5)

(

printf(n...................顯示進(jìn)程

..........S');

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printfC就緒進(jìn)程:\nn);

for(j=0;j<k;j++)

printf(n%s%d%d\nn,pcb[j].name,pcb[j].pri

ority,pcb[j].runtime);

printf("堵塞進(jìn)程:\nn);

for(j=0;j<r;j++)

printf(n%s%d%d\nM,pcbl[j].name,pcbl[j].

priority,pcbl[j].runtime);

)

)

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

程序運(yùn)行結(jié)果及分析

1)運(yùn)行結(jié)果

?*C:\Windows\sy$tem32\Debug'llll.exe*

--------菜單一…一■=

退系

0---

-進(jìn)

進(jìn)

-建

創(chuàng)

-進(jìn)

進(jìn)

-示

-〈

進(jìn)

清輸入你的選擇:1

-----------------創(chuàng)建迓程一

譚程名,a

優(yōu)先練2

海行時間:3

耦輸入你的選擇?La…

卜----------------創(chuàng)建進(jìn)程一

除程拓b

唯越2

運(yùn)行時冏3

常輸入你的選擇,5曰二小知

-----------------顯:程一

就緒進(jìn)程?

A23

b23

堵塞進(jìn)程?

g23

請輸入你的選擇:2

-----------------堵塞進(jìn)程一

清解人要喜找電注程一

醯舞列調(diào)度為運(yùn)行…2

s23

A23

請輸入你的選擇:3

-----------------映酸進(jìn)程-

最黔第喚醒的進(jìn)笛$

b23

s23

堵塞進(jìn)程:

a23

產(chǎn)

請輸入你的選擇:4

-----------------終止進(jìn)程一

曙辭要終止的進(jìn)道a

b23

s23

實(shí)驗(yàn)感想:

經(jīng)過設(shè)計并調(diào)試創(chuàng)立、終止、阻塞、喚

醒原語功能,加深了對操作系統(tǒng)中進(jìn)程控制

功能的理解,而且掌握操作系統(tǒng)模塊的設(shè)計

方法和工作原理。更重要的是理解了操作系

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

統(tǒng)的調(diào)度方法是就緒-運(yùn)行-堵塞-喚醒-結(jié)

束的過程。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

實(shí)驗(yàn)二、模擬進(jìn)程調(diào)度功能

實(shí)驗(yàn)?zāi)康模?/p>

經(jīng)過本實(shí)驗(yàn),進(jìn)一步掌握進(jìn)程調(diào)度的功能

和實(shí)現(xiàn)原理。

實(shí)驗(yàn)內(nèi)容:

1、設(shè)計進(jìn)程調(diào)度功能,至少模擬兩種以上調(diào)度

算法。如:優(yōu)先級調(diào)度算法、時間片調(diào)度算

法等。

2、進(jìn)程調(diào)度功能作為一個函數(shù)scheduler,加

入到實(shí)驗(yàn)題目一中。

3、進(jìn)程調(diào)度程序從就緒隊列中挑選進(jìn)程,若隊

列為空,應(yīng)顯示“無就緒進(jìn)程無法調(diào)度”的

提示信息。

4、若選上一個進(jìn)程,以顯示:進(jìn)程名、狀態(tài)、

時間片、優(yōu)先級等信息表示一個進(jìn)程被執(zhí)行。

若運(yùn)行完,應(yīng)刪除相應(yīng)PCB。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

實(shí)驗(yàn)步驟:

1、在實(shí)驗(yàn)題目一中的主菜單中加入一個菜單

項(xiàng):6調(diào)度,選擇該菜單項(xiàng)后,系統(tǒng)進(jìn)入進(jìn)

程調(diào)度。

2、進(jìn)程調(diào)度的結(jié)榔-------------------

進(jìn)程調(diào)度子菜

0--------返

回主菜單

1---------優(yōu)

先級調(diào)度

2--------時

間片調(diào)度

請選擇您需要

的功能選項(xiàng):

讀入選擇=》X

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

返回上級菜單

轉(zhuǎn)優(yōu)先級調(diào)度算法轉(zhuǎn)時間片調(diào)度算法

實(shí)驗(yàn)代碼:

#include<stdio.h>

#include<string.h>

voidpriority();

voidtime();

structPCB

charname[4];

intpriority;

intruntime;

);

structPCBpcb[5];

intq=5;

voidmain()

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

intp,i;

§11X^丫8由[0].1121110「十1”);〃序歹1|隊歹!),優(yōu)先級

由高到低為1,2,3.?…

pcb[0].priority=2;

pcb[O].runtime=3;

strcpy(pcb[1].nameJp2'')序歹[J隊歹!J

pcb[l].priority=3;

pcb[l].runtime=2;

§1;0^丫8(:1)[2].1121]10」十3");〃序歹1|隊歹1|

pcb[2].priority=1;

pcb[2].runtime=4;

strcpy(pcb[3].nameJp4");〃序歹lj隊歹!J

pcb[3].priority=5;

pcb[3].runtime=6;

§(1\^丫8(:夙4].1121]10」十5");〃序歹[]隊歹!|

pcb[4].priority=4;

pcb[4].runtime=5;

printf(".........................................進(jìn)程調(diào)度子菜

單...................\nn);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printf(n

0............退出系統(tǒng)\n”);

printf(n

1.....優(yōu)先級調(diào)度\n”);

printf(n

2.....時間片調(diào)度\n”);

printf(n\n\ii顯示所有進(jìn)程\n");

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

printf(n%s%d%d\nn,pcb[i].name,pcb[i].

priority,pcb[i].runtime);

printf("請選擇您需要的功能選項(xiàng):");

scanf(n%dn,&p);

printf**********************")?

while(l)

if(p==0)

break;

switch(p)

//case0:

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

//break;

case1:

printf("優(yōu)先級調(diào)度算法\n");

priority();

break;

case2:

printf("時間片調(diào)度算法\n“);

time();

break;

)

printf("請選擇您需要的功能選項(xiàng)

scanf(n%dn,&p);

printf(,,**********************'')?

)

voidpriorityO

(

inti,j;

intt=O,r=O;

//intq=5;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

charname[2]=nn;

for(i=0;i<q-l;i++)

for(j=i;j<q;j++)

(

if(pcb[i].priority>pcb[j].priority)

(

strcpy(name,pcb[i].name);

strcpy(pcb[i].name,pcb[j].name);

strcpy(pcb[j].name,name);

t=pcb[i].priority;

pcb[i].priority=pcb[j].priority;

pcb[j].priority=t;

r=pcb[i].runtime;

pcb[i].runtime=pcb[j].ruiitime;

pcb[j].ruiitime=r;

)

)

printf("按優(yōu)先級高低進(jìn)行排序\n”);

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

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printf(n%s%d%d\nn,pcb[i].name,pcb[i].

priority,pcb[i].runtime);

printf(,,***********************\u'')?

printf("顯示優(yōu)先級最高的進(jìn)程\n");

printf(n%s%d%d\nn,pcb[O].name,pcb[O].p

riority,pcb[0].runtime);

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

strcpy(pcb[i].name,pcb[i+l].name);

pcb[i].priority=pcb[i+l].priority;

pcb[i].runtime=pcb[i+l].runtime;

)

printf(“*********************'')?

printf(“使最高優(yōu)先級進(jìn)程處于執(zhí)行狀態(tài)

(撤銷該進(jìn)程)\n”);

for(i=0;ivq-l;i++)〃撤銷進(jìn)程

printf(n%s%d%d\nM,pcb[i].name,pcb[i].

priority,pcb[i].runtime);

q=q-i;

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

voidtime()

inti,j,t;

//intq=5;

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

printf(n%s%d%d\nn,pcb[i].name,pcb[i].

priority,pcb[i].runtime);

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

pcb[i].runtime=pcb[i].runtime-l;

)

printf("***********************'n'')?

printf("將每個執(zhí)行進(jìn)程的執(zhí)行時間減去一個

時間片。\n");

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

printf(n%s%d%d\nn,pcb[i].name,pcb[i].

priority,pcb[i].runtime);

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

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

if(pcb[i].runtime<=0)

{t=i;

for(j=t;j<q;j++)

strcpy(pcb[j].name9pcb[j+1].name);

pcb[j].priority

pcb[j+1].priority;

pcb[j].runtime

pcb[j+1].runtime;

)

)

printf("***********************\n'')?

printf("將進(jìn)行結(jié)束的進(jìn)程撤銷。\n");

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

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printf(n%s%d%d\nn,pcb[i].name,pcb[i].

priority,pcb[i].runtime);

)

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

程序運(yùn)行結(jié)果及分析

?1'C:\Windows\system32\Debug\2222.exe,I。M囪I由

清選擇您需要的功能選項(xiàng):2

23

32

45

將每個執(zhí)彳邊程的執(zhí)行時間減去T時間片。

pl22

p231

p544

進(jìn)行結(jié)束的進(jìn)程撤銷。

pl22

p23

44

將每個執(zhí)行進(jìn)程的執(zhí)行時間減去一個時間片。

9121

>230

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

實(shí)驗(yàn)感想:

經(jīng)過本實(shí)驗(yàn),我進(jìn)一步掌握進(jìn)了程調(diào)度的功

能和實(shí)現(xiàn)原理。熟練掌握了兩種進(jìn)程調(diào)度算法的

應(yīng)用,相信這對以后進(jìn)一步學(xué)習(xí)操作系統(tǒng)、信息

系統(tǒng)的開發(fā)都有很大的好處。

實(shí)驗(yàn)三:模擬動態(tài)分區(qū)首次適應(yīng)分配和回收算法

實(shí)驗(yàn)?zāi)康模?/p>

經(jīng)過本實(shí)驗(yàn),可加深理解動態(tài)分區(qū)分配、回

收程序的功能和具體實(shí)現(xiàn),特別是對回收分區(qū)的

合并的理解。

實(shí)驗(yàn)內(nèi)容:

1、設(shè)計動態(tài)分區(qū)首次適應(yīng)分配、回收算法。

2、設(shè)計“未分配區(qū)說明表”,格式為:

序號始址長度狀態(tài)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

160k2001

0

3、設(shè)計”已分配區(qū)說明表”,格式為:

作業(yè)名|始址]長度狀態(tài)一

0

0

4、設(shè)計顯示程序,將“未分配區(qū)說明表”和

“已分配區(qū)說明表”的內(nèi)容,顯示在屏幕上。

初始分配從一個空閑區(qū)分配起,回收時要合

并空區(qū)。

實(shí)驗(yàn)步驟:

1、系統(tǒng)要求分配一個分區(qū)時,應(yīng)輸入:作業(yè)名、

作業(yè)長度。

2、回收一個分區(qū)時,應(yīng)輸入:回收的作業(yè)名。

回收的分區(qū)請注意是否需要進(jìn)行合并。

實(shí)驗(yàn)代碼:

#include<STDIO.H>

#include<STDLIB.H>

intMAX_SEGMENT=10;〃最大碎片值

structPartition〃分區(qū)表目

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

intPar_Size;〃分區(qū)大小

intPar_No;〃分區(qū)序號或者名字

intAddr;〃分區(qū)地址

intIsUse;〃分區(qū)使用情況,0表示空閑,1表

示使用

Partition*pri;〃前向指針

Partition*next;〃后向指針

);

Partition*Int()〃函數(shù),返回Partition類型指針

{〃初始化空閑分區(qū)表

Partition

list=(structPartition*)malloc(sizeof(struct

Partition));//malloc申請動態(tài)分配空間

list->next=NULL;

H=list;

if(!list)

(

printfC'n錯誤,內(nèi)存初始化分配失?。〕绦?/p>

結(jié)束");

exit(l);

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

Hl=(structPartition*)malloc(sizeof(struct

Partition));

printf("請預(yù)先輸入分區(qū)總大小(以KB為單

位):”);

scanf(n%dH,&Hl->Par_Size);

Hl->Addr=0;

Hl->ParNo=0;

Hl->IsUse=0;

Hl->pri=H;

Hl->next=NULL;

H->next=Hl;////list—>H1

returnlist;

)

Partition*InitFPQ

(〃初始化已分配分區(qū)表

Partition

inti;

FP=(structPartition*)malloc(sizeof(struct

Partition));

FP->next=NULL;

H=FP;

for(i=0;i<10;i++)〃已分配區(qū)先暫定分配

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

十個表目

(

F=(structPartition*)malloc(sizeof(struct

Partition));

if(!F)

(

printf(”n錯誤,內(nèi)存分配失??!程序結(jié)束

”);

exit(l);

)

F->ParSize=0;

F->Addr=0;

F->ParNo=0;

F->IsUse=0;

F->next=NULL;

H->next=F;

F->pri=H;

H=H->next;

)

returnFP;

)

Partition*New_Process(Partition

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

Partition*FP)

{〃為新的進(jìn)程分配資源

Partition

intSize,Name,L;

H=list;

Hl=FP->next;

H=H->next;

printf(”請輸入新作業(yè)的名稱和大小(整

數(shù))\曖);

printf("作業(yè)名稱:“);

scanf(n%dn,&Name);

printf("作業(yè)大小(整數(shù)):");

scanf(n%dn,&Size);

while(H)

(

if(!H)〃表目已查完,無法分配

(

prmtf(n\n已無空閑分區(qū),本次無法分

配!”);

returnlist;

)

else{

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

if(H->IsUse==O)//空表目

//if(H->Par_Size>=Size)〃大小滿足,

空閑分區(qū)大小》要分配的大小

if(H->Par_Size>=Size)〃大小滿足,

|

booltemp=false;

if((H->Par_Size-Size)<=MAX_SEGMENT){//

空閑分區(qū)大小-要分配的大小v碎片值,會產(chǎn)生碎

片,將整塊內(nèi)存大小分配出去,

Size=H->Par_Size;//分配的大小

為整塊內(nèi)存

temp=true;〃會產(chǎn)生碎片

)

〃其它情況就分配大小為請求大小,

不會產(chǎn)生碎片,

L=H,Addr;〃保存空閑分地址

if(temp){

printf("該次內(nèi)存分配會產(chǎn)生碎片,

將整塊內(nèi)存大小%(1分配出去![Size);

}else{

printf("該次內(nèi)存分配不會產(chǎn)生碎

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

片”);

)

break;

)

)

H=H->next;〃否則,繼續(xù)往下查找

)

if(H)

(

if(H->Par_Size>Size)〃大小滿足,空閑分區(qū)

大小》要分配的大小

(

P=(structPartition*)malloc(sizeof(struct

Partition));〃分配新的表目,處理一條數(shù)

據(jù),分配一次內(nèi)存

P->IsUse=l;

P,Addr=L;〃指向空閑分區(qū)地址

P->next=H;〃修改指針

H->pri->next=P;

P->pri=H->pri;

H->pri=P;

P->Par_Size=Size;〃分配大小為要請求分

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

配的大小

P->Par_No二Name;〃名稱

H->Par_Size-=Size;〃修改空閑分區(qū),H

所指區(qū)塊大小減Size

H->Addr+=Size;〃H所指區(qū)塊地址力口Size

}else

(

H->IsUse=l;〃大小相等的,把當(dāng)前表

項(xiàng)設(shè)置空表目

)

while(Hl)

(

if(Hl->IsUse==O)

(

Hl->Par_No=Name;

Hl->ParSize=Size;

Hl->Addr=L;〃保存已分配地址

Hl->IsUse=l;〃在已分配表中設(shè)置為已

分配

break;

)

Hl=Hl->next;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

)

}else

printf(”所申請資源已大過系統(tǒng)所擁有的,

請重新輸入!\n");

returnlist;

)

Partition*Reclaim(PartitionPartition

*FP)

(〃結(jié)束作業(yè),資源回收,N。為作業(yè)名,回收內(nèi)

Partition*H1,*H2,*H3,*HF;//H1為釋放

區(qū),H2為后分區(qū),H3為前分區(qū)

intNo;〃作業(yè)名

Hl=list;

HF=FP;〃可有可無?

Hl=Hl->next;

HF=FP->next;

printf("請輸入您想結(jié)束的作業(yè)名:");

scanf(H%Dn,&No);

while(HF)〃對已分配表進(jìn)行操作

if(HF->Par_No==No)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

HF->IsUse=O;〃標(biāo)志為空表目

break;〃這時保存著HF所指分區(qū)的信息

)

HF=HF->next;

)

if(!HF)〃如果找不到該作業(yè),則提示出錯

prin情(”所輸入的作業(yè)名稱不正確,請重新

輸入!”);

else{

while(Hl)//對空閑表進(jìn)行操作

(

if(Hl->Par_No==No)

(

Hl->IsUse=O;〃標(biāo)志為空表目

printf(”內(nèi)存回收成功”);

break;

)

Hl=Hl->next;

)

H2=HL>next;〃后分區(qū)

H3=HL>pri;〃前分區(qū)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

if(H2&&H2,IsUse==0)〃后接分區(qū)為空閑

(

if(H2->next==NULL)〃判斷后接分區(qū)

是否為尾結(jié)點(diǎn)

(

Hl->Par_Size+=H2->Par_Size;//把

H2合并到H1

Hl->next=NULL;

free(H2);

printf(n已回收%d大小內(nèi)存

n,Hl->Par_Size);

}else〃后分區(qū)不為空閑,表示已經(jīng)被使用

(

Hl->Par_Size+=H2->Par_Size;

Hl->next=H2->next;

H2->next->pri=Hl;

free(H2);

printf(n已回收%d大小內(nèi)存

n,Hl->Par_Size);

)

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

if(H3&&H3->IsUse==0)〃前分區(qū)為空閑

分區(qū),則合并去前分區(qū)

H3->ParSize+=Hl->ParSize;

H3->next=Hl->next;

if(Hl->next!=NULL)〃若Hl為尾結(jié)點(diǎn)

Hl->next->pri=H3;

free(Hl);

printf(n已回收%d大小內(nèi)存

M,Hl->Par_Size);

)

)

returnlist;

)

voidPrint(PartitionPartition*FP)

(〃輸出已分配分區(qū)和空閑分區(qū)

Partition

Hl=list->next;

H2=FP;

H2=H2->next;

?/

-MVW-%**rjwrj*rj、rj、rj?rjwrjwrj?rjwrjwrjwrj?*jwrjwrjwrjwrjwrj*rj?*J?rj**Jwrj*

*******¥****¥***¥¥g);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

?Ar/tf%S?alx*1**2><S?

VJ?*|VITTI5不不不不不不不不不不不不不不不不

printfC分區(qū)序號大小開始地址狀態(tài)

W”);

while(Hl)

(

printf(n%d%d

%dn,Hl->Par_No,Hl->Par_Size,Hl->Addr);

if(Hl->IsUse==l)

printf(n已分配\n”);

printf(H空表目\n");

Hl=Hl->next;

ff*£**1*<*?***

*,*]**J??2*rj?*2?r2*rjwrj?rj*rj?rjw*{?rjwrjwrj*rj*rjwrj?

¥豕***¥¥¥**¥¥¥***¥¥3);

voidMain_Print(Partition*list,Partition*FP)

〃主入口函數(shù),進(jìn)行菜單選擇

intop;

while(l)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printf(n\n........................................主菜單

.................M);

printf(H\nH);

printf(”L申請新的作業(yè),分配內(nèi)存\n");

printf("2.結(jié)束作業(yè),回收內(nèi)存\n”);

printf("3.查看內(nèi)存表\n");

printf("4.退出系統(tǒng)\n");

printf(n\n請選擇vl-4>:");

scanf(n%dn,&op);

switch(op)〃根據(jù)輸入,選擇分支方向

(

case1:

New_Process(list,FP);

break;

case2:

Reclaim(list,FP);

break;

case3:

Print(list,FP);

break;

case4:

break;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

default:

printf(n\n選擇錯誤,請重新選擇!”);

break;

)

if(op==4)

break;〃退出循環(huán)

)

)

voidmain()

{〃主函數(shù)入口

structPartition*list,*FP;

list=Int();

FP=InitFP();

Main_Print(list,FP);

)

程序運(yùn)行結(jié)果及分析

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

請預(yù)先輸入分區(qū)m大?。家远鵀閱挝弧?120

-----------------------轉(zhuǎn)單一

清誨擇

磬入烈f業(yè)的名稱和大小遭數(shù)〉

北坐大片整數(shù)>:80

該茨內(nèi)在耀冬會產(chǎn)生碎片

?主菜單,

內(nèi)存

S第

的俏

業(yè)

請選擇<1-4):2

i束的作業(yè)名

鹵存回物

四單---------

內(nèi)存

運(yùn)擇

解入拓作業(yè)的名稱和大小《整數(shù)〉

業(yè)名稱:100

黯禽鬻皆累統(tǒng)所擁有的.請重新輸入,

-------------------------主菜單--------

的伍窗

內(nèi)存

b整

w^亞

i表

退

出g

i*TIM工-

己C

J硼-

大F

e空

80已

4080

內(nèi)存

作窗I

^n掂

董,

退g

實(shí)驗(yàn)感想:

經(jīng)過本實(shí)驗(yàn),加深了對動態(tài)分區(qū)分配、

回收程序的功能和具體實(shí)現(xiàn),特別是對回收

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

分區(qū)的合并的理解。

實(shí)驗(yàn)五:模擬使用銀行家算法判斷系統(tǒng)的狀態(tài)

實(shí)驗(yàn)?zāi)康模?/p>

了解進(jìn)程管理的實(shí)現(xiàn)方法,理解和掌握

處理進(jìn)程同步問題的方法。

實(shí)驗(yàn)內(nèi)容:

實(shí)現(xiàn)銀行家算法、進(jìn)程調(diào)度過程的模擬、讀者-寫者問題的寫者優(yōu)先算

法。

實(shí)驗(yàn)步驟:

?理解安全性算法和銀行家算法的核心機(jī)

制:

?理解進(jìn)程的三狀態(tài)調(diào)度過程,及各狀態(tài)間的轉(zhuǎn)換關(guān)系;

?設(shè)計讀者-寫者問題的寫者優(yōu)先算法;

實(shí)驗(yàn)代碼:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

#definem50

intnol;〃進(jìn)程數(shù)

intno2;〃資源數(shù)

intr;

int

allocation[m][m],need[m][m],available[m],max[

charnamel[m],name2[m];

〃定義全局變量

voidmain()

voidcheck();

voidprint();

inti,j,p=O,q=O;

charc;

int

request[m],allocationl[m][m],needl[m][m],avail

ablel[m];

printf(n銀行家算法

\n");

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

printf「請輸入進(jìn)程總數(shù)

scanf(n%dn,&nol);

printfC請輸入資源種類數(shù)嚴(yán));

scanf(M%dM,&no2);

printf("請輸入最大需求矩陣八n");

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

for(j=0;j<no2;j++)

scanf(n%dn,&max[i][j]);〃輸入已知

進(jìn)程最大資源需求量

printf(”請輸入當(dāng)前分配矩陣:\n");

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

for(j=0;j<no2;j++)

scanf(n%dn,&allocation[i][j]);〃輸入

已知的進(jìn)程已分配的資源數(shù)

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

for(j=0;j<no2;j++)

need[i][j]=max[i][j]-allocation[i]|j];//根

據(jù)輸入的兩個數(shù)組計算出need矩陣的值

printf("請輸入可利用資源矩陣\n");

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

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

scanf(H%dH,&available[i]);〃輸入

已知的可用資源數(shù)

printQ;〃輸出已知條件

check();〃檢測TO時刻已知條件的安全狀態(tài)

if(r==l)〃如果安全則執(zhí)行以下代碼

(

do{

q=0;

P=0;

printf("\n請輸入請求資源的進(jìn)程號

(0-4):\nn);

for(j=0;j<=10;j++)

(

scanf(n%dn,&i);

if(i>=nol)

|

printf("輸入錯誤,請重新輸入:\n");

continue;

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

elsebreak;

)

printf("\n請輸入該進(jìn)程所請求的資源數(shù)

request[j]:\nn);

for(j=0;j<no2;j++)

scanf(n%dn,&request[j]);

for(j=0;j<no2;j++)

if(request[j]>need[i][j])p=l;

〃判斷請求是否超過該進(jìn)程所需要的

資源數(shù)

if(p)

printf("請求資源超過該進(jìn)程資源需

求量,請求失??!\nn);

else

(

for(j=0;j<no2;j++)

if(request[j]>available[j])q=l;〃判

斷請求是否超過可用資源數(shù)

if(q)

printf(“沒有做夠的資源分配,請

求失敗!\nn);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

else

〃請求滿足條件

(

for(j=0;j<no2;j++)

(

availablel[j]=available[j];

allocation1[i][j]=allocatioii[i][j];

needl[i][j]=need[i][j];

〃保存原已分配的資源數(shù),仍需要的

資源數(shù)和可用的資源數(shù)

available[j]=available[j]-request[j];

allocation[i][j]+=request[j];

need[i][j]=need[i][j]-request[j];

〃系統(tǒng)嘗試把資

源分配給請求的進(jìn)程

)

print。;

check();〃檢測分配后的安

全性

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

if(r==O)〃如果分配后系統(tǒng)不安

(

for(j=0;j<no2;j++)

(

available[j]=availablel[j];

allocation[i][j]=allocatioiil[i][j];

need[i][j]=needl[i][j];

〃還原已分配的資源數(shù),

仍需要的資源數(shù)和可用的資源數(shù)

)

print—返回分配前資源數(shù)

W);

print();

)

)

}prmtf(n\n你還要繼續(xù)分配嗎?Yor

N?\nn);

〃判斷是否繼續(xù)進(jìn)行資源分配

c=getche();

}while(c==,y,||c==,Y*);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

)

)

voidcheck()〃安全算法函數(shù)

(

intk,f,v=O,i,j;

intwork[m],a[m];

boolfinish[m];

r=l;

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

finish[i]=false;〃初始化進(jìn)程均沒得到

足夠資源數(shù)并完成

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

work[i]=available[i];〃work[i]表示可提供

進(jìn)程繼續(xù)運(yùn)行的各類資源數(shù)

k=nol;

do{

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

if(finish[i]==false)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

f=l;

for(j=0;j<no2;j++)

if(need[i][j]>work[j])

f=0;

if(f==l)〃找到還沒有完成且

需求數(shù)小于可提供進(jìn)程繼續(xù)運(yùn)行的資源數(shù)的進(jìn)

(

finish[i]=true;

a[v++]=i;〃記錄安全序列號

for(j=0;j<no2;j++)

work[j]+=allocatioii[i][j];〃釋

放該進(jìn)程已分配的資源

)

)

)

k-;〃每完成一個進(jìn)程分配,未完成

的進(jìn)程數(shù)就減1

}whiIe(k>0);

f=l;

for(i=0;i<nol;i++)〃判斷是否所有的進(jìn)程

都完成

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

if(finish[i]==false)

(

f=0;

break;

)

)

if(f==O)〃若有進(jìn)程沒完成,則為不安

全狀態(tài)

(

printf("系統(tǒng)處在不安全狀態(tài)!”);

r=0;

)

else

(

printf(n\n系統(tǒng)當(dāng)前為安全狀態(tài),安全序列

為:\nn);

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

printf(Mp%dn,a[i]);〃輸出安全序列

)

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

voidprint()〃輸出函數(shù)

inti,j;

printf(n\nn);

printf(**************此時刻資源分配情況

¥¥***¥¥¥**¥¥¥***¥¥¥**W?fX).

printfc進(jìn)程名/號|最大需求矩陣|

當(dāng)前分配矩陣I需求矩陣|\曖);

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

(

printf(Mp%d/%dn,i,i);

forG=0;j<no2;j++)

{printf(n%dn,max[i][j]);}

for0=0;j<no2;j++)

{printf(H%d

n,a

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論