欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      進程調(diào)度實驗報告

      時間:2019-05-12 14:16:41下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關的《進程調(diào)度實驗報告》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《進程調(diào)度實驗報告》。

      第一篇:進程調(diào)度實驗報告

      天津大學仁愛學院

      實驗類型:實驗名稱:實驗地點:

      學生姓名:班 級:

      操作系統(tǒng) 實驗報告

      必 修 實驗日期:2014年4月18日進程調(diào)度 二實驗樓504 李帥帥 指導教師:張 磊 計科一班 計算機科學與技術系

      天津大學仁愛學院——計算機科學與技術系——李帥帥

      實驗報告內(nèi)容:

      1)實驗目的

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

      2)實驗器材和設備

      硬 件: 二實驗樓504計算機

      開發(fā)工具: Microsoft Visual C++ 6.0

      3)實驗任務

      本實驗模擬單處理器系統(tǒng)的進程調(diào)度,加深對進程的概念及進程調(diào)度算法的理解。用c語言編寫和調(diào)試一個進程調(diào)度的算法程序,有一些簡單的界面,能夠運行,仿真操作系統(tǒng)中進程調(diào)度的原理和過程。通過對調(diào)度算法的模擬,進一步理解進程的基本概念,加深對進程運行狀態(tài)和進程調(diào)度

      4)實驗原理

      無論是在批處理系統(tǒng)還是分時系統(tǒng)中,用戶進程數(shù)一般都多于處理機數(shù)、這將導致它們互相爭奪處理機。另外,系統(tǒng)進程也同樣需要使用處理機。這就要求進程調(diào)度程序按一定的策略,動態(tài)地把處理機分配給處于就緒隊列中的某一個進程,以使之執(zhí)行。

      基本狀態(tài):1.等待態(tài):等待某個事件的完成;

      2.就緒態(tài):等待系統(tǒng)分配處理器以便運行; 3.運行態(tài):占有處理器正在運行。

      運行態(tài)→等待態(tài) 往往是由于等待外設,等待主存等資源分配或等待人工干預而引起的。

      等待態(tài)→就緒態(tài) 則是等待的條件已滿足,只需分配到處理器后就能運行。運行態(tài)→就緒態(tài) 不是由于自身原因,而是由外界原因使運行狀態(tài)的進程讓出處理器,這時候就變成就緒態(tài)。例如時間片用完,或有更高優(yōu)先級的進程來搶占處理器等。

      就緒態(tài)→運行態(tài) 系統(tǒng)按某種策略選中就緒隊列中的一個進程占用處理器,此時就變成了運行態(tài)

      5)實驗過程描述

      a)打開Microsoft Visual C++ 6.0,創(chuàng)建工程。

      b)根據(jù)要求用 c語言代碼實現(xiàn)應用程序,并調(diào)試完成。c)運行程序,根據(jù)提示輸入相應的字符。

      d)輸入實驗測試內(nèi)容,并觀察執(zhí)行窗口顯示的過程。

      天津大學仁愛學院——計算機科學與技術系——李帥帥

      q=(struct pcb *)malloc(sizeof(pcb));

      cin>>q->name;

      cin>>q->needtime;

      q->cputime=0;

      q->priority=P_TIME-q->needtime;

      q->process=ready;

      q->next=NULL;

      if(i==0)

      {

      p=q;

      t->next=q;

      }

      else

      {

      q->next=t->next;

      t=q;

      q=p;

      }

      i++;} return p;}

      void display(pcb * p){ cout<<“name”<<“ ”<<“cputime”<<“needtime”<<“ ”<<“priority”<<“ ”

      <<“state”<

      cout<

      name;

      cout<<“ ”;

      cout<

      cputime;

      cout<<“ ”;

      cout<

      needtime;

      cout<<“ ”;

      cout<

      priority;

      cout<<“ ”;

      switch(p->process)

      {

      case ready:cout<<“ready”<

      case execute:cout<<“execute”<

      case block:cout<<“block”<

      case finish:cout<<“finish”<

      }

      天津大學仁愛學院——計算機科學與技術系——李帥帥

      void priority_cal(){ pcb * p;system(“cls”);p=get_process();int cpu=0;system(“cls”);while(!process_finish(p)){

      cpu++;

      cout<<“cuptime:”<

      cpuexe(p);

      display(p);

      Sleep(1000);} printf(“All processes have finished,press any key to exit”);getch();}

      void display_menu(){ cout<<“nCHOOSE THE ALGORITHM:”<

      pcb *get_process_round(){ pcb *q;pcb *t;pcb *p;int i=0;t=(struct pcb *)malloc(sizeof(pcb));p=(struct pcb *)malloc(sizeof(pcb));cout<<“input name and time”<q=(struct pcb *)malloc(sizeof(pcb));

      cin>>q->name;

      cin>>q->needtime;

      q->cputime=0;

      天津大學仁愛學院——計算機科學與技術系——李帥帥

      {

      } } return t;}

      void set_state(pcb *p){ while(p){

      if(p->needtime==0)

      {

      p->process=finish;//如果所需執(zhí)行時間為0,則設置運行狀態(tài)為結束

      }

      if(p->process==execute)

      {

      p->process=ready;//如果未執(zhí)行狀態(tài)則設置為就緒

      }

      p->next;} }//設置隊列中進程執(zhí)行狀態(tài) void display_round(pcb *p){ cout<<“NAME”<<“ ”<<“CPUTIME”<<“ ”<<“NEEDTIME”<<“ ”<<“COUNT”<<“ ”<<“ROUND”

      <<“ ”<<“STATE”<

      cout<

      name;

      cout<<“ ”;

      cout<

      cputime;

      cout<<“ ”;

      cout<

      needtime;

      cout<<“ ”;

      cout<

      count;

      cout<<“ ”;

      cout<

      round;

      cout<<“ ”;

      switch(p->process)

      {

      case ready:cout<<“ready”<

      case execute:cout<<“execute”<

      case finish:cout<<“finish”<

      天津大學仁愛學院——計算機科學與技術系——李帥帥

      7)實驗結果截圖

      第二篇:操作系統(tǒng)進程調(diào)度算法模擬實驗報告

      進程調(diào)度算法模擬

      專業(yè):XXXXX 學號:XXXXX 姓名:XXX 實驗日期:20XX年XX月XX日

      一、實驗目的

      通過對進程調(diào)度算法的模擬加深對進程概念和進程調(diào)度算法的理解。

      二、實驗要求

      編寫程序實現(xiàn)對5個進程的調(diào)度模擬,要求至少采用兩種不同的調(diào)度算法分別進行模擬調(diào)度。

      三、實驗方法內(nèi)容

      1.算法設計思路

      將每個進程抽象成一個控制塊PCB,PCB用一個結構體描述。

      構建一個進程調(diào)度類。將進程調(diào)度的各種算法分裝在一個類中。類中存在三個容器,一個保存正在或未進入就緒隊列的進程,一個保存就緒的進程,另一個保存已完成的進程。還有一個PCB實例。主要保存正在運行的進程。類中其他方法都是圍繞這三個容器可以這個運行中的PCB展開。

      主要用到的技術是STL中的vector以維護和保存進程容器、就緒容器、完成容器。

      當程序啟動時,用戶可以選擇不同的調(diào)度算法。然后用戶從控制臺輸入各個進程的信息,這些信息保存到進程容器中。進程信息輸入完畢后,就開始了進程調(diào)度,每調(diào)度一次判斷就緒隊列是否為空,若為空則系統(tǒng)時間加一個時間片。判斷進程容器中是否有新的進程可以加入就緒隊列。2.算法流程圖 主程序的框架:

      開始void FCFS();//先來先服務void SJF();//最短進程優(yōu)先調(diào)度void RR();//簡單時間片輪轉void PD();//最高優(yōu)先數(shù)優(yōu)先void PCBInput();//輸入進程信息選擇調(diào)度算法輸入進程信息將輸入容器中以滿足進入條件的進程調(diào)入就緒隊列void ProcessQueueProcess();//查看當前時間下,有無進程加入。若有則把該進程調(diào)入就緒隊列按照選擇的算法開始選擇就緒隊列的進程開始執(zhí)行void ProcessSelect();//若當前就緒隊列不為空則根據(jù)選擇的調(diào)度算法開始調(diào)度,否則,系統(tǒng)時間加一個時間片.以等待新的進程到判斷就緒容器和輸入容器是否為空!processScheduler.m_WaitQueue.empty()||!processScheduler.m_ProcessQueue.empt()Y打印各進程信息進行統(tǒng)計計算周轉時間等結束void PCBDisplay();//打印當前狀況下。就緒隊列、完成隊列、運行中的進程信息void SchedulerStatistics();//調(diào)度統(tǒng)計,計算周轉時間等進程調(diào)度過程:

      開始為空判斷就緒隊列是否為空if(m_WaitQueue.empty())非空讓系統(tǒng)等待一個時間片TimePast()根據(jù)設定的調(diào)度算法從就緒隊列中調(diào)入一個進程并執(zhí)行(此時進程從就緒隊列中刪除,賦值到表示運行中的成員變量中)void FCFS();//先來先服務void SJF();//最短進程優(yōu)先調(diào)度void RR();//簡單時間片輪轉void PD();//最高優(yōu)先數(shù)優(yōu)先進程運行一個時間片N是否達到該進程停止運行的條件Y選入的進程狀態(tài)是否為“完成”如進程已完成,或者分得的時間片個數(shù)已到ProcessRun()Yvector

      m_WaitQueue;//進程就緒隊列進程未完成,將進程優(yōu)先數(shù)減一,并放回到就緒隊列中設置進程完成時間,將該進程放入完成隊列vector

      m_FinishQueue;//完成隊列結束

      3.算法中用到的數(shù)據(jù)結構

      struct fcfs{

      //先來先服務算法從這里開始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個結構體,里面包含的有一個進程相關的信息

      4.主要的常量變量

      vector

      m_ProcessQueue;//進程輸入隊列

      vector

      m_WaitQueue;//進程就緒隊列 vector

      m_FinishQueue;//完成隊列 vector

      ::iterator m_iter;//迭代器 PCB m_runProcess;//運行中的進程

      int m_ProcessCount;//進程數(shù) float m_RunTime;//運行時間

      int m_tagIsRun;//是否在運行標志。表示正在運行,表示沒有 float m_TimeSlice;//時間片大小

      int m_TimeSliceCount;//指時間片輪轉中一次分到的時間片個數(shù) char m_SchedulerAlgorithm;//調(diào)度算法

      5.主要模塊

      void PCBInput();//輸入進程信息

      void PCBSort();//對進程控制塊按照優(yōu)先級排序(采用冒泡排序)void ProcessSelect();//若當前就緒隊列不為空則根據(jù)選擇的調(diào)度算法開始調(diào)度。否則,系統(tǒng)時間void PCBDisplay();//打印當前狀況下。就緒隊列、完成隊列、運行中的進程信息

      void ProcessRun();//進程運行一次。運行時間加個時間片。并判斷進程是否達到完成條件。若是則void ProcessQueueProcess();//查看當前時間下,有無進程加入。若有則把該進程調(diào)入就緒隊列 void ProcessDispatch();//進程分派,進程執(zhí)行完成后決定進程該進入哪個隊列(就緒、完成)void TimePast(){ m_RunTime +=m_TimeSlice;ProcessQueueProcess();}//當前系統(tǒng)時間加個時間void SchedulerStatistics();//調(diào)度統(tǒng)計,計算周轉時間等 void FCFS();//先來先服務 void SJF();//最短進程優(yōu)先調(diào)度 void RR();//簡單時間片輪轉 void PD();//最高優(yōu)先數(shù)優(yōu)先 加.以等待新的進程到來

      ProcessStatus='f'.否則為'w';片,并檢查是否有新的進程加入

      四、實驗代碼

      #include #include #include

      using namespace std;

      struct fcfs{

      //先來先服務算法從這里開始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個結構體,里面包含的有一個進程相關的信息

      fcfs a[100];

      void input(fcfs *p,int N)

      {

      int i;

      cout<

      printf(“

      請您輸入進程的名字

      到達時間

      服務時間:(例如: a 0 100)nn”);

      for(i=0;i<=N-1;i++)

      {

      printf(“

      請您輸入進程%d的信息:t”,i+1);

      scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);

      }

      }

      void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N)

      { int k;

      printf(“nn調(diào)用先來先服務算法以后進程運行的順序是: ”);

      printf(“%s”,p[0].name);

      for(k=1;k

      {

      printf(“-->%s”,p[k].name);

      }

      cout<

      printf(“n

      具體進程調(diào)度信息:n”);

      printf(“t進程名

      到達時間

      服務時間

      開始時間

      結束時間

      周轉時間

      帶權周轉時間n”);

      for(k=0;k<=N-1;k++)

      {

      printf(“t%st%-.2ft %-.2ft

      %-.2ft

      %-.2ft %-.2ft %-.2fn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);

      }

      getchar();

      //此處必須要有這個函數(shù),否則就看不到顯示器上面的輸出,可以看到的結果只是一閃而過的一個框剪

      }

      void sort(fcfs *p,int N)//排序

      {

      for(int i=0;i<=N-1;i++)

      for(int j=0;j<=i;j++)

      if(p[i].arrivetime

      {

      fcfs temp;

      temp=p[i];

      p[i]=p[j];

      p[j]=temp;

      }

      }

      void deal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N)

      //運行階段

      { int k;

      for(k=0;k<=N-1;k++)

      {

      if(k==0)

      {

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+p[k].servicetime;}

      else

      {

      p[k].starttime=p[k-1].finishtime;

      p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}

      }

      for(k=0;k<=N-1;k++)

      {

      p[k].zztime=p[k].finishtime-p[k].arrivetime;

      p[k].dqzztime=p[k].zztime/p[k].servicetime;

      }

      }

      void FCFS(fcfs *p,int N)

      {

      float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;

      sort(p,N);

      deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      getchar();

      } //先來先服務算法到此結束 struct sjf{//最短進程優(yōu)先調(diào)度算法從這里開始

      char name[10];float arrivetime;//到達時間

      float servicetime;//運行時間

      float starttime;

      //開始時間

      float finishtime;

      //完成時間

      };sjf a1[100];

      void input(sjf *p,int N1)//進程信息輸入 {

      int i;cout<

      printf(“

      請您輸入進程的名字

      到達時間

      服務時間:(例如: a 0 100)n”);

      for(i=0;i<=N1-1;i++){

      printf(“

      請您輸入進程%d的信息:t”,i+1);

      scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);} }

      void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,int N1)//最終結果輸出

      {

      int k;

      printf(“nt調(diào)用最短進程優(yōu)先調(diào)度算法以后進程的調(diào)度順序為:”);

      printf(“%s”,p[0].name);

      for(k=1;k

      {printf(“-->%s”,p[k].name);}

      cout<

      printf(“n給個進程具體調(diào)度信息如下:n”);

      printf(“nt進程名t到達時間t運行時間t開始時間t完成時間n”);

      for(k=0;k<=N1-1;k++)

      {

      printf(“ t%st %-.2ftt %-.2ftt %-.2ftt %-.2ftn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime);

      }

      getchar();

      } void sort(sjf *p,int N1)//排序 {

      for(int i=0;i<=N1-1;i++)

      for(int j=0;j<=i;j++)

      if(p[i].arrivetime

      {

      sjf temp;

      temp=p[i];

      p[i]=p[j];

      p[j]=temp;

      } } void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,int N1)//運行階段

      { int k;

      for(k=0;k<=N1-1;k++)

      {

      if(k==0)

      {

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+float(p[k].servicetime)/60;}

      else

      {

      p[k].starttime=p[k-1].finishtime;

      p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime)/60;}

      }

      }

      void sjff(sjf *p,int N1){

      float arrivetime=0,servicetime=0,starttime=0,finishtime=0;

      sort(p,N1);

      for(int m=0;m

      {if(m==0)

      p[m].finishtime=p[m].arrivetime+float(p[m].servicetime)/60;

      else

      p[m].finishtime=p[m-1].finishtime+float(p[m].servicetime)/60;

      int i=0;

      for(int n=m+1;n<=N1-1;n++)

      {

      if(p[n].arrivetime<=p[m].finishtime)

      i++;

      }

      float min=p[m+1].servicetime;

      int next=m+1;

      for(int k=m+1;k

      {

      if(p[k+1].servicetime

      {min=p[k+1].servicetime;

      next=k+1;}

      }

      sjf temp;

      temp=p[m+1];

      p[m+1]=p[next];

      p[next]=temp;

      }

      deal(p,arrivetime,servicetime,starttime,finishtime,N1);

      Print(p,arrivetime,servicetime,starttime,finishtime,N1);

      getchar();}//最短進程優(yōu)先調(diào)度算法到這里結束

      char menu()//用來輸出相關信息的函數(shù)

      {

      char cse1;

      while(1)

      {

      system(“cls”);

      fflush(stdin);

      cout<

      cout<

      cout<<“t”<<“|| <<<<<<<<<<<<歡<<<<<<<<<<< >>>>>>>>>>>>迎>>>>>>>>>>> ||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“t 進程調(diào)度算法模擬”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“tt 1.先來先服務調(diào)度算法 ”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“tt 2.最短進程優(yōu)先調(diào)度算法”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“|| <<<<<<<<<<<<<<<<<<<<<<<<<您>>>>>>>>>>>>>>>>>>>>>>>>> ||”<

      cout<

      cout<

      cout<<“tt

      請輸入您的選擇(1/2):”;

      cse1=getchar();

      if(cse1<'1'||cse1>'2')

      cout<<“你的輸入有錯!”<

      else

      break;

      }

      return cse1;} int main(int argc, char *argv[]){

      while(1)

      {

      switch(menu())

      {

      case '1':

      int N;

      cout<

      cout<

      printf(“tt<<---!!@@@先來先服務調(diào)度算法@@@!!--->>n”);

      cout<

      printf(“輸入進程數(shù)目:”);

      scanf(“%d”,&N);

      input(a,N);

      FCFS(a,N);

      case '2':

      int N1;

      cout<

      cout<

      printf(“tt<<---!!@@@最短進程優(yōu)先調(diào)度算法@@@!!--->>n”);

      cout<

      printf(“輸入進程數(shù)目: ”);

      scanf(“%d”,&N1);

      input(a1,N1);

      sjf *b=a1;

      sjf *c=a1;

      sjff(b,N1);

      getchar();

      }

      }

      system(“PAUSE”);

      return EXIT_SUCCESS;}

      五、實驗結果

      1.執(zhí)行結果

      2.結果分析

      先來先服務調(diào)度算法就是根據(jù)進程達到的時間為依據(jù),哪一個進程先來那么該進程就會先執(zhí)行;最短進程優(yōu)先調(diào)度算法則是以每個進程執(zhí)行所需時間長短為依據(jù),某一個進程執(zhí)行所需花的時間要短些那么該進程就先執(zhí)行。以上就是本次進程調(diào)度實驗的依據(jù)。

      六、實驗總結

      通過本次實驗了解到算法很重要,又更加明白算法本身可以節(jié)約時間,而且不同的函數(shù)之間在調(diào)用的時候要注意很多的問題。

      第三篇:進程調(diào)度

      操作系統(tǒng)課程設計

      進 程 調(diào) 度 實 踐 報 告

      姓名: 董宇超 班級:計算機一班 學號:0906010124

      目錄:

      ? 實踐內(nèi)容 ? 實踐目的及意義 ? 功能設計及數(shù)據(jù)結構 ? 調(diào)試運行及測設分析 ? 存在的問題及改進設想 ? 實踐體會 ? 總結 ? 參考文獻

      正文:

      1.實踐內(nèi)容:

      2.3.在多道程序運行環(huán)境下,進程數(shù)目一般多于處理機數(shù)目,使得進程要通過競爭來使用處理機。這就要求系統(tǒng)能按某種算法,動態(tài)地把處理機分配給就緒隊列中的一個進程,使之運行,分配處理機的任務是由進程調(diào)度程序完成的。一個進程被創(chuàng)建后,系統(tǒng)為了便于對進程進行管理,將系統(tǒng)中的所有進程按其狀態(tài),將其組織成不同的進程隊列。于是系統(tǒng)中有運行進程隊列、就緒隊列和各種事件的進程等待隊列。進程調(diào)度的功能就是從就緒隊列中挑選一個 進程到處理機上運行。進程調(diào)度的算法有多種,常用的有先來先服務算法、時間片輪轉算法。

      采用先來先服務及時間片輪轉算法進行進程調(diào)度,編程模擬。實踐目的:

      ·要求設計并實現(xiàn)模擬進程調(diào)度的算法:時間片輪轉及先來先服務?!だ斫膺M程控制塊的結構?!だ斫膺M程運行的并發(fā)性。·掌握進程調(diào)度算法。功能設計:

      1)數(shù)據(jù)結構:

      class PCB {

      string ProcessName;// 進程名字

      int Time;// 進程需要時間

      int LeftTime;// 進程運行一段時間后還需要的時間

      } 2)功能函數(shù):

      void Copy(Process proc1, Process proc2);// 把proc2賦值給proc1 void sort(Process pr[], int size);// 此排序后按需要的cpu

      時間從小到大排列

      void Fcfs(Process pr[], int num);// 先來先服務算法

      void TimeTurn(Process process[], int num, int Timepice);// 時

      間片輪轉算法

      源代碼:

      #include #include using namespace std;class PCB { public:

      };

      void Copy(PCB proc1, PCB proc2);// 把proc2賦值給proc1 void sort(PCB pr[], int size);// 此排序后按需要的cpu時間從小到大排列 void Fcfs(PCB pr[], int num);// 先來先服務算法

      void TimeTurn(PCB process[], int num, int Timepice);// 時間片輪轉算法

      void main(){

      int a;cout<>a;const int Size =30;PCB

      process[Size];int num;int TimePice;

      cout<<“輸入進程個數(shù):”<>num;if(a==2){

      } for(int i=0;i< num;i++)//輸入進程信息 {

      } for(int k=0;k

      cout<>name;cin>> CpuTime;process[i].ProcessName =name;process[i].Time =CpuTime;cout<>TimePice;string ProcessName;// 進程名字 int Time;// 進程需要時間

      int LeftTime;// 進程運行一段時間后還需要的時間

      } {

      } else if(a==2)//時間片輪轉調(diào)度 {

      } cout<<“進程名”<<“ 剩余時間”<<“

      狀態(tài)”<

      CPU時間 ”<<“

      狀態(tài)”<

      }

      void sort(PCB pr[], int size)// 以進程時間從低到高排序 {// 直接插入排序

      } /* 先來先服務算法的實現(xiàn)*/ void Fcfs(PCB process[], int num){ // process[] 是輸入的進程,num是進程的數(shù)目

      while(true){

      if(num==0){

      } if(process[0].LeftTime==0)//由于第一個進程總是在運行,所以每次都只判斷process[0].LeftTime { cout<<“ 所有進程都已經(jīng)執(zhí)行完畢!”<

      } PCB temp;temp = pr[i];int j=i;

      while(j>0 && temp.Time < pr[j-1].Time){

      } pr[j] = temp;pr[j] = pr[j-1];j--;proc1.ProcessName =proc2.ProcessName;proc1.Time =proc2.Time;

      }

      } cout<<“ 進程”<

      } else if(process[0].LeftTime > 0){

      cout<“<

      運行”;cout<

      for(int s=1;s

      } cout<<“ ”<

      “<

      等待”<} // while

      /* 時間片輪轉調(diào)度算法實現(xiàn)*/ void TimeTurn(PCB process[], int num, int Timepice){

      while(true){

      if(num==0){

      } if(process[0].LeftTime==0)//由于第一個進程總是在運行,所以每次都只判斷process[0].LeftTime {

      cout<<“ 進程”<

      }

      } num--;if(process[num-1].LeftTime ==0){

      } else if(process[0].LeftTime > 0){

      cout<

      } PCB temp;//中間變量 temp = process[0];for(int j=0;j

      等待”<

      就緒”<

      process[0].LeftTime=process[0].LeftTime-Timepice;if(process[0].LeftTime<=0)//當剩余時間小于零時,做零處理 process[0].LeftTime=0;cout<<“ ”<

      “<

      運行”<

      for(int s=1;s“<

      cout<<” 進程“ << process[num-1].ProcessName <<” 已經(jīng)執(zhí)行完畢!"<

      } // while

      4.調(diào)試運行:

      運行開始后出現(xiàn)如下界面:

      按提示選擇1/2;

      ? 先選1,進行FCFS調(diào)度:

      ? 若選2,進行時間片輪轉調(diào)度:

      5.存在的問題:

      由于初次做操作系統(tǒng)模擬實驗,所以程序設計中存在很多問題,例如定義好PCB后,各種指針的使用,使得程序甚是復雜,再加上隊列指針,而且指針錯誤在調(diào)試的時候不提示錯誤,只是編好的程序看似沒有錯誤,卻在執(zhí)行時出現(xiàn)異常而中斷,由于使用指針使得程序龐大檢查改正困難,無法發(fā)現(xiàn)隱藏的錯誤,只是程序無法進行下去。

      最終本程序選擇數(shù)組保存PCB信息,存儲和調(diào)用都簡單化。

      改進之處:學習指針,并且使用三個隊列,就緒隊列,運行隊列,完成隊列,使得進程調(diào)度模擬更加清晰。

      還有一些簡單的以解決的問題,不一一列舉了。

      6.實踐心得體會:

      通過這次實踐學會了不少內(nèi)容,更深的理解了進程調(diào)度的幾種算法,而且學 會了系統(tǒng)的編寫程序,而不是只編寫幾個功能函數(shù)。在編程過程中,需要 查閱各種資料,并且學習前人的編寫方法,找出優(yōu)劣,然后形成自己的思想,最終完成程序的編寫。

      通過模擬進程調(diào)度的兩種算法,懂得了各種算法在不同情況下的作用。選擇 一個好的調(diào)度算法可以是計算機在執(zhí)行龐大的作業(yè)時井井有條,并且使用時 間很短。

      在模擬過程中出現(xiàn)過好多問題,有的解決了,有的還未解決,不管如何都是 一種收獲,編寫功能函數(shù)時總會出現(xiàn)參數(shù)調(diào)用錯誤的情況,通過分析解決了。在指針指向的問題上,覺得很復雜,最終沒有解決。

      7.總結:

      為期一周的操作系統(tǒng)實踐課結束了,編寫了包含有兩種調(diào)度算法的進程 調(diào)度模擬程序,兩種程序各有優(yōu)劣,F(xiàn)CFS調(diào)度算法是按照進程進入系統(tǒng)的時 間先后被CPU選擇創(chuàng)建的,這種算法易于實現(xiàn),但效率不高,只顧及到進程 的等候時間,沒考慮要求服務的時間長短,相比SJF算法不利于較短的作業(yè)。本程序的另一種調(diào)度算法是RR算法,它在調(diào)度是是為每個進程分配時間片,當時間片用完時,進程便排到隊尾以便下次分配,這種調(diào)度策略可以防止那 些很少使用設備的進程長時間占用處理器,導致要使用設備的那些進程沒機 會啟動設備。

      在編寫程序的同時,還學習了進程調(diào)度的其他算法,明白了它們各自的優(yōu)劣,懂得了計算機在調(diào)度進程時的取舍。

      8.參考文獻:

      1.操作系統(tǒng)教程(第4版)…………孫鐘秀 主編 高等教育出版社;

      2.算法與數(shù)據(jù)結構-C語言描述(第2版)……張乃孝 主編 高等教育出版社; 3.網(wǎng)絡資源;

      第四篇:進程創(chuàng)建實驗報告

      實驗二 進程的創(chuàng)建

      一、實驗目的

      熟悉進程的創(chuàng)建過程,了解系統(tǒng)調(diào)用函數(shù)fork()和 execl()。

      二、實驗內(nèi)容

      1、閱讀實例代碼fork1,并編輯、編譯、運行,記錄程序的運行結果,嘗試給出合理的解釋,查閱有關資料,掌握系統(tǒng)調(diào)用fork()的用法,返回值的意義。

      2、閱讀實例代碼fork2,并編輯、編譯、運行,記錄程序的運行結果,嘗試給出合理的解釋,查閱有關資料,掌握在程序中運行一個操作系統(tǒng)命令和運行一個程序的方法。

      3、修改fork2,使之能把運行的命令和程序作為參數(shù)傳給fork2。

      三、設計思想

      1、程序框架

      pid =-1 pid = 0 pid > 0

      2、用到的文件系統(tǒng)調(diào)用函數(shù) fork()和 execl()

      四、調(diào)試過程

      1、測試數(shù)據(jù)設計(1)fork1 命名程序1:

      編寫程序1:

      編譯程序1:

      運行程序1:

      (2)fork2 編寫程序2:

      運行程序2:

      (3)修改fork2 編寫修改程序2:

      修改后的運行結果:

      2、測試結果分析

      (1)對于程序1:因為系統(tǒng)調(diào)用fork()函數(shù)是一次調(diào)用兩次返回值,而且先生成子進程還是父進程是不確定的,所以第一次執(zhí)行生成子進程的時候返回的pid = 0,判斷pid!=-1,所以輸出了I’m the child.I’m the parent.第二次,執(zhí)行父進程的時候,返回的是子進程的進程號pid > 0,即pid的值仍然不為-1,所以又輸出了一次I’m the child.I’m the parent。

      (2)對于程序2:第一次調(diào)用fork()函數(shù)時,由于執(zhí)行的是子進程還是父進程是隨機的,所以第一次對父進程返回的是子進程的進程號(大于0),即pid > 0,所以輸出I’m the parent.Program end.當?shù)诙螆?zhí)行子進程時返回值是0,即pid = 0,所以輸出I’m the child.并調(diào)用了execl()函數(shù),查看了指定路徑中的文件。

      (3)對于修改后的程序2:改變了系統(tǒng)調(diào)用execl()中參數(shù)的文件路徑和可執(zhí)行文件名,即可在程序fork2.c中執(zhí)行另一個程序wyf.c(但要注意可執(zhí)行文件名是123)。

      五、總結

      1、調(diào)試過程中遇到的主要問題及解決過程

      運行程序2的時候如果不加execl()函數(shù)的頭文件會提示警告,而且因為execl()的第三個參數(shù)是字符型指針數(shù)組,所以要強制轉換成指針型,即寫成(char*)0 才行。

      2、體會和收獲

      通過這次實驗我進一步熟悉了linux系統(tǒng),也學會了進程的創(chuàng)建過程和返回值的意義。同時學會了一個新的系統(tǒng)調(diào)用函數(shù)execl()及其頭文件和參數(shù)類型。也學會了在編寫完程序之后,不僅可以用 :wq 保存并退出,也可以用快捷鍵 shift + zz。

      六、附錄:源程序代碼(另附)

      第五篇:操作系統(tǒng)進程調(diào)度實驗

      一.實驗目的及實驗環(huán)境 1.實驗目的

      通過觀察、分析實驗現(xiàn)象,深入理解進程及進程在調(diào)度執(zhí)行和內(nèi)存空間等方面的特點,掌握在POSIX 規(guī)范中fork和kill系統(tǒng)調(diào)用的功能和使用。2.實驗環(huán)境

      (1)硬件

      ? CPU:I7-4500U ? 內(nèi)存:8G DDR3 1600 ? 顯示器:華碩筆記本顯示器 ? 硬盤空間:80G

      (2)軟件

      ? 虛擬機名稱及版本:非虛擬機

      ? 操作系統(tǒng)名稱及版本:Ubuntu Kylin 16.04 ? 編譯器:gcc 二.實驗內(nèi)容

      1、實驗前準備工作

      學習man 命令的用法,通過它查看fork 和kill 系統(tǒng)調(diào)用的在線幫助,并閱讀參考資料,學會fork 與kill 的用法,復習C 語言的相關內(nèi)容。

      2、實驗內(nèi)容

      根據(jù)下發(fā)的Linux進程管理實驗PPT內(nèi)容,將實驗代碼補充完整。并考慮: 先猜想一下這個程序的運行結果。假如運行“./process 20”,輸出會是什么樣?然后按照注釋里的要求把代碼補充完整,運行程序??梢远噙\行一會兒,并在此期間啟動、關閉一些其它進程,看process 的輸出結果有什么特點,記錄下這個結果。開另一個終端窗口,運行“ps aux|grep process”命令,看看process 究竟啟動了多少個進程?;氐匠绦驁?zhí)行窗口,按“數(shù)字鍵+回車”嘗試殺掉一兩個進程,再到另一個窗口看進程狀況。按q 退出程序再看進程情況。

      3、回答問題

      編寫、編譯、鏈接、執(zhí)行實驗內(nèi)容設計中的代碼,并回答如下問題: 1)你最初認為運行結果會怎么樣?

      手動輸入進程數(shù),選擇輸入要殺死的進程編號,按q殺死所有進程。需手動輸入進程數(shù),然后鍵入編號殺死進程,鍵入q殺死父進程即殺死2)實際的結果什么樣?有什么特點?試對產(chǎn)生該現(xiàn)象的原因進行分析。所有進程。

      3)proc_number 這個全局變量在各個子進程里的值相同嗎?為什么? 不相同,proc_number是存儲各個子進程的編號的,所以在各個子進程中

      是不同的。

      4)kill 命令在程序中使用了幾次?每次的作用是什么?執(zhí)行后的現(xiàn)象是什么?

      使用了2次,第一次是在while循環(huán)中的if語句中使用,用來殺死用戶鍵入的指定進程。第二次是殺死父進程,回到程序的開始。

      5)使用kill 命令可以在進程的外部殺死進程。進程怎樣能主動退出?這兩種退出方式哪種更好一些?

      調(diào)用return 函數(shù)或exit函數(shù)都可以正常退出,而使用kill函數(shù)是異常退出,使用正常退出的方法比較好。

      6)寫出fork()和kill()函數(shù)原型,并解釋函數(shù)的功能和參數(shù)的含義?

      原型: #include

      功能:

      一個現(xiàn)有進程可以調(diào)用fork函數(shù)創(chuàng)建一個新進程。由fork創(chuàng)建的新進程被稱為子進程。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進程中返回0值而父進程中返回子進程ID。原型:#include #include

      int kill(pid_t pid, int sig);

      功能:

      向某個進程傳遞一個信號

      7)ps aux|grep process命令功能是什么?并解釋結果的含義。

      ps命令是最基本進程查看命令.使用該命令可以確定有進程正在運行數(shù)量和運行的狀態(tài)、進程是否結束、是否有僵尸進程、進程占用的資源。grep命令查看某進程的狀態(tài)并打印在屏幕上,ps aux是顯示所有進程和他們的狀態(tài)。ps aux輸出格式:

      USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

      三.方案設計

      每創(chuàng)建一個子進程時,將其pid存儲在數(shù)組pid[i]中,i存儲在proc_number中,然后調(diào)用死循環(huán)函數(shù)do_something(),輸出該進程的proc_number,當輸入數(shù)字是主進程執(zhí)行kill(pid[pid-48],SIGTERM),殺死ch-48進程。當輸入q時循環(huán)退出,kill(0,SIGTERM),殺死本組所有進程,程序退出。

      #include pid_t fork(void);

      四.測試數(shù)據(jù)及運行結果

      注釋:由于我的電腦運行這段代碼報錯,所以我和我組高宏偉同學使用的是同一實驗數(shù)據(jù),同一代碼。五.總結

      1. 實驗過程中遇到的問題及解決辦法;

      實驗中由于代碼中的大部分已經(jīng)給出,只需填寫重要部分。遇到了不懂fork的返回值,所以if和else語句會同時執(zhí)行,知道了fork的原理后,fork會返回兩個值一個到子進程,一個到父進程。2. 對設計及調(diào)試過程的心得體會。

      本次實驗學會了創(chuàng)建進程命令fork和殺死進程命令kill。在開始的時候不理解fork 和kill的原理,有點懵。后來通過看書和上網(wǎng)查詢知道了fork和kill的原理后明白了代碼要填寫的空白。六.附錄:源代碼(電子版)

      #include #include #include #include #include #include

      #define MAX_CHILD_NUMBER 10 #define SLEEP_INTERVAL 2

      int proc_number=0;void do_something();

      int main(int argc,char* argv[]){ int child_proc_number=MAX_CHILD_NUMBER;int i,ch;pid_t child_pid;

      pid_t pid[10]={0};if(argc>1){

      child_proc_number = atoi(argv[1]);

      child_proc_number =(child_proc_number>10)?10:child_proc_number;

      for(i=0;i

      child_pid=fork();

      proc_number=i;

      if(child_pid==0){do_something();

      }else if(child_pid>0){

      pid[i]=child_pid;

      printf(“A Parent process,the pid is %dn”,getpid());

      }

      }

      printf(“input the number you want to killn”);

      while((ch=getchar())!='q')

      {

      if(isdigit(ch)){

      ch=(int)ch-48;

      if(kill(pid[ch],SIGKILL)<0){

      perror(“kill”);

      exit(1);

      }else{

      printf(“process %d has been killed!nn”,pid[ch]);

      }

      }else{

      printf(“is not digitn”);

      }

      getchar();

      printf(“input the number you want to kill:n”);

      }

      kill(0,SIGTERM);} return 0;}

      void do_something(){ for(;;){

      printf(“This is process No.%*dn”,proc_number+3,proc_number);

      sleep(SLEEP_INTERVAL);} }

      下載進程調(diào)度實驗報告word格式文檔
      下載進程調(diào)度實驗報告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發(fā)現(xiàn)有涉嫌版權的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權內(nèi)容。

      相關范文推薦

        調(diào)度自動化實驗報告5篇

        實時監(jiān)控功能分析 一. 實驗名稱 實時監(jiān)控功能分析 二.實驗目的 1. 對實時監(jiān)控功能的基本作用有一個感性認識:電力系統(tǒng)的安全、可靠運行是發(fā)電、供電和保障人民生產(chǎn)和生活用電......

        數(shù)據(jù)結構 任務調(diào)度 實驗報告

        實驗報告 實驗名稱:表達式求值 任務調(diào)度 實驗類型:綜合性實驗 班級:學號:姓名: 實驗日期:2014.5.28 表達式求值 1.問題描述 表達式是數(shù)據(jù)運算的基本形式。人們的書寫習慣是中綴......

        操作系統(tǒng) 實驗一 進程調(diào)度(5篇)

        實驗一進程控制與處理機調(diào)度綜合實驗 一、實驗目的 通過模擬進程控制方法及單處理機系統(tǒng)的進程調(diào)度,了解進程的結構,進程的創(chuàng)建與撤消,進程的組織及進程的狀態(tài)及其轉換,掌握進程......

        實驗報告六 磁盤調(diào)度算法

        實驗報告六磁盤調(diào)度算法 班級:軟技2班學號:201467003084 姓名:劉道林 一.實驗內(nèi)容:熟悉磁盤的結構以及磁盤的驅動調(diào)度算法的模擬,編程實現(xiàn)簡單常用的磁盤驅動調(diào)度算法先來先服......

        操作系統(tǒng)進程管理系統(tǒng)設計實驗報告

        實驗報告說明書 設計名稱: 操作系統(tǒng)課程設計 實 驗 : 進程調(diào)度設計 學生姓名: 專 業(yè): 網(wǎng)絡工程 班 級: 08級一班 學 號: 指導教師:雷曉平王東 黃營 楊躍武 日 期: 2011年 6月 19......

        1.操作系統(tǒng)實驗內(nèi)容(進程調(diào)度)5篇

        一.實驗目的 用高級語言編寫和調(diào)實一個進程調(diào)度程序,以加深對進程的概念及進程調(diào)度算法的理解. 二.實驗要求:設計一個有 N個進程并發(fā)執(zhí)行的進程調(diào)度程序。 三.算法講解 進程調(diào)度算......

        操作系統(tǒng) 單處理機系統(tǒng)的進程調(diào)度

        一.實驗內(nèi)容描述 1.目的 (1)了解Windows內(nèi)存管理器 (2)理解Windows的地址過程 2.內(nèi)容 任意給出一個虛擬地址,通過WinDbg觀察相關數(shù)據(jù)并找到其物理地址 二.理論分析 Windows采用頁......

        常用進程調(diào)度算法的分析與評價

        常用進程調(diào)度算法的分析與評價(一) 2009-10-31 22:48 進程調(diào)度是按照某種調(diào)度算法從就緒狀態(tài)的進程中選擇一個進程到處理機上運行。 進程調(diào)度的兩種方式 : (1)非搶占調(diào)度方式......