操作系統(tǒng)課程設計——操作系統(tǒng)課程設計模擬操作系統(tǒng)_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  學年論文(課程設計)</p><p>  題目: 操作系統(tǒng)課程設計模擬操作系統(tǒng)</p><p>  2012年 06月 05日</p><p><b>  一:課程設計題目</b></p><p>  實現(xiàn)一個模擬操作系統(tǒng)。</p><p><b>  二:課程

2、設計目的</b></p><p>  通過模擬操作系統(tǒng)的實現(xiàn),加深對操作系統(tǒng)工作原理的理解,進一步了解操作系統(tǒng)的實現(xiàn)方法,并可練習合作完成系統(tǒng)的團隊精神和提高程序設計能力。</p><p><b>  三:小組人數(shù)</b></p><p>  小組內(nèi)有四個人共同完成實驗。</p><p>  四:編程語言和系

3、統(tǒng)環(huán)境</p><p>  采用的是C++語言,在windows系統(tǒng)環(huán)境下的Microsoft Visual Studio軟件下設計的程序語言。</p><p><b>  五:課程設計內(nèi)容</b></p><p>  模擬采用多道程序設計方法的單用戶操作系統(tǒng),愛操作系統(tǒng)包括進程管理、存儲管理、設備管理、文件管理和用戶接口4部分。進程調(diào)度采用時

4、間片輪轉(zhuǎn)調(diào)度算法,存儲管理采用可變分區(qū)存儲管理方式,文件系統(tǒng)采用FAT方法。我所設計的部分為程序管理部分。</p><p>  七:課程設計具體內(nèi)容</p><p><b>  進程調(diào)度:</b></p><p><b>  1、任務分析:</b></p><p>  時間片輪轉(zhuǎn)的主要思想就是按順序

5、為每一個進程一次只分配一個時間片的時間。算法要完成的功能就是將各個進程按照時間片輪轉(zhuǎn)運行的動態(tài)過程顯示出來。時間片輪轉(zhuǎn)算法的主要實現(xiàn)過程是首先為每一個進程創(chuàng)建一個進程控制塊,定義數(shù)據(jù)結(jié)構(gòu),說明進程控制塊所包含的內(nèi)容,有進程名、進程所需運行時間、已運行時間和進程的狀態(tài)以及指針的信息。實現(xiàn)的過程即運用指針指向某一個進程,判斷當前的進程是否是就緒狀態(tài)“r”,如果是,則為該進程分配一個時間片,同時,已運行時間加一且要求運行的時間減一,如此循環(huán)執(zhí)

6、行,當某一個進程的所需要運行的時間減少至0時,則將該進程的狀態(tài)設置為“e”。然后,將指針指向下一個未運行完成的進程,重復判斷,直至所有的進程都運行結(jié)束。</p><p>  進程調(diào)度算法采用的是時間片輪轉(zhuǎn)法。</p><p>  時間片輪轉(zhuǎn)法就是按一定時間片(記為q)輪番運行各個進程。如果q是一個定值,則輪轉(zhuǎn)法是一種對各進程機會均等的調(diào)度方法。</p><p>  

7、輪轉(zhuǎn)法本質(zhì)上是剝奪的,因為一輪內(nèi),每個進程不能獲得比一個時間片q更長的運行時間。正是由于這一特點,輪轉(zhuǎn)法特別適用于分時操作系統(tǒng)。</p><p>  輪轉(zhuǎn)法的關鍵問題是如何確定q的大小。如果時間片太大以致每個進程的CPU周期都能在一個時間片內(nèi)完成,則輪轉(zhuǎn)法實際上脫化為FCFS。如果q太小以致CPU切換過于頻繁,則會增加CPU的額外開銷,降低了CPU的有效利用率。這是因為,每次CPU切換涉及到保存原運行進程的現(xiàn)場和

8、恢復新運行進程的現(xiàn)場,這些操作一般需要10ms~100ms的時間。例如,設有一個CPU周期為10單位的進程,在q取12,6,1時的調(diào)度次數(shù)分別為0,1,9。令時間單位為1ms(1ms=1000ms),1次調(diào)度的開銷為100ms,則在q=1時CPU的額外開銷和有效開銷之比為1:10,這是不容忽視的。</p><p>  每個進程的狀態(tài)可以是就緒(Wait)、運行(Run)或完成(Finish)三種狀態(tài)之一。就緒進程

