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

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

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

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

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

      進(jìn)程創(chuàng)建實(shí)驗(yàn)報(bào)告

      時(shí)間:2019-05-13 16:10:41下載本文作者:會(huì)員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《進(jìn)程創(chuàng)建實(shí)驗(yàn)報(bào)告》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《進(jìn)程創(chuàng)建實(shí)驗(yàn)報(bào)告》。

      第一篇:進(jìn)程創(chuàng)建實(shí)驗(yàn)報(bào)告

      實(shí)驗(yàn)二 進(jìn)程的創(chuàng)建

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

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

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

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

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

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

      三、設(shè)計(jì)思想

      1、程序框架

      pid =-1 pid = 0 pid > 0

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

      四、調(diào)試過程

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

      編寫程序1:

      編譯程序1:

      運(yùn)行程序1:

      (2)fork2 編寫程序2:

      運(yùn)行程序2:

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

      修改后的運(yùn)行結(jié)果:

      2、測試結(jié)果分析

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

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

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

      五、總結(jié)

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

      運(yùn)行程序2的時(shí)候如果不加execl()函數(shù)的頭文件會(huì)提示警告,而且因?yàn)閑xecl()的第三個(gè)參數(shù)是字符型指針數(shù)組,所以要強(qiáng)制轉(zhuǎn)換成指針型,即寫成(char*)0 才行。

      2、體會(huì)和收獲

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

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

      第二篇:進(jìn)程調(diào)度實(shí)驗(yàn)報(bào)告

      天津大學(xué)仁愛學(xué)院

      實(shí)驗(yàn)類型:實(shí)驗(yàn)名稱:實(shí)驗(yàn)地點(diǎn):

      學(xué)生姓名:班 級:

      操作系統(tǒng) 實(shí)驗(yàn)報(bào)告

      必 修 實(shí)驗(yàn)日期:2014年4月18日進(jìn)程調(diào)度 二實(shí)驗(yàn)樓504 李帥帥 指導(dǎo)教師:張 磊 計(jì)科一班 計(jì)算機(jī)科學(xué)與技術(shù)系

      天津大學(xué)仁愛學(xué)院——計(jì)算機(jī)科學(xué)與技術(shù)系——李帥帥

      實(shí)驗(yàn)報(bào)告內(nèi)容:

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

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

      2)實(shí)驗(yàn)器材和設(shè)備

      硬 件: 二實(shí)驗(yàn)樓504計(jì)算機(jī)

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

      3)實(shí)驗(yàn)任務(wù)

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

      4)實(shí)驗(yàn)原理

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

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

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

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

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

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

      5)實(shí)驗(yàn)過程描述

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

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

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

      天津大學(xué)仁愛學(xué)院——計(jì)算機(jī)科學(xué)與技術(shù)系——李帥帥

      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”<

      }

      天津大學(xué)仁愛學(xué)院——計(jì)算機(jī)科學(xué)與技術(shù)系——李帥帥

      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;

      天津大學(xué)仁愛學(xué)院——計(jì)算機(jī)科學(xué)與技術(shù)系——李帥帥

      {

      } } return t;}

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

      if(p->needtime==0)

      {

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

      }

      if(p->process==execute)

      {

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

      }

      p->next;} }//設(shè)置隊(duì)列中進(jìn)程執(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”<

      天津大學(xué)仁愛學(xué)院——計(jì)算機(jī)科學(xué)與技術(shù)系——李帥帥

      7)實(shí)驗(yàn)結(jié)果截圖

      第三篇:進(jìn)程創(chuàng)建函數(shù)分析

      1.進(jìn)程狀態(tài):

      1)可運(yùn)行狀態(tài)(TASK_RUNNING)

      2)可中斷的等待狀態(tài)(TASK_INTERRUPTIBLE)

      3)不可中斷的等待狀態(tài)(TASK_UNINTERRUPTIBLE)

      4)暫停狀態(tài)(TASK_STOPPED)

      5)僵死狀態(tài)(TASK_ZOMBIE)

      2.進(jìn)程的創(chuàng)建:1)fork:使用該系統(tǒng)調(diào)用時(shí),子進(jìn)程復(fù)制父進(jìn)程的全部資源。由于要復(fù)制父進(jìn)程進(jìn)程描述符給子進(jìn)程(進(jìn)程描述的結(jié)構(gòu)很大!),這一過程開銷是很大的。linux采用了”寫時(shí)復(fù)制技術(shù)”(copy on write,COW),使子進(jìn)程先共享父進(jìn)程的物理頁,只有子進(jìn)程進(jìn)行寫操作時(shí),再復(fù)制對應(yīng)的物理頁,避免了無用的復(fù)制開銷,提高了系統(tǒng)的性能。

      實(shí)現(xiàn)代碼(x86):arch/x86/kernel/process.c

      int sys_fork(struct pt_regs *regs)

      {

      Return do_fork(SIGCHLD, regs->sp, regs,0, NULL, NULL);

      }

      2)vfork:該系統(tǒng)調(diào)用創(chuàng)建的子進(jìn)程,完全運(yùn)行在父進(jìn)程地址空間之上。子進(jìn)程對地址空間任何數(shù)據(jù)的修改同樣為父進(jìn)程所見。vfork執(zhí)行后父進(jìn)程堵塞,知道子進(jìn)程運(yùn)行結(jié)束。

      實(shí)現(xiàn)代碼(x86):arch/x86/kernel/process.c

      int sys_vfork(struct pt_regs *regs)

      {

      Return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->sp, regs, 0,NULL, NULL);

      } 3)clone:該調(diào)用是linux系統(tǒng)所特有的,其NPTL的實(shí)現(xiàn)依賴此函數(shù)。與fork,vfork相比clone對進(jìn)程創(chuàng)建有更好的控制能力,能控制子進(jìn)程和父進(jìn)程共享何種資源。

      實(shí)現(xiàn)代碼(x86):arch/x86/kernel/process.c

      long sys_clone(unsignedlong clone_flags, unsigned long newsp,void__user *parent_tid, void__user *child_tid, structpt_regs *regs){

      if(!newsp)

      newsp = regs->sp;

      Return o_fork(clone_flags, newsp, regs, 0,parent_tid, child_tid);}

      上面進(jìn)程的創(chuàng)建最終依賴于:do_fork(),只是向其傳遞了不同的參數(shù)clone_flags,其原型為:

      long do_fork(unsigned long clone_flags,unsigned long stack_start,struct pt_regs *regs,unsigned long stack_size,int __user *parent_tidptr,int __user *child_tidptr)

      參數(shù)分析: clone_flags:低字節(jié)指定子進(jìn)程結(jié)束時(shí)發(fā)送到父進(jìn)程的信號代碼,通常選擇SIGCHLD信號。剩余3個(gè)字節(jié)給一clone標(biāo)志組用于編碼

      stack_start:子進(jìn)程用戶態(tài)堆棧的地址

      regs:指向內(nèi)核態(tài)堆棧通用寄存器值的指針,通用寄存器的值是在從用戶態(tài)切換到內(nèi)核態(tài)時(shí)被保存到內(nèi)核態(tài)堆棧中的。

      stack_size:未使用,總被設(shè)置為0。

      parent_tidptr:表示父進(jìn)程的用戶態(tài)變量地址,該父進(jìn)程具有與新輕量級進(jìn)程相同的PID。

      child_tidptr:表示新輕量級進(jìn)程的用戶態(tài)變量地址,該進(jìn)程具有這一類進(jìn)程的PID。只有在CLONE_CHILD_SETTID被設(shè)置時(shí)才有意義。

      而do_fork()函數(shù)生成一個(gè)新的進(jìn)程,大致分為三個(gè)步驟。

      1、建立進(jìn)程控制結(jié)構(gòu)并賦初值,使其成為進(jìn)程映像。

      2、必須為新進(jìn)程的執(zhí)行設(shè)置跟蹤進(jìn)程執(zhí)行情況的相關(guān)內(nèi)核數(shù)據(jù)結(jié)構(gòu)。包括任務(wù)數(shù)組、自由時(shí)間列表 tarray_freelist 以及 pidhash[] 數(shù)組。

      3、啟動(dòng)調(diào)度程序,使子進(jìn)程獲得運(yùn)行的機(jī)會(huì)。

      第四篇:操作系統(tǒng)進(jìn)程管理系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告

      實(shí)驗(yàn)報(bào)告說明書

      設(shè)計(jì)名稱: 操作系統(tǒng)課程設(shè)計(jì)

      實(shí) 驗(yàn) : 進(jìn)程調(diào)度設(shè)計(jì)

      學(xué)生姓名:

      專 業(yè): 網(wǎng)絡(luò)工程 班 級: 08級一班 學(xué) 號:

      指導(dǎo)教師:雷曉平王東 黃營 楊躍武 日 期: 2011年 6月 19日

      課程設(shè)計(jì)任務(wù)書

      網(wǎng)絡(luò)工程 專業(yè) 08 年級 1 班

      一、具體要求

      本課程設(shè)計(jì)共2周,采取集中方式。㈠主要設(shè)計(jì)內(nèi)容

      1、進(jìn)程調(diào)度

      2、存儲(chǔ)管理

      3、文件管理

      ㈡操作系統(tǒng)分項(xiàng)設(shè)計(jì)

      1、設(shè)計(jì)一 :進(jìn)程管理系統(tǒng)設(shè)計(jì)

      目的與要求:本設(shè)計(jì)的目的是加深對進(jìn)程概念及進(jìn)程管理各部分內(nèi)容的理解;熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)、同步機(jī)構(gòu)及通訊機(jī)構(gòu)的實(shí)施。

      要求設(shè)計(jì)一個(gè)允許n個(gè)進(jìn)程并發(fā)運(yùn)行的進(jìn)程管理模擬系統(tǒng)。該系統(tǒng)包括有簡單的進(jìn)程控制、同步與通訊機(jī)構(gòu),其進(jìn)程調(diào)度算法可任意選擇。每個(gè)進(jìn)程用一個(gè)PCB表示,其內(nèi)容根據(jù)具體情況設(shè)置。各進(jìn)程之間有一定的同步關(guān)系(可選)。系統(tǒng)在運(yùn)行過程中應(yīng)能顯示或打印各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,以便觀察諸進(jìn)程的運(yùn)行過程及系統(tǒng)的管理過程。

      具體詳見:設(shè)計(jì)任務(wù)書1--進(jìn)程調(diào)度算法.doc

      2、設(shè)計(jì)二:存貯器管理系統(tǒng)設(shè)計(jì)

      目的與要求:本設(shè)計(jì)的目的是使學(xué)生熟悉存貯器管理系統(tǒng)的設(shè)計(jì)方法;加深對所學(xué)各種存貯器管理方案的了解;要求采用一些常用的存貯器分配算法,設(shè)計(jì)一個(gè)存貯器管理模擬系統(tǒng)并調(diào)試運(yùn)行。模擬環(huán)境應(yīng)盡量接近真實(shí)。

      具體詳見:設(shè)計(jì)任務(wù)書2--內(nèi)存分區(qū)管理模擬.doc

      3、設(shè)計(jì)三:虛擬存儲(chǔ)器管理系統(tǒng)設(shè)計(jì)

      本設(shè)計(jì)的目的是通過設(shè)計(jì)一個(gè)簡單的虛擬存儲(chǔ)器管理系統(tǒng)來模擬實(shí)際的頁面調(diào)度算法與過程,以掌握這種有用的技術(shù)。要求將其輸入/輸出處理程序編成一個(gè)獨(dú)立的進(jìn)程模塊并與其它請求輸入/輸出的進(jìn)程并發(fā)運(yùn)行。并要求加入設(shè)備管理子模塊。

      具體分析為:頁面調(diào)度算法主要有FIFO、最近最少使用調(diào)度算法(LRU)、最近最不常用調(diào)度算法(LFU)、最佳算法(OPT)等。題目要求:

      ① 實(shí)現(xiàn)三種算法:

      1、先進(jìn)先出;

      2、OPT;

      3、LRU ② 頁面序列從指定的文本文件(TXT文件)中取出

      ③ 輸出:第一行:每次淘汰的頁面號,第二行:顯示缺頁的總次數(shù)

      4、設(shè)計(jì)四:文件管理系統(tǒng)設(shè)計(jì)

      目的與要求:本設(shè)計(jì)的目的是通過設(shè)計(jì)和調(diào)試一個(gè)簡單的外部文件系統(tǒng),主要是模擬文件操作,使學(xué)生對主要文件操作命令的實(shí)質(zhì)和執(zhí)行過程有比較深入的了解,掌握它們的基本實(shí)施方法。

      基本要求如下:

      實(shí)現(xiàn)三種算法: 先來先服務(wù)、最短尋道優(yōu)先、電梯算法 磁道服務(wù)順序從指定的文本文件(TXT文件)中取出

      輸出:第一行:磁道的服務(wù)順序;第二行:顯示移動(dòng)總道數(shù)

      5、設(shè)計(jì)五:多道程序的轉(zhuǎn)換調(diào)度系統(tǒng) 題目要求:(作業(yè)調(diào)度和進(jìn)程調(diào)度結(jié)合在一起)作業(yè)流信息是從指定文本文件(TXT文件)中讀取 作業(yè)信息:

      作業(yè)號 進(jìn)入系統(tǒng)時(shí)間 估計(jì)運(yùn)行時(shí)間 優(yōu)先級 內(nèi)存需求量 磁帶機(jī)需求量 都為整型 作業(yè)調(diào)度算法:先來先服務(wù)、最短作業(yè)優(yōu)先(二者選一)

      進(jìn)程調(diào)度算法:先來先服務(wù)、基于優(yōu)先級的算法(靜態(tài)優(yōu)先級)(二者選一)輸出格式:作業(yè)號 時(shí)間間隔 800-810(/* 8:00-8:10 */)2 810-900 1 900-930平均周轉(zhuǎn)時(shí)間:總的周轉(zhuǎn)時(shí)間/作業(yè)總數(shù)

      周轉(zhuǎn)時(shí)間就是作業(yè)結(jié)束時(shí)間減去作業(yè)進(jìn)入系統(tǒng)時(shí)間 具體詳見:多道程序轉(zhuǎn)換.doc

      以上設(shè)計(jì)以20-25人為組,選擇一個(gè)設(shè)計(jì)進(jìn)行。㈢操作系統(tǒng)整體設(shè)計(jì)

      將第㈡部分中的全部或部分有機(jī)地組合起來,構(gòu)成一個(gè)小型的操作系統(tǒng)。

      二、進(jìn)度安排

      1、教師下達(dá)設(shè)計(jì)任務(wù)書(半天)任務(wù)書內(nèi)容包括題目、主要技術(shù)指標(biāo)和要求、給定條件及原始數(shù)據(jù)、所用儀器設(shè)備和參考資料及文獻(xiàn)等。教師講授必要的設(shè)計(jì)思路和設(shè)計(jì)方法。

      2、學(xué)生完成預(yù)設(shè)計(jì)(1天半)本階段學(xué)生通過查閱資料及文獻(xiàn)(主要自學(xué)),明確任務(wù),掌握工程設(shè)計(jì)基本方法,確定設(shè)計(jì)方案,進(jìn)行設(shè)計(jì)分析,完成預(yù)設(shè)計(jì)。

      3、實(shí)驗(yàn)階段(7天)經(jīng)教師審查通過預(yù)設(shè)計(jì)方案后,即可進(jìn)行編程調(diào)試。實(shí)驗(yàn)由學(xué)生獨(dú)立完成,教師定時(shí)指導(dǎo)。

      4、設(shè)計(jì)總結(jié)階段(1天)本階段學(xué)生要認(rèn)真完成課程設(shè)計(jì)報(bào)告書,整理技術(shù)資料,并盡可能寫出課程設(shè)計(jì)的心得體會(huì)和改進(jìn)意見。

      三、完成后應(yīng)上交的材料

      課程設(shè)計(jì)報(bào)告書包括:設(shè)計(jì)任務(wù)及主要技術(shù)指標(biāo)、設(shè)計(jì)方案及論證結(jié)果、系統(tǒng)的原理框圖、設(shè)計(jì)程序、實(shí)驗(yàn)結(jié)果、實(shí)驗(yàn)中主要問題及故障現(xiàn)象的分析及設(shè)計(jì)結(jié)論等。

      附實(shí)驗(yàn)數(shù)據(jù)、系統(tǒng)軟硬件環(huán)境、使用說明及參考資料。

      四、總評成績

      指導(dǎo)教師 簽名日期 年 月 日 系 主 任 審核日期 年 月 日

      目 錄

      一、實(shí)驗(yàn)?zāi)康摹?

      二、實(shí)驗(yàn)要求………………………………………5

      三、具體內(nèi)容………………………………………5 3.1先來先服務(wù)(FCFS)???????5 3.2作業(yè)優(yōu)先SJF 算法????????5 3.3多級隊(duì)列調(diào)度算法????????.5 3.4時(shí)間片輪轉(zhuǎn)調(diào)度法?????????5 3.5優(yōu)先級法?????????????6 3.6多隊(duì)列反饋法???????????6 3.7輪轉(zhuǎn)法??????????????.6 3.8最短周期優(yōu)先???????????6 3.9先來先服務(wù)?????????????7

      四、實(shí)驗(yàn)程序………………………………………7

      五、實(shí)驗(yàn)總結(jié)………………………………………13

      設(shè)計(jì)題目:進(jìn)程管理系統(tǒng)設(shè)計(jì)

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

      本設(shè)計(jì)的目的是加深對進(jìn)程概念及進(jìn)程管理各部分內(nèi)容的理解;熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)、同步機(jī)構(gòu)及通訊機(jī)構(gòu)的實(shí)施。

      二、實(shí)驗(yàn)要求:

      設(shè)計(jì)一個(gè)允許n個(gè)進(jìn)程并發(fā)運(yùn)行的進(jìn)程管理模擬系統(tǒng)。該系統(tǒng)包括有簡單的進(jìn)程控制、同步與通訊機(jī)構(gòu),其進(jìn)程調(diào)度算法可任意選擇。每個(gè)進(jìn)程用一個(gè)PCB表示,其內(nèi)容根據(jù)具體情況設(shè)置。各進(jìn)程之間有一定的同步關(guān)系(可選)。系統(tǒng)在運(yùn)行過程中應(yīng)能顯示或打印各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,以便觀察諸進(jìn)程的運(yùn)行過程及系統(tǒng)的管理過程。

      三、具體內(nèi)容:

      調(diào)度也稱dispatcher,這是內(nèi)核的主要職責(zé)之一。一個(gè)良好的任務(wù)調(diào)度算法應(yīng)該主要體現(xiàn)在以下幾個(gè)方面:

      公平:保證每個(gè)進(jìn)程得到合理的CPU 時(shí)間

      高效:使CPU 保持忙碌狀態(tài),即總是有進(jìn)程在CPU 上運(yùn)行 響應(yīng)時(shí)間:使交互用戶的響應(yīng)時(shí)間盡可能短

      周轉(zhuǎn)時(shí)間:使批處理用戶等待輸出的時(shí)間盡可能短 吞吐量:使單位時(shí)間內(nèi)處理的進(jìn)程盡可能多

      很顯然在任何操作系統(tǒng)中這幾個(gè)目標(biāo)不可能同時(shí)達(dá)到所以不同的。

      操作系統(tǒng)會(huì)在這幾個(gè)方面中做出相應(yīng)的取舍從而確定自己的調(diào)度算法,常用的處理機(jī)調(diào)度算法有:先來先服務(wù)FCFS、短作業(yè)優(yōu)先SJF、優(yōu)先級、時(shí)間片輪轉(zhuǎn)法、多級隊(duì)列法、多級反饋隊(duì)列法。

      (1)先來先服務(wù)(FCFS)

      FCFS 是最簡單的CPU 調(diào)度算法,即按進(jìn)程到來的先后次序進(jìn)行調(diào)度,這樣在系統(tǒng)中等待時(shí)間最長的進(jìn)程被優(yōu)先調(diào)度,而不管其所需運(yùn)行時(shí)間的長短。

      (2)作業(yè)優(yōu)先SJF 算法

      是指當(dāng)CPU 可供使用時(shí)SJF 算法把CPU 分給需要運(yùn)行時(shí)間最短的進(jìn)程。(3)多級隊(duì)列調(diào)度算法

      把就緒隊(duì)列劃分成幾個(gè)單獨(dú)的隊(duì)列一般根據(jù)進(jìn)程的某些特性如內(nèi)存大小和進(jìn)程類型永久性地把各個(gè)進(jìn)程分別鏈入其中某一個(gè)隊(duì)列中,每個(gè)隊(duì)列都有自己的調(diào)度算法,此外在各個(gè)隊(duì)列之間也要進(jìn)行調(diào)度。通常采用固定優(yōu)先級的搶占式調(diào)度,例如某系統(tǒng)中有5 個(gè)隊(duì)列,各個(gè)隊(duì)列的優(yōu)先級自上而下降低,只有當(dāng)前3 個(gè)隊(duì)列中都為空的時(shí)候隊(duì)列4 中的進(jìn)程才可以運(yùn)行,而當(dāng)隊(duì)列4 中的進(jìn)程在運(yùn)行時(shí),如果隊(duì)列1 中進(jìn)入了一個(gè)就緒進(jìn)程,則隊(duì)列4 中的進(jìn)程要立刻讓出CPU 使用權(quán)。多級反饋隊(duì)列法允許進(jìn)程在各隊(duì)列間移動(dòng),其基本思想是把具有不同CPU工作時(shí)間這一特性的進(jìn)程區(qū)分開來,如果一個(gè)進(jìn)程要使用很長的CPU 時(shí)間,則應(yīng)把它移至較低級的隊(duì)列中,這種方式把I/O 繁忙型和交互式進(jìn)程放在較高優(yōu)先級的隊(duì)列中同樣在低優(yōu)先級隊(duì)列中長時(shí)間等待的進(jìn)程可以移到較高優(yōu)先級隊(duì)列中UNIX 系統(tǒng)采用的是多級反饋隊(duì)列輪轉(zhuǎn)法。

      (4)時(shí)間片輪轉(zhuǎn)調(diào)度法

      當(dāng)兩個(gè)或兩個(gè)以上任務(wù)有同樣優(yōu)先級,內(nèi)核允許一個(gè)任務(wù)運(yùn)行事先確定的一段時(shí)間叫做時(shí)間額度quantum,然后切換給另一個(gè)任務(wù)也叫做時(shí)間片調(diào)度time slicing,內(nèi)核在滿足以下條件時(shí)把CPU 控制權(quán)交給下一個(gè)任務(wù)就緒態(tài)的任務(wù),當(dāng)前任務(wù)已無事可做,當(dāng)前任務(wù)在時(shí)間片還沒結(jié)束時(shí)已經(jīng)完成了。輪轉(zhuǎn)法主要是為分時(shí)系統(tǒng)設(shè)計(jì)的,其中時(shí)間片是一個(gè)重要的參數(shù)不能取的過大或過小,通常為10 至100ms 數(shù)量級,就緒隊(duì)列可以看成是一個(gè)環(huán)形隊(duì)列,CPU 調(diào)度程序輪流

      地把CPU 分給就緒隊(duì)列中地每個(gè)進(jìn)程,時(shí)間長度為一個(gè)時(shí)間片Linux 操作系統(tǒng)就是采用時(shí)間片輪轉(zhuǎn)的調(diào)度算法。

      (5)優(yōu)先級法

      優(yōu)先級調(diào)度的基本思想是,把當(dāng)前處于就緒隊(duì)列中優(yōu)先級最高的進(jìn)程投入運(yùn)行,而不管各進(jìn)程的下一個(gè)CPU周期的長短和其他因素。

      優(yōu)先級通常用0~4095的整數(shù)(稱為優(yōu)先數(shù))表示,是數(shù)大優(yōu)先級高還是數(shù)小優(yōu)先級高取決于規(guī)定。例如UNIX系統(tǒng)規(guī)定優(yōu)先數(shù)越大優(yōu)先級越低,優(yōu)先數(shù)越小優(yōu)先級越高。

      優(yōu)先數(shù)有靜態(tài)和動(dòng)態(tài)之分。靜態(tài)優(yōu)先數(shù)是指在進(jìn)程開始運(yùn)行之前便根據(jù)某種或某些因素(如估計(jì)運(yùn)行時(shí)間、主存需求量、打開文件個(gè)數(shù)、所付經(jīng)費(fèi)多少等)算定,而且該優(yōu)先數(shù)在進(jìn)程的整個(gè)生命周期內(nèi)一直不變。靜態(tài)優(yōu)先數(shù)方法雖然簡單,但有可能導(dǎo)致某些低優(yōu)先級的進(jìn)程無限期地等待。尤其在高優(yōu)先級的進(jìn)程不斷進(jìn)入就緒隊(duì)列的情況下,使等待CPU的低優(yōu)先級進(jìn)程更多,等待時(shí)間更長。動(dòng)態(tài)優(yōu)先數(shù)方法是按照某種原則使各進(jìn)程的優(yōu)先級隨著時(shí)間而改變。例如隨等待時(shí)間增大優(yōu)先級也跟著提高、隨著使用CPU時(shí)間的增長優(yōu)先級跟著下降,就是一種較好的策略。等待了較長時(shí)間的進(jìn)程,總會(huì)因其優(yōu)先級不斷地提高而被調(diào)度運(yùn)行。

      如果把進(jìn)入就緒隊(duì)列的次序作為計(jì)算進(jìn)程動(dòng)態(tài)優(yōu)先數(shù)的主要指標(biāo),那么優(yōu)先級法就變成FCFS。如果把下一個(gè)CPU周期最短作為計(jì)算進(jìn)程動(dòng)態(tài)優(yōu)先數(shù)的主要指標(biāo),那么優(yōu)先級法變成SBF,此時(shí)各進(jìn)程的優(yōu)先數(shù)p_pri = 1/ ti,其中ti是估算的下一個(gè)CPU周期的長度。

      優(yōu)先級調(diào)度也允許剝奪方式?,F(xiàn)在的許多操作系統(tǒng),例如UNIX系統(tǒng)V,Windows NT,OS/2等都采用優(yōu)先級剝奪調(diào)度。

      (6)多隊(duì)列反饋法

      其基本思想是,把就緒進(jìn)程按優(yōu)先級排成多個(gè)隊(duì)列,同隊(duì)列的進(jìn)程具有相同的時(shí)間片。高優(yōu)先級隊(duì)列的時(shí)間片比低優(yōu)先級隊(duì)列的小。調(diào)度時(shí)先從高優(yōu)先級隊(duì)列中選出某一進(jìn)程投入運(yùn)行,當(dāng)該進(jìn)程的時(shí)間片到期后則轉(zhuǎn)至低一級的就緒隊(duì)列中。只有高優(yōu)先級隊(duì)列為空時(shí)才從低一級隊(duì)列中調(diào)度進(jìn)程。

      例如考慮由3個(gè)隊(duì)列組成的多級隊(duì)列調(diào)度。3個(gè)隊(duì)列的編號分別為0, 1, 2,如圖所示。調(diào)度算法首先調(diào)度0號隊(duì)列中的進(jìn)程。當(dāng)0號隊(duì)列為空時(shí)才調(diào)度1號隊(duì)列中的進(jìn)程;當(dāng)0號與1號隊(duì)列都為空時(shí)才調(diào)度2號隊(duì)列中的進(jìn)程。在剝奪方式下,新進(jìn)入0號隊(duì)列的進(jìn)程將剝奪1號或2號隊(duì)列中正在執(zhí)行的進(jìn)程的CPU,而新進(jìn)入1號隊(duì)列的進(jìn)程將剝奪2號隊(duì)列中正在執(zhí)行的進(jìn)程的CPU。

      其實(shí),每個(gè)隊(duì)列都可擁有各自的調(diào)度算法,也可制定不同的“轉(zhuǎn)隊(duì)”規(guī)則。這樣看來,多隊(duì)列反饋調(diào)度算法能有多種變化。

      (7)輪轉(zhuǎn)法

      輪轉(zhuǎn)法就是按一定時(shí)間片(記為q)輪番運(yùn)行各個(gè)進(jìn)程。如果q是一個(gè)定值,則輪轉(zhuǎn)法是一種對各進(jìn)程機(jī)會(huì)均等的調(diào)度方法。

      輪轉(zhuǎn)法本質(zhì)上是剝奪的,因?yàn)橐惠唭?nèi),每個(gè)進(jìn)程不能獲得比一個(gè)時(shí)間片q更長的運(yùn)行時(shí)間。正是由于這一特點(diǎn),輪轉(zhuǎn)法特別適用于分時(shí)操作系統(tǒng)。

      輪轉(zhuǎn)法的關(guān)鍵問題是如何確定q的大小。如果時(shí)間片太大以致每個(gè)進(jìn)程的CPU周期都能在一個(gè)時(shí)間片內(nèi)完成,則輪轉(zhuǎn)法實(shí)際上脫化為FCFS。如果q太小以致CPU切換過于頻繁,則會(huì)增加CPU的額外開銷,降低了CPU的有效利用率。這是因?yàn)椋看蜟PU切換涉及到保存原運(yùn)行進(jìn)程的現(xiàn)場和恢復(fù)新運(yùn)行進(jìn)程的現(xiàn)場,這些操作一般需要10ms~100ms的時(shí)間。例如,設(shè)有一個(gè)CPU周期為10單位的進(jìn)程,在q取12,6,1時(shí)的調(diào)度次數(shù)分別為0,1,9。令時(shí)間單位為1ms(1ms=1000ms),1次調(diào)度的開銷為100ms,則在q=1時(shí)CPU的額外開銷和有效開銷之比為1:10,這是不容忽視的。

      (8)最短周期優(yōu)先

      最短周期優(yōu)先(SBF: shortest burst first)把當(dāng)前就緒隊(duì)列中的下一個(gè)CPU周期最短的那個(gè)進(jìn)程調(diào)度運(yùn)行。

      (9)先來先服務(wù)

      如果早就緒的進(jìn)程排在就緒隊(duì)列的前面,遲就緒的進(jìn)程排在就緒隊(duì)列的后面,那么先來先服務(wù)(FCFS: first come first service)總是把當(dāng)前處于就緒隊(duì)列之首的那個(gè)進(jìn)程調(diào)度到運(yùn)行狀態(tài)。也就說,它只考慮進(jìn)程進(jìn)入就緒隊(duì)列的先后,而不考慮它的下一個(gè)CPU周期的長短及其他因素。FCFS算法簡單易行,但性能卻不大好。

      四、實(shí)驗(yàn)程序

      #include “iostream.h”

      //define pcb typedef struct pcb { char name[10];//進(jìn)程名

      char state;//狀態(tài)w(就緒)r(運(yùn)行)f(結(jié)束)int id;//id號

      int super;//優(yōu)先級

      int ntime;//需運(yùn)行的時(shí)間 int rtime;//已運(yùn)行的時(shí)間 struct pcb *next;}*pcb1;

      pcb1 s,w;//define two publiced linknode ,one is s(ready queue),one is w(blocked queue)

      //initialize two queues void init(pcb1 &r){ r=NULL;//both queues is the kind of head index }

      //print the information of the ready queue void print(){pcb1 p;cout<<“您現(xiàn)在查看的是就緒隊(duì)列的信息:”;cout<<“進(jìn)程號 ”<<“進(jìn)程名 ”<<“優(yōu)先級 ”<<“狀態(tài)”<<“已運(yùn)行時(shí)間 ”<<“需運(yùn)行時(shí)間”<next){

      cout<

      id<<“ ”<

      name<<“ ”<

      super<<“ ”<

      state<<“ ”<

      rtime<<“ ”<

      ntime<

      //print the information of the blocked queue void print1(){pcb1 p;cout<<“您現(xiàn)在查看的是阻塞隊(duì)列的信息”;cout<<“進(jìn)程號 ”<<“進(jìn)程名 ”<<“優(yōu)先級 ”<<“狀態(tài) ”<<“已運(yùn)行時(shí)間 ”<<“需運(yùn)行時(shí)間”<next){ cout<

      id<<“ ”<

      name<<“ ”<

      super<<“ ”<

      state<<“ ”<

      rtime<<“ ”<

      ntime<

      //check the queue if empty int empty(pcb1 &r){ if(r==NULL)return 0;else return 1;}

      //check the first process of the ready queue if finshed int check(){ pcb1 p;p=s;if(p->rtime==p->ntime){ p->state='F';//if one process finshed then change ti's state cout<<“進(jìn)程”<

      id<<“ 已經(jīng)結(jié)束”<

      //sort process according to the super of the process and insert to the ready(blocked)queue void sort(pcb1 &r,pcb1 p){ pcb1 p1,p2;int in=0;if(r==NULL)//the queue is empty { r=p;} else { if(p->super>=r->super)//the super of the process which wait insert to the queue is highter than the super of the first process of the queue { p->next=r;r=p;} else { p1=r;p2=r->next;if(p2==NULL)//only one process in the queue { r->next=p;} else { while(in==0&&p2!=NULL)//insert to the middle of the queue { if(p->super>=p2->super){ p->next=p2;p1->next=p;in=1;} else { p1=p1->next;p2=p2->next;} } } if(in==0)//link to the last of ready queue

      p1->next=p;} } }

      //block one process and insert to block queue void block(){ if(empty(s)){ if(s->next==NULL){ sort(w,s);s=s->next;} else {

      pcb1 p1;p1=s;s=s->next;p1->next=NULL;sort(w,p1);} } else { cout<<“現(xiàn)在就緒隊(duì)列已經(jīng)為空,再?zèng)]有進(jìn)程需要阻塞”<

      //wake one process of block queue and insert to ready queue void wake(){ if(empty(w)){ pcb1 p1;p1=w;w=w->next;p1->next=NULL;sort(s,p1);}

      else { cout<<“阻塞隊(duì)列已經(jīng)為空,沒有進(jìn)程再需要喚醒”<

      //runing void runing(){ if(empty(s)){ pcb1 p;p=s;if(check())//check the first process of the queue if finished {//no s=s->next;p->rtime++;p->super--;p->next=NULL;sort(s,p);} else {//yes s=s->next;} } else { cout<<“就緒隊(duì)列已經(jīng)為空”<

      //creat process void input(){ pcb1 p2;p2=new pcb;cout<<“請輸入 進(jìn)程號、進(jìn)程名、進(jìn)程優(yōu)先級、需要運(yùn)行時(shí)間”;cin>>p2->id>>p2->name>>p2->super>>p2->ntime;p2->rtime=0;p2->state='W';p2->rtime=0;p2->next=NULL;

      sort(s,p2);}

      //main function void main(){ char ch;init(s);init(w);cout<<“*****************************進(jìn)程調(diào)度模擬程序開始*******************************”<>ch;switch(ch){ case 'c':input();break;case 'r':runing();break;case 's':print();break;case 'w':wake();break;case 'l':print1();break;case 'z':block();break;} } }

      程序運(yùn)行界面如下:

      五、實(shí)驗(yàn)總結(jié)

      本次實(shí)驗(yàn),我的任務(wù)是設(shè)計(jì)一個(gè)允許n個(gè)進(jìn)程并發(fā)運(yùn)行的進(jìn)程管理模擬系統(tǒng)。該系統(tǒng)包括有簡單的進(jìn)程控制、同步與通訊機(jī)構(gòu),系統(tǒng)在運(yùn)行過程中能顯示各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,從而觀察諸進(jìn)程的運(yùn)行過程及系統(tǒng)的管理過程,我是用C++寫的,在我的電腦能夠運(yùn)行通過,雖不能盡善盡美,但也基本能實(shí)現(xiàn)老師的要求。

      兩個(gè)星期程序設(shè)計(jì)課程,雖然時(shí)間有點(diǎn)短,但我也收獲不少,這次試驗(yàn),加深了我對進(jìn)程概念及進(jìn)程管理的理解;比較熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)、同步機(jī)構(gòu)及通訊機(jī)構(gòu)的實(shí)施。也讓我認(rèn)識到自己的不足,操作系統(tǒng)的有些知識,我知道的還不多,沒有掌握好,還需要多多學(xué)學(xué),不斷提升自己的能力。

      第五篇:操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告

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

      專業(yè):XXXXX 學(xué)號:XXXXX 姓名:XXX 實(shí)驗(yàn)日期:20XX年XX月XX日

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

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

      二、實(shí)驗(yàn)要求

      編寫程序?qū)崿F(xiàn)對5個(gè)進(jìn)程的調(diào)度模擬,要求至少采用兩種不同的調(diào)度算法分別進(jìn)行模擬調(diào)度。

      三、實(shí)驗(yàn)方法內(nèi)容

      1.算法設(shè)計(jì)思路

      將每個(gè)進(jìn)程抽象成一個(gè)控制塊PCB,PCB用一個(gè)結(jié)構(gòu)體描述。

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

      主要用到的技術(shù)是STL中的vector以維護(hù)和保存進(jìn)程容器、就緒容器、完成容器。

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

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

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

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

      m_FinishQueue;//完成隊(duì)列結(jié)束

      3.算法中用到的數(shù)據(jù)結(jié)構(gòu)

      struct fcfs{

      //先來先服務(wù)算法從這里開始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息

      4.主要的常量變量

      vector

      m_ProcessQueue;//進(jìn)程輸入隊(duì)列

      vector

      m_WaitQueue;//進(jìn)程就緒隊(duì)列 vector

      m_FinishQueue;//完成隊(duì)列 vector

      ::iterator m_iter;//迭代器 PCB m_runProcess;//運(yùn)行中的進(jìn)程

      int m_ProcessCount;//進(jìn)程數(shù) float m_RunTime;//運(yùn)行時(shí)間

      int m_tagIsRun;//是否在運(yùn)行標(biāo)志。表示正在運(yùn)行,表示沒有 float m_TimeSlice;//時(shí)間片大小

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

      5.主要模塊

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

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

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

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

      四、實(shí)驗(yàn)代碼

      #include #include #include

      using namespace std;

      struct fcfs{

      //先來先服務(wù)算法從這里開始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息

      fcfs a[100];

      void input(fcfs *p,int N)

      {

      int i;

      cout<

      printf(“

      請您輸入進(jìn)程的名字

      到達(dá)時(shí)間

      服務(wù)時(shí)間:(例如: a 0 100)nn”);

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

      {

      printf(“

      請您輸入進(jìn)程%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)用先來先服務(wù)算法以后進(jìn)程運(yùn)行的順序是: ”);

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

      for(k=1;k

      {

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

      }

      cout<

      printf(“n

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

      printf(“t進(jìn)程名

      到達(dá)時(shí)間

      服務(wù)時(shí)間

      開始時(shí)間

      結(jié)束時(shí)間

      周轉(zhuǎn)時(shí)間

      帶權(quán)周轉(zhuǎn)時(shí)間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();

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

      }

      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)

      //運(yù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();

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

      char name[10];float arrivetime;//到達(dá)時(shí)間

      float servicetime;//運(yùn)行時(shí)間

      float starttime;

      //開始時(shí)間

      float finishtime;

      //完成時(shí)間

      };sjf a1[100];

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

      int i;cout<

      printf(“

      請您輸入進(jìn)程的名字

      到達(dá)時(shí)間

      服務(wù)時(shí)間:(例如: a 0 100)n”);

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

      printf(“

      請您輸入進(jìn)程%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)//最終結(jié)果輸出

      {

      int k;

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

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

      for(k=1;k

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

      cout<

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

      printf(“nt進(jìn)程名t到達(dá)時(shí)間t運(yùn)行時(shí)間t開始時(shí)間t完成時(shí)間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)//運(yùn)行階段

      { 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();}//最短進(jìn)程優(yōu)先調(diào)度算法到這里結(jié)束

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

      {

      char cse1;

      while(1)

      {

      system(“cls”);

      fflush(stdin);

      cout<

      cout<

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

      cout<<“t”<<“||

      ||”<

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

      cout<<“t”<<“||

      ||”<

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

      cout<<“t”<<“||

      ||”<

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

      cout<<“t”<<“||

      ||”<

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

      cout<

      cout<

      cout<<“tt

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

      cse1=getchar();

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

      cout<<“你的輸入有錯(cuò)!”<

      else

      break;

      }

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

      while(1)

      {

      switch(menu())

      {

      case '1':

      int N;

      cout<

      cout<

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

      cout<

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

      scanf(“%d”,&N);

      input(a,N);

      FCFS(a,N);

      case '2':

      int N1;

      cout<

      cout<

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

      cout<

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

      scanf(“%d”,&N1);

      input(a1,N1);

      sjf *b=a1;

      sjf *c=a1;

      sjff(b,N1);

      getchar();

      }

      }

      system(“PAUSE”);

      return EXIT_SUCCESS;}

      五、實(shí)驗(yàn)結(jié)果

      1.執(zhí)行結(jié)果

      2.結(jié)果分析

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

      六、實(shí)驗(yàn)總結(jié)

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

      下載進(jìn)程創(chuàng)建實(shí)驗(yàn)報(bào)告word格式文檔
      下載進(jìn)程創(chuàng)建實(shí)驗(yàn)報(bào)告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


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

      相關(guān)范文推薦

        進(jìn)程的創(chuàng)建與銷毀

        一.實(shí)驗(yàn)?zāi)康?(1)加深對進(jìn)程概念的理解和進(jìn)程創(chuàng)建與撤消算法; (2)進(jìn)一步認(rèn)識并發(fā)執(zhí)行的實(shí)質(zhì)。 二.實(shí)驗(yàn)內(nèi)容 (1)進(jìn)程管理認(rèn)識:通過windows “任務(wù)管理器”觀察進(jìn)程的狀態(tài),進(jìn)行進(jìn)程的創(chuàng)建......

        計(jì)算機(jī)操作系統(tǒng)-司機(jī)與售票員的進(jìn)程問題-實(shí)驗(yàn)報(bào)告

        計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告 -------售票員和汽車司機(jī)的進(jìn)程同步問題 一、設(shè)計(jì)分析 司機(jī)與售票員要協(xié)同工作:一方面只有售票員把門關(guān)好之后司機(jī)才能開車,因此售票員關(guān)好門之后要......

        衛(wèi)生特色班級創(chuàng)建研究課題實(shí)驗(yàn)報(bào)告

        《“衛(wèi)生特色班級”創(chuàng)建研究》課題 實(shí) 驗(yàn) 報(bào) 告 一、 課題提出的背景、目的和意義 經(jīng)濟(jì)的發(fā)展,社會(huì)的進(jìn)步使人民生活水平得到了極大的提高。整個(gè)社會(huì)已經(jīng)實(shí)現(xiàn)了從溫飽到小康......

        推進(jìn)依法治校進(jìn)程創(chuàng)建平安和諧校園

        推進(jìn)依法治校進(jìn)程創(chuàng)建平安和諧校園 龍井鄉(xiāng)中心學(xué)校在平橋區(qū)教體局領(lǐng)導(dǎo)下,秉承“培養(yǎng)習(xí)慣,奠基未來”的辦學(xué)理念,遵循“依法治校、以德立校、質(zhì)量強(qiáng)?!钡霓k學(xué)思路,將“規(guī)范+特......

        進(jìn)程調(diào)度[★]

        操作系統(tǒng)課程設(shè)計(jì) 進(jìn) 程 調(diào) 度 實(shí) 踐 報(bào) 告姓名: 董宇超 班級:計(jì)算機(jī)一班 學(xué)號:0906010124 目錄: ? 實(shí)踐內(nèi)容 ? 實(shí)踐目的及意義 ? 功能設(shè)計(jì)及數(shù)據(jù)結(jié)構(gòu) ? 調(diào)試運(yùn)行及測設(shè)分析 ? 存在的......

        2013年度考核進(jìn)程

        大荊中學(xué)2013年度考核進(jìn)程 1、2014-3-5參加中心校2013年度考核工作會(huì)學(xué)習(xí)文件。 2、2013-3-7依照文件精神成立考核領(lǐng)導(dǎo)小組,制定學(xué)??己藢?shí)施方案。 3、2014-3-9全體教師會(huì)組......

        淺談城市化進(jìn)程

        【摘要】城市化是人類歷史長河中一個(gè)必然的過程,所謂城市化便是伴隨著經(jīng)濟(jì)增長、城市數(shù)量增加、城市人口比重上升、經(jīng)濟(jì)集中發(fā)展的過程。然而城市化進(jìn)程也并不一定是一直向前......

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

        《體育測量與評價(jià)》實(shí)驗(yàn)報(bào)告模板 課程名稱:體育測量與評價(jià) 實(shí)驗(yàn)名稱:ISAK全套人體測量指標(biāo)(共39項(xiàng))測試 一、預(yù)習(xí)報(bào)告 1.實(shí)驗(yàn)?zāi)康?①通過實(shí)驗(yàn)強(qiáng)化體格及身體成分測量的有關(guān)知......