版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 姓名: </p><p> 學(xué)號(hào): </p><p> 班級(jí): 11計(jì)科 1班 </p><p> 指導(dǎo)老師: </p><p> 時(shí)間: 2014 年1月3日 </p>&
2、lt;p><b> 目錄</b></p><p> 任務(wù)一、進(jìn)程創(chuàng)建、控制與撤消1</p><p><b> 一、 實(shí)驗(yàn)?zāi)康?</b></p><p><b> 二、 實(shí)驗(yàn)內(nèi)容1</b></p><p> 三、 主要的函數(shù)解釋1</p>&
3、lt;p><b> 四、 源代碼1</b></p><p><b> 五、 運(yùn)行結(jié)果7</b></p><p> 六、 心得與體會(huì)9</p><p> 任務(wù)二、單處理機(jī)系統(tǒng)的進(jìn)程調(diào)度9</p><p><b> 一、實(shí)驗(yàn)?zāi)康?</b></p>
4、;<p><b> 二、實(shí)驗(yàn)內(nèi)容9</b></p><p> 三、 主要的函數(shù)解釋10</p><p><b> 四、 源代碼10</b></p><p> 五、 運(yùn)行結(jié)果16</p><p> 六、 心得與體會(huì)17</p><p> 任務(wù)
5、三、基本存儲(chǔ)器管理17</p><p> 一、 實(shí)驗(yàn)?zāi)康?7</p><p> 二、 實(shí)驗(yàn)內(nèi)容18</p><p> 三、主要的函數(shù)解釋18</p><p><b> 四、 源代碼18</b></p><p> 五、 運(yùn)行結(jié)果25</p><p>
6、六、 心得與體會(huì)26</p><p> 任務(wù)四、請(qǐng)求分頁(yè)存儲(chǔ)管理(虛擬存儲(chǔ))26</p><p><b> 一、實(shí)驗(yàn)?zāi)康?6</b></p><p> 二、 實(shí)驗(yàn)內(nèi)容26</p><p> 三、主要的函數(shù)解釋27</p><p><b> 四、 源代碼27</
7、b></p><p> 五、 運(yùn)行結(jié)果32</p><p> 六、 心得與體會(huì)32</p><p> 任務(wù)五、死鎖的避免33</p><p> 一、 實(shí)驗(yàn)?zāi)康?3</p><p><b> 二、實(shí)驗(yàn)內(nèi)容33</b></p><p> 三、主要的函
8、數(shù)解釋34</p><p><b> 四、源代碼34</b></p><p> 五、 運(yùn)行結(jié)果40</p><p> 六、心得與體會(huì)40</p><p> 任務(wù)六、磁盤(pán)空間的分配與回收41</p><p> 一、 實(shí)驗(yàn)?zāi)康?1</p><p> 三、
9、 主要的函數(shù)解釋42</p><p><b> 四、 源代碼42</b></p><p> 五、 運(yùn)行結(jié)果45</p><p> 六、 心得與體會(huì)46</p><p> 任務(wù)七、文件管理47</p><p><b> 一、實(shí)驗(yàn)?zāi)康?7</b></p
10、><p><b> 二、實(shí)驗(yàn)內(nèi)容47</b></p><p> 三、主要的函數(shù)解釋47</p><p><b> 四、源代碼48</b></p><p><b> 五、運(yùn)行結(jié)果64</b></p><p> 六、 心得與體會(huì)65</
11、p><p> 任務(wù)一、進(jìn)程創(chuàng)建、控制與撤消</p><p><b> 實(shí)驗(yàn)?zāi)康?lt;/b></p><p> 加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別;</p><p> 進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的概念,區(qū)別順序執(zhí)行和并發(fā)執(zhí)行;</p><p> 分析進(jìn)程爭(zhēng)用臨界資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法;
12、</p><p><b> 實(shí)驗(yàn)內(nèi)容</b></p><p> 在WINDOWS環(huán)境下模擬實(shí)驗(yàn):</p><p> 1、編寫(xiě)一程序,來(lái)模擬進(jìn)程的創(chuàng)建和撤消,要求通過(guò)終端鍵盤(pán)輸入三、四 </p><p> 業(yè)的名稱(chēng)、大小、優(yōu)先級(jí)等。系統(tǒng)為它創(chuàng)建進(jìn)程,并把進(jìn)程控制塊PCB的內(nèi)容送到終端顯示器上輸出。</p&g
13、t;<p> 2、同時(shí)模擬內(nèi)存空間為作業(yè)分配內(nèi)存空間,并把結(jié)果用圖形形象地表示出</p><p> 來(lái),同樣通過(guò)終端輸出。按進(jìn)程的優(yōu)先級(jí)的順序撤消進(jìn)程,同時(shí)通過(guò)終端顯示PCB的撤消過(guò)程和內(nèi)存的 釋放過(guò)程。</p><p><b> 主要的函數(shù)解釋</b></p><p> create()//創(chuàng)建新的進(jìn)程</p&g
14、t;<p> void viewrun()//查看運(yùn)行進(jìn)程</p><p> void huanchu()//換出某個(gè)進(jìn)程</p><p> void kill()//殺死運(yùn)行進(jìn)程</p><p> void tongxun()//進(jìn)程之間通信</p><p> main ()//主函數(shù)</p><
15、p><b> 源代碼</b></p><p> #include "conio.h"</p><p> #include "stdio.h"</p><p> #include "stdlib.h"</p><p> struct jinchen
16、g_type</p><p><b> { </b></p><p><b> int pid;</b></p><p> int youxian;</p><p> int daxiao;</p><p><b> int msg;</b>
17、</p><p><b> int live;</b></p><p><b> };</b></p><p> struct jincheng_type neicun[20],waicun[20];</p><p> int shumu=0,pid_1;</p><p&
18、gt;<b> create()</b></p><p><b> {</b></p><p> if(shumu>=20)</p><p><b> {</b></p><p> printf("\n 內(nèi)存已滿(mǎn),請(qǐng)先結(jié)束或換出進(jìn)程\n");
19、</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("\n 請(qǐng)輸入新進(jìn)程的 pid\n");</p><p> scanf
20、("%d",&neicun[shumu+1].pid);</p><p> printf("\n 請(qǐng)輸入新的進(jìn)程的優(yōu)先級(jí)\n");</p><p> scanf("%d",&neicun[shumu+1].youxian);</p><p> printf("\n 請(qǐng)輸入新的
21、進(jìn)程的大小\n");</p><p> scanf("%d",&neicun[shumu+1].daxiao);</p><p> printf("\n 請(qǐng)輸入新的進(jìn)程的消息\n");</p><p> scanf("%d",&neicun[shumu+1].msg);<
22、;/p><p> neicun[shumu+1].live=1;</p><p><b> shumu++;</b></p><p><b> }</b></p><p> return neicun[shumu-1].live;</p><p><b> }
23、</b></p><p> void viewrun()</p><p><b> {</b></p><p><b> int vpid;</b></p><p> printf("\n 請(qǐng)輸入進(jìn)程的pid\n");</p><p>
24、 scanf("%d",&vpid);</p><p> if(vpid>0&&vpid<=20&&neicun[vpid].live==1)</p><p><b> {</b></p><p> printf("\n進(jìn)程的pid是:%d\n"
25、,neicun[vpid].pid);</p><p> printf("\n進(jìn)程的優(yōu)先級(jí)是:%d\n",neicun[vpid].youxian);</p><p> printf("\n進(jìn)程的大小是:%d\n",neicun[vpid].daxiao);</p><p> printf("\n進(jìn)程的消息是:
26、%d\n",neicun[vpid].msg);</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> printf("\n 所查看運(yùn)行進(jìn)程不存在\n")
27、;</p><p><b> }</b></p><p> printf("請(qǐng)按回車(chē)退出查看\n");</p><p> vpid=getch();</p><p><b> }</b></p><p> void huanchu()</p
28、><p><b> {</b></p><p> int pid1,pid2;</p><p><b> char c;</b></p><p> printf("\n 請(qǐng)輸入第一個(gè)替換進(jìn)程的pid\n");</p><p> scanf(&quo
29、t;%d",&pid1);</p><p> printf("\n 請(qǐng)輸入第二個(gè)替換進(jìn)程的pid\n");</p><p> scanf("%d",&pid2);</p><p> if(pid1>0&&pid1<=20&&neicun[pid1].l
30、ive==1)</p><p><b> {</b></p><p> if(neicun[pid1].youxian>neicun[pid2].youxian)</p><p><b> { </b></p><p> waicun[20].pid=neicun[pid
31、1].pid;</p><p> waicun[20].youxian=neicun[pid1].youxian;</p><p> waicun[20].daxiao=neicun[pid1].daxiao;</p><p> waicun[20].msg=neicun[pid1].msg;</p><p> neicun[pid1
32、].pid=neicun[pid2].pid;</p><p> neicun[pid1].youxian=neicun[pid2].youxian;</p><p> neicun[pid1].daxiao=neicun[pid2].daxiao;</p><p> neicun[pid1].msg=neicun[pid2].msg;</p>
33、<p> neicun[pid2].pid=waicun[20].pid;</p><p> neicun[pid2].youxian=waicun[20].youxian;</p><p> neicun[pid2].daxiao=waicun[20].daxiao;</p><p> neicun[pid2].msg=waicun[20].ms
34、g;</p><p> printf("\n 替換完成\n");</p><p> printf("\n 被替換進(jìn)程的pid是:%d\n",waicun[20].pid);</p><p> printf("\n 被替換進(jìn)程的youxian是:%d\n",waicun[20].youxian);<
35、;/p><p> printf("\n 被替換進(jìn)程的daxiao是:%d\n",waicun[20].daxiao);</p><p> printf("\n 被替換進(jìn)程的msg是:%d\n",waicun[20].msg);</p><p><b> }</b></p><p>
36、;<b> else</b></p><p><b> {</b></p><p> printf("\n進(jìn)程優(yōu)先級(jí)不夠大");</p><p><b> }</b></p><p><b> }</b></p>
37、<p><b> else</b></p><p><b> {</b></p><p> printf("所查看運(yùn)行進(jìn)程不存在");</p><p><b> }</b></p><p> printf("請(qǐng)按回車(chē)退出換出進(jìn)
38、程\n");</p><p> c=getche();</p><p><b> }</b></p><p> void kill()</p><p><b> {</b></p><p><b> int kpid;</b><
39、/p><p> printf("\n 請(qǐng)輸入進(jìn)程的pid\n");</p><p> scanf("%d",&kpid);</p><p> if(kpid>0&&kpid<20&&neicun[kpid].live==neicun[kpid].live)</p>
40、;<p><b> return;</b></p><p><b> }</b></p><p> void tongxun()</p><p><b> {</b></p><p> int tpid1,tpid2;</p><p&
41、gt; int buffer;</p><p><b> char d;</b></p><p> printf("\n請(qǐng)輸入通信源進(jìn)程pid\n");</p><p> scanf("%d",&tpid1);</p><p> printf("\n請(qǐng)輸
42、入通信目的進(jìn)程pid\n");</p><p> scanf("%d",&tpid2);</p><p> if(tpid1>0&&tpid1<20&&neicun[tpid1].live==1)</p><p><b> { </b></
43、p><p> buffer=neicun[tpid1].msg;</p><p> neicun[tpid1].msg=neicun[tpid2].msg;</p><p> neicun[tpid2].msg=buffer;</p><p> printf("\n源進(jìn)程的信息是:%d\n",neicun[tpid1]
44、.msg);</p><p> printf("\n目的進(jìn)程的信息是:%d\n",neicun[tpid2].msg);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></
45、p><p> printf("\n所查看運(yùn)行進(jìn)程不存在\n");</p><p><b> } </b></p><p> printf("\n請(qǐng)按回車(chē)退出進(jìn)程通信\n");</p><p> d=getch();</p><p><b&
46、gt; }</b></p><p><b> main ()</b></p><p><b> {</b></p><p> int n,m,i;</p><p><b> char a;</b></p><p><b>
47、 n=1;</b></p><p> while(n==1)</p><p><b> {</b></p><p> system("cls");</p><p> printf("\n***********************************")
48、;</p><p> printf("\n* 進(jìn)程演示系統(tǒng) *");</p><p> printf("\n***********************************");</p><p> printf("\n 1.創(chuàng)建新的進(jìn)程 2.查看運(yùn)行進(jìn)程 &q
49、uot;);</p><p> printf("\n 3.換出某個(gè)進(jìn)程 4.殺死運(yùn)行進(jìn)程 ");</p><p> printf("\n 5.進(jìn)程之間通信 6.退出 ");</p><p> printf("\n**********************************
50、*");</p><p> printf("\n請(qǐng)選擇(1~6)");</p><p> a=getch();</p><p><b> switch(a)</b></p><p><b> { </b></p><p> case&
51、#39;1': create();</p><p><b> break;</b></p><p> case'2': viewrun();</p><p><b> break;</b></p><p> case'3': huanchu();<
52、;/p><p><b> break;</b></p><p> case'4': kill();</p><p><b> break;</b></p><p> case'5': tongxun();</p><p><b>
53、 break;</b></p><p> case'6': exit(0);</p><p> default:n=0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }
54、</b></p><p><b> 運(yùn)行結(jié)果</b></p><p><b> 1、創(chuàng)建新進(jìn)程</b></p><p><b> 查看運(yùn)行進(jìn)程</b></p><p><b> 換出進(jìn)程</b></p><p>
55、;<b> 心得與體會(huì)</b></p><p> 任務(wù)一的實(shí)驗(yàn)讓我對(duì)進(jìn)程有著更加的理解,知道了進(jìn)程在我們玩電腦的時(shí)候扮演著重要的角色,進(jìn)程有著搶占的方式等等,對(duì)進(jìn)程的創(chuàng)建、控制、撤銷(xiāo)有著更深的理解,在本次實(shí)驗(yàn)中碰到了很多不太理解的東西,通過(guò)問(wèn)在網(wǎng)上收集資料以及老師和同學(xué)的幫助,本次實(shí)驗(yàn)的基本問(wèn)題解決了。</p><p> 任務(wù)二、單處理機(jī)系統(tǒng)的進(jìn)程調(diào)度</
56、p><p><b> 一、實(shí)驗(yàn)?zāi)康?lt;/b></p><p> 1、加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別</p><p> 2、深入了解系統(tǒng)如何組織進(jìn)程,創(chuàng)建進(jìn)程</p><p> 3、進(jìn)一步認(rèn)識(shí)如何實(shí)現(xiàn)處理機(jī)調(diào)度。</p><p><b> 二、實(shí)驗(yàn)內(nèi)容</b>&
57、lt;/p><p> 從下面三個(gè)調(diào)度算法中,選擇一個(gè)調(diào)度算法來(lái)實(shí)現(xiàn)進(jìn)程調(diào)度:</p><p> 1、先來(lái)先服務(wù)調(diào)度算法</p><p> 2、優(yōu)先數(shù)調(diào)度算法;</p><p> 3、時(shí)間片輪法調(diào)度算法</p><p> 4、多級(jí)反饋隊(duì)列輪轉(zhuǎn)調(diào)度算法</p><p> 注:本次實(shí)驗(yàn)我選的是
58、第二種優(yōu)先數(shù)調(diào)度算法;</p><p><b> 主要的函數(shù)解釋</b></p><p> void sort() /* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/</p><p> void input() /* 建立進(jìn)程控制塊函數(shù)*/ </p><p> void disp(PCB * pr) /*建立進(jìn)程顯示函數(shù),
59、用于顯示當(dāng)前進(jìn)程*/ </p><p> void check() /* 建立進(jìn)程查看函數(shù) */ </p><p> void destroy() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/ </p><p> void running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*/ </p><p> vo
60、id main() /*主函數(shù)*/ </p><p><b> 源代碼</b></p><p> #include "stdio.h" </p><p> #include <stdlib.h></p><p> #include <conio.h> </p
61、><p> #define getpch(type) (type*)malloc(sizeof(type)) </p><p> #define NULL 0 </p><p> struct pcb </p><p> { /* 定義進(jìn)程控制塊PCB */ </p><p> char name[10
62、]; </p><p> char state; </p><p> int super; </p><p> int ntime; </p><p> int rtime; </p><p> struct pcb* link; </p><p> }*re
63、ady=NULL,*p; </p><p> typedef struct pcb PCB; </p><p> void sort() /* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/ </p><p><b> { </b></p><p> PCB *first, *second; </p>&
64、lt;p> int insert=0; </p><p> if((ready==NULL)||((p->super)>(ready->super))) /*優(yōu)先級(jí)最大者,插入隊(duì)首 */ </p><p><b> { </b></p><p> p->link=ready; ready=p; &
65、lt;/p><p><b> } </b></p><p> else /* 進(jìn)程比較優(yōu)先級(jí),插入適當(dāng)?shù)奈恢弥?/ </p><p><b> { </b></p><p> first=ready; second=first->link; </p><p&
66、gt; while(second!=NULL) </p><p><b> { </b></p><p> if((p->super)>(second->super)) /*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù) 大,*/ </p><p> { /*插入到當(dāng)前進(jìn)程前面*/ </p>
67、<p> p->link=second; </p><p> first->link=p; </p><p> second=NULL; </p><p> insert=1; </p><p><b> } </b></p><p&g
68、t; else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/ </p><p><b> { </b></p><p> first=first->link; </p><p> second=second->link; </p><p><b> } &
69、lt;/b></p><p><b> } </b></p><p> if(insert==0) </p><p> first->link=p; </p><p> } </p><p><b> } </b>
70、;</p><p> void input() /* 建立進(jìn)程控制塊函數(shù)*/ </p><p><b> { </b></p><p> int i,num; </p><p> printf("\n請(qǐng)輸入進(jìn)程數(shù)量:"); </p><p> scanf
71、("%d",&num); </p><p> for(i=0;i<num;i++) </p><p><b> { </b></p><p> printf("\n 進(jìn)程號(hào)No.%d:\n",i); </p><p> p=getpch(P
72、CB); </p><p> printf("\n 輸入進(jìn)程名:"); </p><p> scanf("%s",p->name); </p><p> printf("\n 輸入進(jìn)程優(yōu)先數(shù):"); </p><p> scanf("%
73、d",&p->super); </p><p> printf("\n 輸入進(jìn)程運(yùn)行時(shí)間:"); </p><p> scanf("%d",&p->ntime); </p><p> printf("\n"); </p>&l
74、t;p> p->rtime=0;p->state='w'; </p><p> p->link=NULL; </p><p> sort(); /* 調(diào)用sort函數(shù)*/ </p><p><b> } </b></p><p><b>
75、; } </b></p><p> int space() </p><p><b> { </b></p><p><b> int l=0; </b></p><p> PCB* pr=ready; </p><p> while(pr
76、!=NULL) </p><p><b> { </b></p><p><b> l++; </b></p><p> pr=pr->link; </p><p><b> } </b></p><p> ret
77、urn(l); </p><p><b> } </b></p><p> void show() </p><p><b> { </b></p><p> printf("\nqname\tstate\tsuper\tndtime\truntime\n");
78、 </p><p><b> } </b></p><p> void disp(PCB * pr) /*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/ </p><p><b> { </b></p><p> printf(" %s\t",pr->name);
79、 </p><p> printf(" %c\t",pr->state); </p><p> printf(" %d\t",pr->super); </p><p> printf(" %d\t",pr->ntime); </p><p>
80、 printf(" %d\t",pr->rtime); </p><p> printf("\n"); </p><p><b> } </b></p><p> void check() /* 建立進(jìn)程查看函數(shù) */ </p><p><b> {
81、 </b></p><p> PCB* pr; </p><p> printf("\n****當(dāng)前正在運(yùn)行的進(jìn)程是:%s",p->name); /*顯示當(dāng)前運(yùn)行進(jìn)程*/ </p><p><b> show(); </b></p><p> disp(p);
82、 </p><p> pr=ready; </p><p> if(pr==NULL) </p><p> printf("\n****當(dāng)前就緒隊(duì)列為空!"); </p><p><b> else </b></p><p><b> {
83、 </b></p><p> printf("\n****當(dāng)前就緒隊(duì)列狀態(tài)為:"); /*顯示就緒隊(duì)列狀態(tài)*/ </p><p> show(); </p><p> while(pr!=NULL) </p><p><b> { </b>&l
84、t;/p><p> disp(pr); </p><p> pr=pr->link; </p><p><b> } </b></p><p><b> } </b></p><p><b> } </b&g
85、t;</p><p> void destroy() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/ </p><p><b> { </b></p><p> printf("\n 進(jìn)程[%s]已完成.\n",p->name); </p><p> free(p); &
86、lt;/p><p><b> } </b></p><p> void running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*/ </p><p><b> { </b></p><p> (p->rtime)++; </p><p>
87、; if(p->rtime==p->ntime) </p><p> destroy(); /* 調(diào)用destroy函數(shù)*/ </p><p><b> else </b></p><p><b> { </b></p><p> (p->super)--;
88、 </p><p> p->state='w'; </p><p> sort(); /*調(diào)用sort函數(shù)*/ </p><p><b> } </b></p><p><b> } </b></p><p> void
89、main() /*主函數(shù)*/ </p><p><b> { </b></p><p> int len,h=0; </p><p> char ch; </p><p> input(); </p><p> len=space(); </p>&l
90、t;p> while((len!=0)&&(ready!=NULL)) </p><p><b> { </b></p><p> ch=getchar(); </p><p><b> h++; </b></p><p> printf(&qu
91、ot;\n 當(dāng)前運(yùn)行次數(shù)為:%d \n",h); </p><p> p=ready; </p><p> ready=p->link; </p><p> p->link=NULL; </p><p> p->state='R'; </p>&l
92、t;p> check(); </p><p> running(); </p><p> printf("\n 按任一鍵繼續(xù)......"); </p><p> ch=getchar(); </p><p><b> } </b></p><
93、;p> printf("\n\n 進(jìn)程已經(jīng)完成.\n"); </p><p> ch=getchar(); </p><p><b> } </b></p><p><b> 運(yùn)行結(jié)果</b></p><p><b> 輸入五個(gè)進(jìn)程</b
94、></p><p> 按優(yōu)先數(shù)調(diào)度算法如下排序</p><p><b> 心得與體會(huì)</b></p><p> 本次實(shí)驗(yàn)做的是單處理機(jī)系統(tǒng)的進(jìn)程調(diào)度,本人選的方法是優(yōu)先度調(diào)度算法,通過(guò)輸入設(shè)備輸入5個(gè)進(jìn)程以及進(jìn)程的優(yōu)先數(shù)、運(yùn)行時(shí)間,主要是優(yōu)先數(shù)的大小來(lái)使得進(jìn)程的執(zhí)行,優(yōu)先數(shù)大的,進(jìn)程先執(zhí)行,優(yōu)先數(shù)一樣的,按運(yùn)行時(shí)間短的先執(zhí)行。由本次
95、實(shí)驗(yàn)讓我更深入的了解了進(jìn)程的優(yōu)先進(jìn)入權(quán)。</p><p> 任務(wù)三、基本存儲(chǔ)器管理</p><p><b> 實(shí)驗(yàn)?zāi)康?lt;/b></p><p> 一個(gè)好的計(jì)算機(jī)系統(tǒng)不僅要有一個(gè)足夠容量的、存取速度高的、穩(wěn)定可靠的主存儲(chǔ)器,而且要能合理地分配和使用這些存儲(chǔ)空間。當(dāng)用戶(hù)提出申請(qǐng)存儲(chǔ)器空間時(shí),存儲(chǔ)管理必須根據(jù)申請(qǐng)者的要求,按一定的策略分析主存空
96、間的使用情況,找出足夠的空閑區(qū)域分配給申請(qǐng)者。當(dāng)作業(yè)撤離或主動(dòng)歸還主存資源時(shí),則存儲(chǔ)管理要收回作業(yè)占用的主存空間或歸還部分主存空間。主存的分配和回收的實(shí)現(xiàn)與主存儲(chǔ)器的管理方式有關(guān)的,通過(guò)本實(shí)驗(yàn)幫助學(xué)生理解在不同的存儲(chǔ)管理方式下怎樣實(shí)現(xiàn)主存的分配和回收。</p><p><b> 實(shí)驗(yàn)內(nèi)容</b></p><p> 從下兩種存儲(chǔ)管理方式的主存分配和回收中,選擇一種管
97、理方式來(lái)</p><p><b> 實(shí)現(xiàn)本次實(shí)驗(yàn)任務(wù):</b></p><p> 1、在可變(動(dòng)態(tài))分區(qū)管理方式下,采用最先適應(yīng)算法。</p><p> 2、在分頁(yè)式管理方式下,采用位示圖來(lái)表示主存的分配情況和回收情況。</p><p><b> 三、主要的函數(shù)解釋</b></p>
98、;<p> void allocate(char J,float xk) /*給J作業(yè),采用最佳分配算法分配xk大小的空間*/ </p><p> void reclaim(char J) /*回收作業(yè)名為J的作業(yè)所占主存空間*/ </p><p> int main( ) //主函數(shù)</p><p> 注:"0"表
99、示空表目,"1"表示未分配</p><p><b> 源代碼</b></p><p> #include<stdio.h> </p><p> #include <dos.h> </p><p> #include<stdlib.h> </p>
100、<p> #include<conio.h> </p><p> #include<iostream.h> </p><p> #define n 10 /*假定系統(tǒng)允許的最大作業(yè)數(shù)為n,假定模擬實(shí)驗(yàn)中n值為10*/ </p><p> #define m 10 /*假定系統(tǒng)允許的空閑區(qū)表最大為m,假定模擬實(shí)驗(yàn)中
101、m值為10*/ </p><p> #define minisize 100 /*空閑分區(qū)被分配時(shí),如果分配后剩余的空間小于minisize,則將</p><p> 該空閑分區(qū)全部分配,若大于minisize,則切割分配*/ </p><p><b> struct </b></p><p><b>
102、; { </b></p><p> float address; /*已分配分區(qū)起始地址*/ </p><p> float length; /*已分配分區(qū)長(zhǎng)度,單位為字節(jié)*/ </p><p> int flag; /*已分配區(qū)表登記欄標(biāo)志,用"0"表示空欄目*/ </p><p&g
103、t; }used_table[n]; /*已分配區(qū)表*/ </p><p><b> struct </b></p><p><b> { </b></p><p> float address; /*空閑區(qū)起始地址*/ </p><p> float length; /
104、*空閑區(qū)長(zhǎng)度,單位為字節(jié)*/ </p><p> int flag; /*空閑區(qū)表登記欄標(biāo)志,用"0"表示空欄目,用"1"表示未分配*/ </p><p> }free_table[m]; /*空閑區(qū)表*/ </p><p> void allocate(char J,float xk) /*給J作業(yè),
105、采用最佳分配算法分配xk大小的空間*/ </p><p><b> { </b></p><p> int i,k; </p><p> float ad; </p><p><b> k=-1; </b></p><p> for(i=0;i<m
106、;i++) /*尋找空間大于xk的最小空閑區(qū)登記項(xiàng)k*/ </p><p> if(free_table[i].length>=xk&&free_table[i].flag==1) </p><p> if(k==-1||free_table[i].length<free_table[k].length) </p><p>&l
107、t;b> k=i; </b></p><p> if(k==-1)/*未找到可用空閑區(qū),返回*/ </p><p><b> { </b></p><p> printf("無(wú)可用空閑區(qū)\n"); </p><p> return; </p>
108、<p> }/*找到可用空閑區(qū),開(kāi)始分配:若空閑區(qū)大小與要求分配的空間差小于minisize大小,</p><p> 則空閑區(qū)全部分配;若空閑區(qū)大小與要求分配的空間差大于minisize大小,</p><p> 則從空閑區(qū)劃出一部分分配*/ </p><p> if(free_table[k].length-xk<=minisize)
109、</p><p><b> { </b></p><p> free_table[k].flag=0; </p><p> ad=free_table[k].address; </p><p> xk=free_table[k].length; </p><p><b&g
110、t; } </b></p><p><b> else </b></p><p><b> { </b></p><p> free_table[k].length=free_table[k].length-xk; </p><p> ad=free_table[k
111、].address+free_table[k].length; </p><p><b> } </b></p><p> /*修改已分配區(qū)表*/ </p><p><b> i=0; </b></p><p> while(used_table[i].flag!=0&
112、&i<n) /*尋找空表目*/ </p><p><b> i++; </b></p><p> if(i>=n) /*無(wú)表目可填寫(xiě)已分配分區(qū)*/ </p><p><b> { </b></p><p> printf("無(wú)表目填寫(xiě)已分分區(qū),錯(cuò)誤\
113、n"); </p><p> /*修正空閑區(qū)表*/ </p><p> if(free_table[k].flag==0) /*前面找到的是整個(gè)空閑分區(qū)*/ </p><p> free_table[k].flag=1; </p><p><b> else </b></p>
114、;<p> {/*前面找到的是某個(gè)空閑分區(qū)的一部分*/ </p><p> free_table[k].length=free_table[k].length+xk; </p><p><b> return; </b></p><p><b> } </b></p><
115、p><b> } </b></p><p><b> else </b></p><p> {/*修改已分配表*/ </p><p> used_table[i].address=ad; </p><p> used_table[i].length=xk; </p&
116、gt;<p> used_table[i].flag=J; </p><p><b> } </b></p><p> return; </p><p> }/*主存分配函數(shù)結(jié)束*/ </p><p> void reclaim(char J) /*回收作業(yè)名為J的作業(yè)所占主存空間
117、*/ </p><p><b> { </b></p><p> int i,k,j,s,t; </p><p> float S,L; </p><p> /*尋找已分配表中對(duì)應(yīng)登記項(xiàng)*/ </p><p><b> s=0; </b></
118、p><p> while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n) </p><p><b> s++; </b></p><p> if(s>=n)/*在已分配表中找不到名字為J的作業(yè)*/ </p><p><b
119、> { </b></p><p> printf("找不到該作業(yè)\n"); </p><p><b> return; </b></p><p><b> } </b></p><p> /*修改已分配表*/ </p>&
120、lt;p> used_table[s].flag=0; /*取得歸還分區(qū)的起始地址S和長(zhǎng)度L*/ </p><p> S=used_table[s].address; </p><p> L=used_table[s].length; </p><p> j=-1;k=-1;i=0; </p><p> /*尋
121、找回收分區(qū)的空閑上下鄰,上鄰表目k,下鄰表目*/ </p><p> while(i<m&&(j==-1||k==-1)) </p><p><b> { </b></p><p> if(free_table[i].flag==1) </p><p><b> {
122、</b></p><p> if(free_table[i].address+free_table[i].length==S)k=i;/*找到上鄰*/ </p><p> if(free_table[i].address==S+L)j=i;/*找到下鄰*/ </p><p><b> } </b></p>
123、<p><b> i++; </b></p><p><b> } </b></p><p> if(k!=-1) </p><p> if(j!=-1) </p><p> /* 上鄰空閑區(qū),下鄰空閑區(qū),三項(xiàng)合并*/ </p><p>&
124、lt;b> { </b></p><p> free_table[k].length=free_table[j].length+free_table[k].length+L; </p><p> free_table[j].flag=0; </p><p><b> } </b></p>&l
125、t;p><b> else </b></p><p> /*上鄰空閑區(qū),下鄰非空閑區(qū),與上鄰合并*/ </p><p> free_table[k].length=free_table[k].length+L; </p><p><b> else </b></p><p>
126、; if(j!=-1) </p><p> /*上鄰非空閑區(qū),下鄰為空閑區(qū),與下鄰合并*/ </p><p><b> { </b></p><p> free_table[j].address=S; </p><p> free_table[j].length=free_table[j].len
127、gth+L; </p><p><b> } </b></p><p><b> else </b></p><p> /*上下鄰均為非空閑區(qū),回收區(qū)域直接填入*/ </p><p><b> { </b></p><p> /
128、*在空閑區(qū)表中尋找空欄目*/ </p><p><b> t=0; </b></p><p> while(free_table[t].flag==1&&t<m) </p><p><b> t++; </b></p><p> if(t>=m)/*空
129、閑區(qū)表滿(mǎn),回收空間失敗,將已分配表復(fù)原*/ </p><p><b> { </b></p><p> printf("主存空閑表沒(méi)有空間,回收空間失敗\n"); </p><p> used_table[s].flag=J; </p><p> return; </p&g
130、t;<p><b> } </b></p><p> free_table[t].address=S; </p><p> free_table[t].length=L; </p><p> free_table[t].flag=1; </p><p><b> } <
131、;/b></p><p> return; </p><p> }/*主存回收函數(shù)結(jié)束*/ </p><p> int main( ) </p><p><b> { </b></p><p> int i,a; </p><p> floa
132、t xk; </p><p> char J; </p><p> /*空閑分區(qū)表初始化:*/ </p><p> free_table[0].address=10240; /*起始地址假定為10240*/ </p><p> free_table[0].length=10240; /*長(zhǎng)度假定為10240,即10k*/
133、 </p><p> free_table[0].flag=1; /*初始空閑區(qū)為一個(gè)整體空閑區(qū)*/ </p><p> for(i=1;i<m;i++) </p><p> free_table[i].flag=0; /*其余空閑分區(qū)表項(xiàng)未被使用*/ /*已分配表初始化:*/ </p><p> for(i=0;
134、i<n;i++) </p><p> used_table[i].flag=0; /*初始時(shí)均未分配*/ </p><p> while(1) </p><p><b> { </b></p><p> printf("選擇功能項(xiàng):\n0-退出\n1-分配主存\n2-回收主存\n3-
135、顯示主存)\n"); </p><p> printf("選擇功項(xiàng)(0-3):\n"); </p><p> scanf("%d",&a); </p><p> switch(a) </p><p><b> { </b></p>
136、;<p> case 0: exit(0); /*a=0程序結(jié)束*/ </p><p> case 1: /*a=1分配主存空間*/ </p><p> printf("輸入作業(yè)名J和作業(yè)所需長(zhǎng)度xk: "); </p><p> scanf("%*c%c%f",&J,&
137、xk); </p><p> allocate(J,xk); /*分配主存空間*/ </p><p><b> break; </b></p><p> case 2: /*a=2回收主存空間*/ </p><p> printf("輸入要回收分區(qū)的作業(yè)名"); <
138、;/p><p> scanf("%*c%c",&J); </p><p> reclaim(J); /*回收主存空間*/ </p><p><b> break; </b></p><p> case 3: /*a=3顯示主存情況*/ </p><
139、;p> /*輸出空閑區(qū)表和已分配表的內(nèi)容*/ </p><p> printf("輸出空閑區(qū)表:\n起始地址分區(qū)長(zhǎng)度標(biāo)志\n"); </p><p> for(i=0;i<m;i++) </p><p> printf("%6.0f%9.0f%6d\n",free_table[i].address
140、,free_table[i].length, </p><p> free_table[i].flag); </p><p> printf(" 按任意鍵,輸出已分配區(qū)表\n"); </p><p> getch(); </p><p> printf(" 輸出已分配區(qū)表:\n起始地址 分區(qū)長(zhǎng)
141、度標(biāo)志\n"); </p><p> for(i=0;i<n;i++) </p><p> if(used_table[i].flag!=0) </p><p> printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, </p&
142、gt;<p> used_table[i].flag); </p><p><b> else </b></p><p> printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, </p><p> used_ta
143、ble[i].flag); </p><p><b> break; </b></p><p> default:printf("沒(méi)有該選項(xiàng)\n"); </p><p> }/*case*/ </p><p> }/*while*/ </p><p>
144、return 1; </p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果</b></p><p><b> 分配主存</b></p><p><b> 顯示主存</b></p><p><b&g
145、t; 心得與體會(huì)</b></p><p> 本次實(shí)驗(yàn)做的是基本存儲(chǔ)器管理,在動(dòng)態(tài)分區(qū)管理下,采用最先適應(yīng)算法,通過(guò)分配主存,顯示主存以及回收主存的功能,在其我學(xué)到了對(duì)于存儲(chǔ)器的管理是怎么一回事了,以及存儲(chǔ)器對(duì)于主存的影響有多大。</p><p> 任務(wù)四、請(qǐng)求分頁(yè)存儲(chǔ)管理(虛擬存儲(chǔ))</p><p><b> 一、實(shí)驗(yàn)?zāi)康?lt;/b&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)論文
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 淺談線(xiàn)程課程設(shè)計(jì)論文(操作系統(tǒng))
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)題目
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì) (4)
- 操作系統(tǒng)課程設(shè)計(jì)1
- 課程設(shè)計(jì)報(bào)告--操作系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)原理課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論