9、獲得CPU后都只能運行一個時間片,用已占用CPU時間加1來表示。</p><p>  如果運行一個時間片后,進程的已占用CPU時間已達到所需的運行時間,則撤銷該進程;如果運行一個時間片后進程的已占用CPU時間還未達到所需要的運行時間,也就是進程還需要繼續(xù)運行,此時應將進程的優(yōu)先數(shù)減1(即降低一級),然后把它插入就緒隊列等待CPU。每進行一次調(diào)度程序都打印一次運行進程、就緒隊列以及各個進程的PCB,以便進行檢查。重

10、復以上過程,直到所有進程都完成為止。</p><p><b>  2、概要設計:</b></p><p>  (1)所用數(shù)據(jù)結(jié)構(gòu)及符號說明</p><p>  typedef struct PCB{</p><p>  char name[10]; //進程名</p><p>  struc

11、t PCB *next; //循環(huán)鏈指針</p><p>  int need_time; //要求運行時間</p><p>  int worked_time; //已運行時間,初始為0</p><p>  char condition; //進程狀態(tài),只有“就緒”和“結(jié)束”兩種狀態(tài)</p><p>  int flag;

12、 //進程結(jié)束標志,用于輸出</p><p><b>  }PCB;</b></p><p>  PCB *front,*rear; //循環(huán)鏈隊列的頭指針和尾指針 </p><p>  int N; //N為進程數(shù)</p><p>  (2)主程序的流程圖:</p><p> 

13、?。?)程序說明:處理器調(diào)度總是選擇指針指示的進程運行。由于本實驗是模擬處理器調(diào)度的功能,所以,對被選中的進程并不實際的啟動運行,而是執(zhí)行:已運行時間+1來模擬進程的一次運行,表示進程已經(jīng)運行過一個單位的時間。</p><p><b>  3、詳細設計</b></p><p>  (1)首先每一個進程用一個進程控制塊PCB來代表。進程控制塊的格式為:</p>

14、;<p>  其中,進程名——作為進程的標識,如Q1、Q2等。</p><p>  指針——進程按順序排成循環(huán)鏈隊列,用指針指出下一個進程的進程控制塊的首地址,最后一個進程的指針指出第一個進程的進程控制塊首地址。</p><p>  要求運行時間——假設進程需要運行的單位時間數(shù)。</p><p>  已運行時間——假設進程已經(jīng)運行的單位時間數(shù),初始值為

15、“0”。</p><p>  狀態(tài)——有兩種狀態(tài),“就緒”和“結(jié)束”,初始狀態(tài)都為“就緒”,用“R”表示。當一個進程運行結(jié)束后,它的狀態(tài)為“結(jié)束”,用“E”表示。</p><p> ?。?)每次運行所設計的處理器調(diào)度程序前,為每個進程任意確定它的“要求運行時間”。</p><p>  把五個進程按順序排成循環(huán)鏈隊列,用指針指出隊列連接情況。用指針表示輪到運行的進程,

16、如下圖描述所示: </p><p> ?。?)程序詳細設計步驟:</p><p>  a.首先建立PCB的數(shù)據(jù)結(jié)構(gòu),為了便于正確輸出,加上了進程結(jié)束標志flag。輸入進程信息(包括進程名和要求運行的時間),并為每個進程創(chuàng)建一個PCB并初始化形成一個循環(huán)鏈隊列,用函數(shù)creatPCB()來實現(xiàn)。</p><p>  b.建立函數(shù)judge()用來判斷進程全部運行結(jié)束標

17、志,即當所有進程的狀態(tài)變?yōu)椤痚’(即完成狀態(tài))后,循環(huán)結(jié)束,表示所有進程都已運行成功。</p><p>  c.建立時間片輪轉(zhuǎn)算法creatProcess()對進程進行輪轉(zhuǎn)運行,首先指針s指向第一個進程PCB,即s=front,判斷該進程的狀態(tài)是否為’r’(就緒狀態(tài)),即if(s->condition == 'r'),若是則表示此進程尚未執(zhí)行結(jié)束,則執(zhí)行s->worked_time++

18、且s->need_time--,if(s->need_time==0),則表示此進程已運行結(jié)束,將其狀態(tài)置為結(jié)束,即s->condition='e',并根據(jù)狀態(tài)位輸出完成信息,且以后不會再運行此進程。將指針指向下個進程,s=s->next,并判斷所有進程是否已全部運行結(jié)束,沒有則重復上面算法。當所有進程的狀態(tài)位都變成’e’表示所有進程運行完成,則循環(huán)結(jié)束。</p><p>

19、  d.建立主函數(shù)main(),輸入進程數(shù)N,調(diào)用初始化循環(huán)鏈隊列函數(shù)creatPCB()和時間片輪轉(zhuǎn)算法creatProcess(N),每次選中進程的進程名以及運行一次后進程隊列的變化,實現(xiàn)處理器的調(diào)度。</p><p><b>  4、調(diào)試分析:</b></p><p>  a.調(diào)試過程中遇到的問題及解決方案</p><p>  開始運行到

20、Q5運行完成后顯示錯誤,如下圖所示:</p><p>  原因:經(jīng)檢查程序發(fā)現(xiàn)語句if(s->condition=='e' ){printf("進程%s已經(jīng)運行完成!\n\n",s->name);}有錯誤,因為當某個進程運行完成后,其狀態(tài)標志已修改為’e’,所以再次循環(huán)運行未完成的進程時,當運行到此句時仍會將前面已完成的進程重新輸出一遍完成信息,導致輸出錯誤。<

21、;/p><p>  解決方案:為每個進程加上一個結(jié)束標志flag,并賦初值為0,當進程運行完成后,將flag改為1,再將后面輸出改為if(s->condition=='e' || s->flag==0 ){printf("進程%s已經(jīng)運行完成!\n\n",s->name);s->flag==0;},這樣在前面進程運行完成輸出后,后面再循環(huán)時就不會重新輸出一遍

22、了。</p><p>  b.改進設想:本實驗較簡單,但還不夠完善,如未實現(xiàn)插入進程功能,即進程在運行過程中可以插入其他的進程再運行。還有未進行進程優(yōu)先級判別,本實驗默認進程的優(yōu)先級按輸入的先后順序從大到小排列的,還有其他功能等,希望在以后的實驗中逐步完善。</p><p><b>  5、測試結(jié)果:</b></p><p>  a.首先輸出五

23、個進程的初始狀態(tài)</p><p>  b.開始從進程Q1開始按時間片輪轉(zhuǎn)運行進程,Q4先運行完成</p><p>  c.接著Q1運行完成</p><p>  d.接著Q5運行完成</p><p><b>  e.再Q(mào)3運行完成</b></p><p>  f.最后Q2運行完成</p>

24、<p>  時間片輪轉(zhuǎn)法調(diào)度進程代碼:</p><p>  #include"stdio.h"</p><p>  #include"conio.h"</p><p>  #include"malloc.h"</p><p>  #include"string

25、.h"</p><p>  #define NULL 0</p><p>  typedef struct PCB{</p><p>  char name[10]; //進程名</p><p>  struct PCB *next; //鏈指針</p><p>  int need_time;

26、//要求運行時間</p><p>  int worked_time; //已運行時間</p><p>  char condition; //進程狀態(tài),只有"就緒"和"結(jié)束"兩種狀態(tài)</p><p>  int flag; //進程結(jié)束標志</p><p><b>  

27、}PCB;</b></p><p>  PCB *front,*rear; </p><p>  int N; //N為進程數(shù)</p><p>  void creatPCB(){ //為每個進程創(chuàng)建一個PCB并初始化形成一個循環(huán)鏈隊列</p><p>  PCB *p,*l;</p><p>

28、;  l = (PCB *)malloc(sizeof(PCB));</p><p>  printf("請輸入各進程名和要求運行時間\n");</p><p>  scanf("%s%d",l->name,&l->need_time);</p><p>  l->condition = 'r

29、'; //進程初始狀態(tài)為就緒</p><p>  l->worked_time = 0;</p><p>  l->next=NULL;</p><p>  l->flag=0;</p><p><b>  front=l;</b></p><p>  for(int i

30、 = 1;i < N ;i ++){</p><p>  p = (PCB *)malloc(sizeof(PCB));</p><p>  scanf("%s%d",p->name,&p->need_time);</p><p>  p->condition = 'r'; </p>

31、<p>  p->worked_time = 0;</p><p>  p->flag=0;</p><p>  l->next = p;</p><p>  l=l->next;</p><p><b>  }</b></p><p>  rear=l;rear

32、->next=front;</p><p><b>  }</b></p><p>  void output(){ //進程輸出函數(shù)</p><p>  printf("進程名 已運行時間 需要時間 狀態(tài)\n");</p><p>  for(int j=1;j<=N;j++

33、){ </p><p>  printf(" %-4s\t %-4d\t %-4d\t%-c\n",front->name, front->worked_time, front->need_time, front->condition);</p><p>  front=front->next;</p>

34、<p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p>  int judge(PCB *p){ //判斷所有進程運行結(jié)束</p><p>  int flag = 1;</p&

35、gt;<p>  for(int i=0;i<N;i++){</p><p>  if(p->condition != 'e'){</p><p><b>  flag = 0;</b></p><p><b>  break;}</b></p><p> 

36、 p=p->next;</p><p><b>  }</b></p><p>  return flag;</p><p><b>  }</b></p><p>  void creatProcess(int n){ //時間片輪轉(zhuǎn)算法</p><p>  PCB

37、 *s,*p;</p><p>  int i,j,flag1=0;</p><p>  s = (PCB *)malloc(sizeof(PCB));</p><p><b>  s=front;</b></p><p>  printf("\n--------------------------------

38、------------\n");</p><p><b>  output();</b></p><p>  printf("請按任意鍵繼續(xù)\n\n");</p><p>  getch(); //按任意鍵繼續(xù)</p><p><b>  s=front;</b>

39、</p><p>  while(flag1 != 1){</p><p>  if(s->condition == 'r'){</p><p>  s->worked_time++;</p><p>  s->need_time--;</p><p>  if(s->need_

40、time==0)</p><p>  s->condition='e';</p><p><b>  output();</b></p><p>  printf("請按任意鍵繼續(xù)\n\n");</p><p><b>  getch();</b></

41、p><p><b>  }</b></p><p>  if(s->condition=='e' && s->flag==0){</p><p>  printf("進程%s已經(jīng)運行完成!\n\n",s->name);</p><p>  s->fl

42、ag=1;</p><p><b>  }</b></p><p>  s=s->next;</p><p>  flag1=judge(s);</p><p><b>  }</b></p><p>  printf("-------------------

43、-------------------------\n");</p><p><b>  }</b></p><p>  void main(){</p><p>  printf("請輸入進程總數(shù)\n");</p><p>  scanf("%d",&N);&

44、lt;/p><p>  creatPCB();</p><p>  creatProcess(N);</p><p><b>  }</b></p><p><b>  創(chuàng)建進程和撤銷進程</b></p><p><b>  1、設計內(nèi)容</b></p

45、><p>  1、關于系統(tǒng)用fork()函數(shù)的實驗。 2、使用fork()函數(shù)創(chuàng)建進程,實現(xiàn)父進程創(chuàng)建子進程和實現(xiàn)父子進程同步。 3、使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個進程。當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符。如父進程顯示’a’,子進程分別顯示字符’b’和字符’c’。 4、修改程序,每一個進程循環(huán)顯示一句話,如子進程顯示’daughter’及’son’,父

46、進程顯示’parent’。 5、用C語言實現(xiàn)進程的創(chuàng)建、撤銷以及簡單的進程管理。</p><p><b>  2、函數(shù)關系調(diào)用</b></p><p><b>  1、fork( )</b></p><p><b>  創(chuàng)建一個新進程。</b></p><p><b&

47、gt;  系統(tǒng)調(diào)用格式:</b></p><p>  pid=fork( ) </p><p><b>  參數(shù)定義:</b></p><p>  int fork( ) </p><p>  fork( )返回值意義如下:</p><p>  0:在子進程中,pid 變量保存的 fo

48、rk( )返回值為 0,表示當前進程是子進程。</p><p>  >0:在父進程中,pid 變量保存的 fork( )返回值為子進程的 id 值(進程唯一標識符)。</p><p><b>  -1:創(chuàng)建失敗。</b></p><p>  如果 fork( )調(diào)用成功,它向父進程返回子進程的 PID,并向子進程返回 0,即 fork(

49、)被調(diào)用了一次,但返回了兩次。此時 OS 在內(nèi)存中建立一個新進程,所建的新進程是調(diào)用 fork( )父進程(parent process)的副本,稱為子進程(child process)。子進程繼承了父進程的許多特性,并具有與父進程完全相同的用戶級上下文。父進程與子進程并發(fā)執(zhí)行。</p><p>  核心為 fork( )完成以下操作:</p><p>  (1)為新進程分配一進程表項和進

50、程標識符</p><p>  進入 fork( )后,核心檢查系統(tǒng)是否有足夠的資源來建立一個新進程。若資源不足,則 fork( )系統(tǒng)調(diào)用失敗;否則,核心為新進程分配一進程表項和唯一的進程標識符。</p><p>  (2)檢查同時運行的進程數(shù)目超過預先規(guī)定的最大數(shù)目時,fork( )系統(tǒng)調(diào)用失敗。</p><p>  (3)拷貝進程表項中的數(shù)據(jù)</p>

51、<p>  將父進程的當前目錄和所有已打開的數(shù)據(jù)拷貝到子進程表項中,并置進程的狀態(tài)為“創(chuàng)建”狀態(tài)。</p><p> ?。?)子進程繼承父進程的所有文件對父進程當前目錄和所有已打開的文件表項中的引用計數(shù)加 1。</p><p> ?。?)為子進程創(chuàng)建進程上、下文進程創(chuàng)建結(jié)束,設子進程狀態(tài)為“內(nèi)存中就緒”并返回子進程的標識符。</p><p><b

52、>  (6)子進程執(zhí)行</b></p><p>  雖然父進程與子進程程序完全相同,但每個進程都有自己的程序計數(shù)器 PC(注子進程的 PC 開始位置),然后根據(jù) pid 變量保存的 fork( )返回值的不同,執(zhí)行了不同的分支語句。</p><p><b>  例:</b></p><p><b>  ….. <

53、;/b></p><p>  pid=fork( ); </p><p>  if (! pid)</p><p>  printf("I'm the child process!\n"); </p><p>  else if (pid>0)</p><p>  printf(

54、"I'm the parent process! \n"); </p><p><b>  else </b></p><p>  printf("Fork fail!\n") fork( )調(diào)用前</p><p>  fork( )調(diào)用后</p><p><b>

55、;  ….. </b></p><p>  pid=fork( ); </p><p>  if (! pid)</p><p>  printf("I'm the child process!\n"); </p><p>  else if (pid>0)</p><p>

56、;  printf("I'm the parent process!\n "); </p><p><b>  else </b></p><p>  printf("Fork fail!\n"); </p><p><b>  …… ….. </b></p>

57、<p>  pid=fork( ); </p><p>  if (! pid)</p><p>  printf("I'm the child process!\n"); </p><p>  else if (pid>0)</p><p>  printf("I'm the p

58、arent process!\n "); </p><p><b>  else </b></p><p>  printf("Fork fail!\n"); </p><p><b>  3、流程圖</b></p><p><b>  創(chuàng)建進程代碼:<

59、/b></p><p>  #include<iostream> </p><p>  #include<cstring> </p><p>  #include<algorithm> </p><p>  #include<windows.h> </p><p>

60、  using namespace std; </p><p>  const int maxpcb=1000; </p><p>  const int maxodr=1000; </p><p>  const int maxpid=1000; </p><p>  bool pid_vis[maxpid]; </p>&l

61、t;p>  int cur_pcb=0; </p><p>  int Time=0; </p><p>  struct pcb_task //進程控制塊結(jié)構(gòu)體 </p><p>  {int A; //累加器 </p><p>  int F; //狀態(tài)寄存器 </p><p>  int pc; //程序

62、寄數(shù)器 </p><p>  int pid; //進程號 </p><p>  int ppid; //父進程號 </p><p>  int priority; //優(yōu)先級數(shù) </p><p>  int runtime; //運行時間 </p><p>  int timep; //時間片 </p>

63、<p>  int odr[maxodr];//進程需要執(zhí)行的指令 </p><p>  char statu[10];//進程的狀態(tài) </p><p>  void init(); </p><p>  }pcb[maxpcb]; </p><p>  void pcb_task::init()//所有的屬性要進行一次初始化&l

64、t;/p><p><b>  {</b></p><p><b>  A=pc=0; </b></p><p>  priority=rand()%32;//優(yōu)先級為 0-31 </p><p>  do{pid=rand()%maxpid;}while(pid_vis[pid]); </p>

65、;<p>  pid_vis[pid]=true; //確保進程號是唯一的 </p><p>  memset(odr,-1,sizeof(odr));</p><p>  strcpy(statu,"就緒");//初始新建的進程狀態(tài)為“就緒” </p><p>  runtime=3+rand()%10; </p>

66、<p><b>  timep=0; </b></p><p>  } bool cmp(pcb_task a,pcb_task b){return a.pid<b.pid;}</p><p>  void bulid(int ); //case 1: 創(chuàng)建進程 </p><p>  void exec() ;//case 2:

67、 執(zhí)行并創(chuàng)建子進程 </p><p>  void Exit(int ) ;//case 3:進程終止(把要終止的進程從進程序列中去掉) </p><p>  void output() ;//case 4: 顯示進程序列</p><p>  void output()//顯示系統(tǒng)的所有進程</p><p><b>  { <

68、/b></p><p>  cout<<"系統(tǒng)當前的進程表"<<endl<<endl; </p><p><b>  int i; </b></p><p>  if(cur_pcb==0) </p><p><b>  { </b>&l

69、t;/p><p>  cout<<"系統(tǒng)當前沒有進程!"<<endl; return ;</p><p><b>  } </b></p><p>  printf("進程號 優(yōu)先級數(shù) 進程狀態(tài) 累加器 時間片 需運行時間\n"); </p><p>  for

70、 (i = 0; i < cur_pcb; i++)</p><p>  if (pid_vis[pcb[i].pid]) </p><p>  printf("%d %d %s %d %d %d\n", pcb[i].pid,pcb[i].priority,pcb[i].statu,pcb[i].A, pcb[i].timep,pcb[i].runtime);

71、</p><p>  printf("\n"); </p><p><b>  } </b></p><p>  void bulid(int ppid)//case 1: 創(chuàng)建進程 </p><p><b>  { </b></p><p>  pcb[

72、cur_pcb].init();</p><p>  pcb[cur_pcb].ppid=ppid;</p><p>  cur_pcb++; cout<<"進程創(chuàng)建成功!新進程號是:"<<pcb[cur_pcb-1].pid<<endl<<endl; </p><p>  output(); &l

73、t;/p><p><b>  } </b></p><p>  void Exit(int pid)//進程終止(把要終止的進程從進程序列中去掉) </p><p><b>  { </b></p><p><b>  int p; </b></p><p>

74、;  for(p=0;p<cur_pcb && pcb[p].pid!=pid;p++)</p><p>  if(p==cur_pcb) { printf("此進程號不存在!\n"); </p><p><b>  return ; </b></p><p><b>  } </b&

75、gt;</p><p>  pcb[p].pid=maxpid; </p><p>  sort(pcb,pcb+cur_pcb,cmp);//按進程號排序 </p><p>  cur_pcb--; </p><p>  pid_vis[pid]=0; </p><p>  printf("進程 %d 已被

76、終止\n",pid); </p><p>  printf("目前系統(tǒng)進程情況:\n"); </p><p>  output(); </p><p><b>  }</b></p><p><b>  4、運行結(jié)果</b></p><p>  

77、創(chuàng)建進程,隨機分配進程優(yōu)先級、運行時間:</p><p><b>  進程的阻塞和喚醒</b></p><p><b>  1、進程阻塞過程</b></p><p>  正在執(zhí)行的進程,當發(fā)現(xiàn)上述某事件時,由于無法繼續(xù)執(zhí)行,于是進程便通過調(diào)用阻塞原語block把自己阻塞??梢?,進程的阻塞是進程自身的一種主動行為。進入blo

78、ck過程后,由于此時該進程還處于執(zhí)行狀態(tài),所以應先立即停止執(zhí)行,把進程控制塊中的現(xiàn)行狀態(tài)由“執(zhí)行”改為阻塞,并將PCB插入阻塞隊列。如果系統(tǒng)中設置了因不同事件而阻塞的多個阻塞隊列,則應將本進程插入到具有相同事件的阻塞(等待)隊列。 最后,轉(zhuǎn)調(diào)度程序進行重新調(diào)度,將處理機分配給另一就緒進程,并進行切換,亦即,保留被阻塞進程的處理機狀態(tài)(在PCB中),再按新進程的PCB中的處理機狀態(tài)設置CPU的環(huán)境。 </p><p&g

79、t;<b>  2、進程喚醒過程</b></p><p>  當被阻塞進程所期待的事件出現(xiàn)時,如I/O完成或其所期待的數(shù)據(jù)已經(jīng)到達,則由有關進程(比如,用完并釋放了該I/O設備的進程)調(diào)用喚醒原語wakeup( ),將等待該事件的進程喚醒。喚醒原語執(zhí)行的過程是:首先把被阻塞的進程從等待該事件的阻塞隊列中移出,將其PCB中的現(xiàn)行狀態(tài)由阻塞改為就緒,然后再將該PCB插入到就緒隊列中。</p

80、><p><b>  阻塞進程的代碼:</b></p><p>  void block() </p><p><b>  { </b></p><p>  if(empty(s)) </p><p><b>  { </b></p><

81、p>  if(s->next==NULL) </p><p><b>  { </b></p><p>  sort(w,s); </p><p>  s=s->next; </p><p><b>  } </b></p><p><b>  e

82、lse </b></p><p><b>  { </b></p><p><b>  pcb1 p1; </b></p><p><b>  p1=s; </b></p><p>  s=s->next; </p><p>  p1-

83、>next=NULL; </p><p>  sort(w,p1); </p><p><b>  } </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { &

84、lt;/b></p><p>  cout<<"現(xiàn)在就緒隊列已經(jīng)為空,再沒有進程需要阻塞"<<endl; } </p><p><b>  } </b></p><p><b>  喚醒進程的代碼:</b></p><p>  void wake()

85、 </p><p><b>  { </b></p><p>  if(empty(w)) </p><p><b>  { </b></p><p><b>  pcb1 p1; </b></p><p><b>  p1=w; </b

86、></p><p>  w=w->next; </p><p>  p1->next=NULL; </p><p>  sort(s,p1); </p><p><b>  } </b></p><p><b>  else </b></p>

87、<p><b>  { </b></p><p>  cout<<"阻塞隊列已經(jīng)為空,沒有進程再需要喚醒"<<endl; } </p><p><b>  } </b></p><p><b>  實驗總結(jié)</b></p><p

88、>  本次實驗,我的任務是設計一個模擬單用戶操作系統(tǒng)的進程管理模塊,并且進程的調(diào)度是使用時間片輪轉(zhuǎn)法。該系統(tǒng)主要內(nèi)容是進程的相關控制,系統(tǒng)在運行過程中能顯示各進程的狀態(tài)及有關參數(shù)的變化情況,從而觀察諸進程的運行過程及系統(tǒng)的管理過程,我是用C++寫的,在我的電腦能夠運行通過,雖不能盡善盡美,但也基本能實現(xiàn)老師的要求。</p><p>  兩個星期程序設計課程,雖然時間有點短,但我也收獲不少,這次試驗,加深了我

溫馨提示

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

評論

0/150

提交評論