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

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

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

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

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

      操作系統(tǒng)實(shí)驗(yàn)報(bào)告(讀者寫著問(wèn)題,時(shí)間片輪轉(zhuǎn)算法,內(nèi)存的分配,進(jìn)程的調(diào)度)[范文大全]

      時(shí)間:2019-05-12 03:06:25下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《操作系統(tǒng)實(shí)驗(yàn)報(bào)告(讀者寫著問(wèn)題,時(shí)間片輪轉(zhuǎn)算法,內(nèi)存的分配,進(jìn)程的調(diào)度)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《操作系統(tǒng)實(shí)驗(yàn)報(bào)告(讀者寫著問(wèn)題,時(shí)間片輪轉(zhuǎn)算法,內(nèi)存的分配,進(jìn)程的調(diào)度)》。

      第一篇:操作系統(tǒng)實(shí)驗(yàn)報(bào)告(讀者寫著問(wèn)題,時(shí)間片輪轉(zhuǎn)算法,內(nèi)存的分配,進(jìn)程的調(diào)度)

      小心

      計(jì)算機(jī)專業(yè)類課程

      實(shí)驗(yàn)報(bào)告 課程名稱:操作系統(tǒng) 學(xué)

      院:軟件學(xué)院 專

      業(yè):軟件工程 學(xué)生姓名:李 希

      學(xué)

      號(hào):2010231020018 指導(dǎo)教師:丁老師

      期: 2012年5月5日

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      電 子 科 技 大 學(xué)

      實(shí)

      驗(yàn)

      報(bào)

      實(shí)驗(yàn)一

      一、實(shí)驗(yàn)名稱: 進(jìn)程管理

      二、實(shí)驗(yàn)學(xué)時(shí):4

      三、實(shí)驗(yàn)內(nèi)容和目的: 實(shí)驗(yàn)內(nèi)容:(1)進(jìn)程的創(chuàng)建

      寫一段源程序,創(chuàng)建兩個(gè)進(jìn)程,當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示字符。觀察紀(jì)錄屏幕上的顯示結(jié)果,然后分析原因。(2)進(jìn)程的控制

      修改編寫的程序,將每個(gè)進(jìn)程輸出一個(gè)字符改為每個(gè)進(jìn)程輸出一句話,在觀察程序執(zhí)行時(shí)屏幕出現(xiàn)的現(xiàn)象,并分析原因。實(shí)驗(yàn)?zāi)康模?/p>

      (1)加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。

      (2)進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)。

      (3)分析進(jìn)程競(jìng)爭(zhēng)資源現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法。

      四、實(shí)驗(yàn)原理:

      利用fork函數(shù)來(lái)創(chuàng)建子進(jìn)程,并返回子進(jìn)程的ID號(hào)。

      利用lockf函數(shù)來(lái)實(shí)現(xiàn)信號(hào)量對(duì)進(jìn)程的資源競(jìng)爭(zhēng)的調(diào)度,和互斥的方法。

      五、實(shí)驗(yàn)器材(設(shè)備、元器件):

      一臺(tái)裝有VS2010的電腦,操作系統(tǒng)為WIN7.六、實(shí)驗(yàn)步驟:

      (1)先寫好2個(gè)子進(jìn)程程序,并且讓2個(gè)子程序在屏幕上分別打印出A,B(2)父進(jìn)程創(chuàng)建2個(gè)子進(jìn)程,并在屏幕上打印出C。(3)觀察進(jìn)程競(jìng)爭(zhēng)資源的現(xiàn)象。

      七、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析:

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心 子進(jìn)程A的代碼:

      #include #include using namespace std;int main(){

      cout<<“I'm Process A/n”<

      } 子進(jìn)程B的代碼:

      #include using namespace std;int main(){

      cout<<“I'm Process B”<

      //#include “stdafx.h” #include #include using namespace std;

      void print_error(){ DWORD nErrorNo = GetLastError();LPSTR lpBuffer;

      FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER

      FORMAT_MESSAGE_IGNORE_INSERTS |

      FORMAT_MESSAGE_FROM_SYSTEM,NULL,nErrorNo,LANG_NEUTRAL,(LPTSTR)& lpBuffer,0 , NULL);if(lpBuffer == NULL)

      |

      } { } printf(“%s(%d).n”, lpBuffer, nErrorNo);lpBuffer = “Sorry, cannot find this error info.”;int fork(const char* pszApplication,HANDLE& hProcess)

      {

      STARTUPINFO si={sizeof(si)};

      } void lockf(HANDLE hObj){

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

      HANDLE hProcess1,hProcess2;int child1=fork(“C:操¨′作á??系|ì統(tǒng)a3實(shí)o|ì驗(yàn)¨|ProcessADebugProcessA.exe”,hProcess1);if(-1==child1)

      } lockf(hProcess1);cout << “fork error!n”;return-1;{ case WAIT_OBJECT_0:

      } printf(“nProcess exit.n”);break;printf(“nTime out.n”);break;printf(“nWait Failed.n”);print_error();break;DWORD state = WaitForSingleObject(hObj,INFINITE);switch(state)PROCESS_INFORMATION pi;if(!CreateProcess(pszApplication,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){

      } hProcess=pi.hProcess;return pi.dwProcessId;return-1;else

      case WAIT_TIMEOUT: case WAIT_FAILED:

      {

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      } int child2=fork(“C:操¨′作á??系|ì統(tǒng)a3實(shí)o|ì驗(yàn)¨|ProcessBDebugProcessB.exe”,hProcess2);if(-1==child2){

      } cout<<“This is Process Cn”;lockf(hProcess2);return 0;cout << “fork error!n”;return-1;程序運(yùn)行的結(jié)果:

      八、實(shí)驗(yàn)結(jié)論、心得體會(huì)和改進(jìn)建議:

      實(shí)驗(yàn)結(jié)論:成功的通過(guò)了父進(jìn)程C來(lái)創(chuàng)建了2個(gè)子進(jìn)程A,B,并成功的對(duì)子進(jìn)程進(jìn)行了調(diào)度與管理。

      心得體會(huì):通過(guò)對(duì)進(jìn)程的創(chuàng)建,調(diào)度,更加深了我們對(duì)操作系統(tǒng)這門課的進(jìn)程的了解,而且也鍛煉了我們寫代碼的能力,和解決問(wèn)題的能力。

      改進(jìn)建議:對(duì)于我們大二沒(méi)有接觸過(guò)Windows編程的學(xué)生來(lái)說(shuō),可能一些Windows的API函數(shù)不夠了解,以至于比較難理解老師給出的參考代碼。所以我希望,老師以后可以先給我們大家簡(jiǎn)單的講解,介紹一下比較實(shí)用的Windows編程的API的函數(shù)。

      實(shí)驗(yàn)二

      一、實(shí)驗(yàn)名稱: 處理器調(diào)度

      二、實(shí)驗(yàn)學(xué)時(shí):4

      三、實(shí)驗(yàn)內(nèi)容和目的: 實(shí)驗(yàn)內(nèi)容:

      (1)假定系統(tǒng)有五個(gè)進(jìn)程,每一個(gè)進(jìn)程用一個(gè)進(jìn)程控制塊PCB來(lái)代表。

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心 PCB的格式為:

      其中,進(jìn)程名——作為進(jìn)程的標(biāo)識(shí),假設(shè)五個(gè)進(jìn)程的進(jìn)程名分別為1,2,3,4,5指針——進(jìn)程按順序排成循環(huán)隊(duì)列,用指針指出下一個(gè)進(jìn)程的進(jìn)程控制塊的首地址,最后一個(gè)進(jìn)程的指針指出第一個(gè)進(jìn)程的進(jìn)程控制塊首地址。要求運(yùn)行時(shí)間——假設(shè)進(jìn)程需要運(yùn)行的單位時(shí)間數(shù)。已運(yùn)行時(shí)間——假設(shè)進(jìn)程已經(jīng)運(yùn)行的單位時(shí)間數(shù),初始值為“0”。狀態(tài)——有兩種狀態(tài),“ready”和“end”,初始狀態(tài)都為“ready”,用“ready”表示。當(dāng)一個(gè)進(jìn)程運(yùn)行結(jié)束后,它的狀態(tài)為“end”,用“end”表示。

      (2)每次運(yùn)行所設(shè)計(jì)的處理器調(diào)度程序前,為每個(gè)進(jìn)程任意確定它的“要求運(yùn)行時(shí)間”。

      (3)把五個(gè)進(jìn)程按順序排成循環(huán)隊(duì)列,用指針指出隊(duì)列連接情況。另用一標(biāo)志單元記錄輪到運(yùn)行的進(jìn)程。例如,當(dāng)前輪到2執(zhí)行,則有:

      (4)處理器調(diào)度總是選擇標(biāo)志單元指示的進(jìn)程運(yùn)行。由于本實(shí)驗(yàn)是模擬處理器調(diào)度的功能,對(duì)被選中的進(jìn)程并不實(shí)際的啟動(dòng)運(yùn)行,而 是執(zhí)行:已運(yùn)行時(shí)間+1來(lái)模擬進(jìn)程的一次運(yùn)行,表示進(jìn)程運(yùn)行過(guò)一個(gè)單位的時(shí)間。

      (5)進(jìn)程運(yùn)行一次后,把該進(jìn)程的進(jìn)程控制塊中的指針值送到標(biāo)志單元,指示下一個(gè)輪到運(yùn)行的進(jìn)程。同時(shí)應(yīng)判斷該進(jìn)程的要求運(yùn)行時(shí)間與已運(yùn)行時(shí)間,若該進(jìn)程的要求運(yùn)行時(shí)間?已運(yùn)行時(shí)間,則表示它尚未執(zhí)行結(jié)束,應(yīng)待到下一輪時(shí)再運(yùn)行。若該進(jìn)程的要求運(yùn)行時(shí)間等于已運(yùn)行時(shí)間,則表示它已經(jīng)執(zhí)行結(jié)束,應(yīng)把它的狀態(tài)修改成“結(jié)束”(end)且退出隊(duì)列。此時(shí),應(yīng)把該進(jìn)程的進(jìn)程控制塊中的指針值送到前面一個(gè)進(jìn)程的指針位置。

      (6)若“ready”狀態(tài)的進(jìn)程隊(duì)列不為空,則重復(fù)上面的(4)和(5)

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心 的步驟,直到所有的進(jìn)程都成為“ready”狀態(tài)。

      (7)在所設(shè)計(jì)的程序中 應(yīng)有顯示或打印語(yǔ)句,能顯示或打印 每次選中進(jìn)程的進(jìn)程名以 及運(yùn)行一次后進(jìn)程 隊(duì)列的變化。

      (8)為N個(gè)進(jìn)程任意確定一組“要求運(yùn)行時(shí)間”,啟動(dòng)所設(shè)計(jì)的處理器調(diào)度程序,顯示或打印逐次被選中的進(jìn)程名以及進(jìn)程控制塊的動(dòng)態(tài)變化過(guò)程。實(shí)驗(yàn)?zāi)康模?/p>

      在用多道程序設(shè)計(jì)的系統(tǒng)中,往往有若干個(gè)進(jìn)程同時(shí)處于就緒狀態(tài)。所以當(dāng)就緒進(jìn)程個(gè)數(shù)大于處理器數(shù)時(shí),就必須依照某種策略來(lái)決定哪些進(jìn)程優(yōu)先占用CPU。本實(shí)驗(yàn)?zāi)M在單處理器情況下的處理器調(diào)度,加深了解處理器調(diào)度的工作。

      四、實(shí)驗(yàn)原理:

      定義進(jìn)程PCB結(jié)構(gòu)體。并用采用C++中的指針形成循環(huán)鏈表,并對(duì)鏈表中的結(jié)構(gòu)進(jìn)行操作。來(lái)模仿時(shí)間片輪轉(zhuǎn)的進(jìn)程調(diào)度。

      五、實(shí)驗(yàn)器材(設(shè)備、元器件): 一臺(tái)裝有VS2010的電腦,操作系統(tǒng)為WIN7.六、實(shí)驗(yàn)步驟:(1)定義結(jié)構(gòu)體PCB:里面有進(jìn)程的編號(hào),執(zhí)行需要的時(shí)間,和已經(jīng)運(yùn)行時(shí)間,還有進(jìn)程的狀態(tài)信息。

      (2)定義循環(huán)的單鏈表,來(lái)使結(jié)構(gòu)都串聯(lián)起來(lái)。

      (3)使用時(shí)間片輪轉(zhuǎn)的方法來(lái)動(dòng)態(tài)地進(jìn)行進(jìn)程模擬的調(diào)度。(4)如果所有的進(jìn)程都執(zhí)行完畢,則退出程序。

      七、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析: 實(shí)驗(yàn)程序的代碼如下:

      #include #include using namespace std;

      struct Process{

      };

      struct Process *CreateList(int n)//初始化鏈表,并返回指向鏈表頭的指針 {

      struct Process *head=NULL,*tail=NULL;for(int i=1;i<=n;i++){

      if(i==1){

      head=new Process;tail=head;head->Name=i;head->RunTime=0;int Name;string Statu;int NeedTime;int RunTime;Process *Next;

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      }

      } head->Statu=“Ready”;cout<<“請(qǐng)輸入”<>tail->NeedTime;} if(i!=1&&i!=n){

      tail->Next=new Process;tail=tail->Next;tail->Name=i;tail->RunTime=0;tail->Statu=“Ready”;cout<<“請(qǐng)輸入¨2”<>tail->NeedTime;} if(i==n){

      } tail->Next=new Process;tail=tail->Next;tail->Next=head;tail->Name=i;tail->RunTime=0;tail->Statu=“Ready”;cout<<“請(qǐng)輸入¨2”<>tail->NeedTime;tail=head;return tail;void Run(struct Process *tail,int ProcessNum)//時(shí)間片輪轉(zhuǎn) {

      while(ProcessNum!=0){ if((tail->RunTime!=tail->NeedTime))

      {

      cout<<“進(jìn)程”<Name<<“ 正在運(yùn)行n”;cout<<“需要運(yùn)行時(shí)間”<NeedTime<<“n”;cout<<“已經(jīng)運(yùn)行時(shí)間”<RunTime<<“n”;cout<<“進(jìn)程的狀態(tài)”<Statu<<“n”;cout<<“******************************”<<“n”;cout<<“******************************”<<“n”;cout<<“******************************”<<“n”;

      if(tail->RunTime==tail->NeedTime)

      {

      tail->RunTime++;

      if(tail->Statu==“Ready”){ tail->Statu=“End”;

      ProcessNum--;

      }

      }

      tail=tail->Next;

      }

      else

      {

      tail=tail->Next;

      } }

      }

      int main(){ struct Process * runtail;runtail=NULL;int n;int ProcessNum;cout<<“請(qǐng)輸入進(jìn)程的個(gè)數(shù)”;cin>>n;ProcessNum=n;runtail=CreateList(n);Run(runtail,ProcessNum);getchar();getchar();} 實(shí)驗(yàn)結(jié)果:

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      八、實(shí)驗(yàn)結(jié)論、心得體會(huì)和改進(jìn)建議:

      實(shí)驗(yàn)結(jié)論:成功的采用鏈表的形式,用指針,模仿了時(shí)間片輪轉(zhuǎn)算法,完成了實(shí)驗(yàn)的要求,達(dá)到了實(shí)驗(yàn)的目的。

      心得體會(huì):通過(guò)本次實(shí)驗(yàn)加深了我們對(duì)時(shí)間輪轉(zhuǎn)算法的印象,并且鍛煉了我們的動(dòng)手能力,還溫習(xí)了一下C++中一些編程的知識(shí)。

      改進(jìn)建議:我覺(jué)得時(shí)間片算法可能過(guò)于簡(jiǎn)單了,其實(shí)我們可以在時(shí)間片算法的基礎(chǔ)上再增加一些功能,比如在時(shí)間片算法上增加優(yōu)先級(jí)這個(gè)屬性,這樣不僅加大了實(shí)驗(yàn)的難度,還可以讓同學(xué)們對(duì)優(yōu)先級(jí)調(diào)度有一種更直觀,更深刻的了解。

      實(shí)驗(yàn)三

      一、實(shí)驗(yàn)名稱:主存儲(chǔ)器空間的分配與回收

      二、實(shí)驗(yàn)學(xué)時(shí):4

      三、實(shí)驗(yàn)內(nèi)容和目的:

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

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心 分頁(yè)式管理方式采用位示圖來(lái)表示主存分配情況,實(shí)現(xiàn)主存空間的分配和回收。

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

      一個(gè)好的計(jì)算機(jī)系統(tǒng)不僅要有一個(gè)足夠容量的、存取速度高的、穩(wěn)定可靠的主存儲(chǔ)器,而且要能合理地分配和使用這些存儲(chǔ)空間。

      當(dāng)用戶提出申請(qǐng)存儲(chǔ)器空間時(shí),存儲(chǔ)管理必須根據(jù)申請(qǐng)者的要求,按一定的策略分析主存空間的情況,找出足夠的空閑區(qū)域分配給申請(qǐng)者。當(dāng)作業(yè)撤離或主動(dòng)歸還主存資源時(shí),則存儲(chǔ) 管理要收回作業(yè)占用的主存空間或歸還部分主存空間。主存的分配和回收的實(shí)現(xiàn)雖與主存儲(chǔ)器的管理方式有關(guān)的。

      通過(guò)本實(shí)驗(yàn)幫助學(xué)生理解在不同的存儲(chǔ)管理方式下應(yīng)怎樣實(shí)現(xiàn)主存空間的回收和分配。

      四、實(shí)驗(yàn)原理:

      (1)分頁(yè)式存儲(chǔ)器把主存分成大小相等的若干塊,作業(yè)的信息也按塊的大小分頁(yè),作業(yè)裝入主存時(shí)可把作業(yè)的信息按頁(yè)分散存放在主存的空閑塊中,為了說(shuō)明主存中哪些塊已經(jīng)被占用,哪些塊是尚未分配的空閑塊,可用一張位示圖來(lái)指出。位示圖可由若干存儲(chǔ)單元來(lái)構(gòu)成,其中每一位與一個(gè)物理塊對(duì)應(yīng),用0/1表示對(duì)應(yīng)塊為空閑/已占用。(2)設(shè)某系統(tǒng)主存被分成大小相等的64塊,則位示圖可用8*8個(gè)字節(jié)來(lái)構(gòu)成,另用一單元記錄當(dāng)前空閑塊數(shù)。若已有第0,1,4,5,6,9,11,13,24,31,共10個(gè)主存塊被占用了,那么位示圖情況如下:

      (3)當(dāng)裝入一個(gè)作業(yè)時(shí),根據(jù)作業(yè)對(duì)主存的需要量,先查當(dāng)前空閑塊數(shù)是否能滿足作業(yè)要求,若不能滿足則輸出分配不成功。若能滿足,則查位示圖,找出為“0”的一些位,置上占用標(biāo)志“1”,并且從“當(dāng)前空閑塊數(shù)”中減去本次任務(wù)占用塊數(shù)。然后按找到的計(jì)算出對(duì)應(yīng)的塊號(hào): 其計(jì)算公式為: 塊號(hào)= j*8+i 其中,j表示找到的是第n個(gè)字節(jié),i表示對(duì)應(yīng)的是第n位。根據(jù)分配給作業(yè)的塊號(hào),為作業(yè)建立一張頁(yè)表,頁(yè)表格式:

      (4)當(dāng)作業(yè)執(zhí)行結(jié)束,歸還主存時(shí),根據(jù)該作業(yè)的頁(yè)表可以知道應(yīng)歸還的塊號(hào)。

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心 由塊號(hào)可計(jì)算出在位示圖中的對(duì)應(yīng)位置,把對(duì)應(yīng)位的占用標(biāo)志清成“0”,表示對(duì)應(yīng)的塊已成為空閑塊。歸還的塊數(shù)加入到當(dāng)前空閑塊數(shù)中。由塊號(hào)計(jì)算在位示圖中的位置的公式如下:

      字節(jié)號(hào) j=[塊號(hào)/8]([ ]表示取整)

      位數(shù) i={塊號(hào)/8}({ }表示取余)

      (5)設(shè)計(jì)實(shí)現(xiàn)主存分配和回收的程序。假定位示圖的初始狀態(tài)如(2)所述,現(xiàn)

      有一信息量為N頁(yè)的作業(yè)要裝入,運(yùn)行你所設(shè)計(jì)的分配程序,為作業(yè)分配主存且建立頁(yè)表(格式如(3)所述)。

      五、實(shí)驗(yàn)器材(設(shè)備、元器件): 一臺(tái)裝有VS2010的電腦,操作系統(tǒng)為WIN7.六、實(shí)驗(yàn)步驟:

      (1)先創(chuàng)建一個(gè)8*8的數(shù)組,用來(lái)保存內(nèi)存的信息。并初始化好值,用1來(lái)表示已經(jīng)分配,用0來(lái)表示還沒(méi)有分配。

      (2)創(chuàng)建一個(gè)Sum函數(shù),來(lái)對(duì)內(nèi)存中沒(méi)有分配的內(nèi)存?zhèn)€數(shù)進(jìn)行統(tǒng)計(jì),并返回一個(gè)int類型的數(shù)值,來(lái)表示沒(méi)有分配的內(nèi)存的大小、(3)創(chuàng)建一個(gè)分配內(nèi)存的函數(shù),先判斷需求的內(nèi)存的大小是否小于內(nèi)存空閑的大小。如果能夠滿足要求,則將相應(yīng)的內(nèi)存空間修改為1,表示已經(jīng)分配。(4)創(chuàng)建一個(gè)打印內(nèi)存頁(yè)表的函數(shù),根據(jù)內(nèi)存的實(shí)際情況,如果為1,則打印輸出,最后在屏幕上打印出所有的空閑頁(yè)表。

      (5)創(chuàng)建主函數(shù),并對(duì)相應(yīng)的函數(shù)進(jìn)行調(diào)用,便可成功的模仿內(nèi)存的調(diào)度。

      七、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析: 具體的代碼如下:

      #include using namespace std;

      void Print(int Table[8][8])//顯示內(nèi)存

      }

      int Sum(int Table[8][8])//計(jì)算內(nèi)存的剩余量 {

      int n=0;for(int j=0;j<8;j++)

      {

      } {

      cout<<“分配內(nèi)存后最新的內(nèi)存情況如下表”<

      cout<<“ ”<<0<<“ ”<<1<<“ ”<<2<<“ ”<<3<<“ ”<<4<<“ ”<<5<<“ ”<<6<<“ ”<<7<<“n”;

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

      cout<

      for(int k=0;k<8;k++)

      {

      cout<<“ ”<

      }

      cout<<“n”;

      {

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      }

      for(int k=0;k<8;k++)

      {

      if(Table[j][k]==0)

      {

      n++;

      }

      }

      } return n;void Manage(int Table [8][8],int Need)//分配內(nèi)存 {

      }

      void YeBiao(int Table [8][8])//打印空閑頁(yè)表 {

      cout<<“分配后空閑內(nèi)存的頁(yè)表”<

      ”<<“塊號(hào)”<

      {

      for(int k=0;k<8;k++)

      {

      if(Table [j][k]==0)

      {

      h=8*j+k;

      cout<

      ”<

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

      {

      }

      for(int k=0;k<8;k++)

      {

      if(Table [j][k]==0&&Need!=0)

      {

      }

      Table [j][k]=1;

      Need--;

      }

      }

      }

      }

      }

      } int main(){

      cout<<“請(qǐng)輸入你要分配的塊數(shù)”;cin>>Need;while(Need>Va){

      } Manage(Table,Need);Print(Table);cout<<“對(duì)不起沒(méi)有足夠內(nèi)存,請(qǐng)重新輸入n”;cin>>Need;int Table[8][8];int Va,Need;for(int i=0;i<8;i++)//初始化頁(yè)表 {

      } Table[0][0]=1;Table[0][1]=1;Table[0][4]=1;Table[0][5]=1;Table[0][6]=1;Table[1][1]=1;Table[1][3]=1;Table[1][5]=1;Table[3][0]=1;Table[3][7]=1;Print(Table);Va=Sum(Table);cout<<“n”<<“現(xiàn)在有”<

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      YeBiao(Table);

      } getchar();getchar();(1)若申請(qǐng)的內(nèi)存數(shù)過(guò)大。

      (2)申請(qǐng)的內(nèi)存為45:

      八、實(shí)驗(yàn)結(jié)論、心得體會(huì)和改進(jìn)建議:

      實(shí)驗(yàn)結(jié)論:達(dá)到了實(shí)驗(yàn)的要求與目的,完成了對(duì)內(nèi)存分配的模擬。

      心得體會(huì):通過(guò)本次實(shí)驗(yàn),我加深了采用頁(yè)表的方式來(lái)管理內(nèi)存的印象,鍛煉了自己C++的編程能力,和獨(dú)立解決問(wèn)題的能力。

      改進(jìn)建議:實(shí)驗(yàn)中并沒(méi)有要求對(duì)內(nèi)存空間清理,刪除的功能,我希望老師能加上對(duì)內(nèi)存緊湊,清理,刪除這些功能的模擬,這樣可以使我們所學(xué)的知識(shí)更有用武之地。

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      實(shí)驗(yàn)四

      一、實(shí)驗(yàn)名稱: 讀者寫者問(wèn)題

      二、實(shí)驗(yàn)學(xué)時(shí):4

      三、實(shí)驗(yàn)內(nèi)容和目的: 實(shí)驗(yàn)內(nèi)容:

      可用于解決多個(gè)進(jìn)程共享一個(gè)數(shù)據(jù)區(qū)(文件、內(nèi)存區(qū)、一組寄存器等),其中若干讀進(jìn)程只能讀數(shù)據(jù),若干寫進(jìn)程只能寫數(shù)據(jù)等實(shí)際問(wèn)題 讀者和寫者應(yīng)滿足的條件:(1)允許多個(gè)讀者可以同時(shí)讀文件

      (2)不允許多個(gè)寫者同時(shí)寫文件,只能互斥寫文件(3)當(dāng)寫進(jìn)程在寫時(shí)不能讀

      (4)讀者優(yōu)先: 指一旦有讀者正在讀數(shù)據(jù),允許多個(gè)讀者同時(shí)進(jìn)入讀數(shù)據(jù),只有當(dāng)全部讀者退出,才允許寫者進(jìn)入寫數(shù)據(jù)。

      (5)寫者優(yōu)先:指只要有一個(gè)寫者申請(qǐng)寫數(shù)據(jù),則不再允許新的讀者進(jìn)入讀數(shù)據(jù)

      實(shí)驗(yàn)?zāi)康模?通過(guò)本實(shí)驗(yàn)對(duì)讀者寫者的模擬,讓我們對(duì)操作系統(tǒng)中讀者寫著問(wèn)題的解決有一個(gè)加深的影響,并學(xué)會(huì)使用一些模擬簡(jiǎn)單的信號(hào)量的方法,來(lái)解決一些比較經(jīng)典的讀者寫著的問(wèn)題。

      四、實(shí)驗(yàn)原理:

      (1)為了模擬讀者寫著的問(wèn)題,因?yàn)樽约旱腃++技術(shù)不夠深厚,于是用Java中的線程來(lái)進(jìn)行模擬、采用輸入輸出流來(lái)對(duì)文本文件Test.txt進(jìn)行操作。(2)要實(shí)現(xiàn)寫著互斥的寫文件,這里只需要將線程中的Run方法定義為synchronized,就可以實(shí)現(xiàn)寫著互斥的寫文件、(3)引入一個(gè)couter類,并對(duì)counter類中的成員進(jìn)行維護(hù),若有讀者讀數(shù)據(jù),則對(duì)counter內(nèi)的reader++,寫者同理。

      (4)讀者寫著不同的優(yōu)先級(jí),可以通過(guò)依賴counter類來(lái)實(shí)現(xiàn)。在進(jìn)行文件讀寫操作時(shí),先判斷是否有讀者/寫者。

      五、實(shí)驗(yàn)器材(設(shè)備、元器件): 一臺(tái)裝有eclipse,和Win7的個(gè)人PC。

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

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心(1)定義讀者,寫者類并繼承Thread類,在其中的Run方法中調(diào)用輸入輸出流來(lái),讀寫文件

      (2)創(chuàng)建counter類,來(lái)對(duì)讀者,寫者進(jìn)行計(jì)數(shù)。

      (3)在主函數(shù)中創(chuàng)建讀者寫者,并調(diào)用相應(yīng)的Run方法,并觀察實(shí)驗(yàn)的結(jié)果。

      七、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析:

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

      import java.util.Scanner;

      public class ReadAndWrite { public static void main(String []arg){ Scanner in= new Scanner(System.in);System.out.println(“請(qǐng)選擇模擬的情況:1為讀者優(yōu)先。2為寫者優(yōu)先”);int Situation;Situation = in.nextInt();if(Situation==2)//寫者優(yōu)先 { Writer w1=new Writer(1);w1.start();Reader r2=new Reader(2);r2.start();Writer w2=new Writer(2);w2.start();

      } else//讀者優(yōu)先 { Reader1 r1=new Reader1(1);r1.start();Reader1 r2=new Reader1(2);r2.start();Writer1 w2=new Writer1(2);w2.start();

      } }

      } class Counter { static int WriterCounter=0;static int ReaderCounter=0;}

      class Writer extends Thread//寫者優(yōu)先 {

      int WriteNum;Writer(int WriteNum){

      this.WriteNum=WriteNum;}

      synchronized public void run(){

      Counter.WriterCounter++;

      System.out.println(“now Writer”+“ ”+WriteNum+“ ”+“is Writing”);

      for(int i=0;i<10;i++){

      System.out.println(“********************************”);

      }

      Counter.WriterCounter--;} }

      class Writer1 extends Thread {

      int WriteNum;Writer1(int WriteNum){

      this.WriteNum=WriteNum;}

      synchronized public void run(){

      if(Counter.ReaderCounter==0)

      {

      Counter.WriterCounter++;

      System.out.println(“now Writer”+“ ”+WriteNum+“ ”+“is Writing”);

      for(int i=0;i<10;i++){

      System.out.println(“********************************”);

      }

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心

      Counter.WriterCounter--;

      }

      else

      {

      System.out.println(“Now File is Reading,Writer can't Write”);

      try{

      sleep(1000);

      }catch(Exception ex)

      {

      ex.printStackTrace();

      }

      System.out.println(“********************************”);

      System.out.println(“Writer is Writing”);

      } } } class Reader extends Thread {

      int ReadNum;Reader(int ReadNum){

      this.ReadNum=ReadNum;}

      public void run(){

      if(Counter.WriterCounter==0)

      {

      Counter.ReaderCounter++;

      System.out.println(“now Reader”+“ ”+ReadNum+“ ”+“is Reading”);

      for(int i=0;i<10;i++){

      System.out.println(“********************************”);

      }

      Counter.ReaderCounter--;

      }

      else

      {

      System.out.println(“now File is Writing,Reader can't Read”);

      try{

      sleep(1000);

      }catch(Exception ex)

      {

      ex.printStackTrace();

      }

      System.out.println(“********************************”);

      System.out.println(“Reader is Reading”);

      } } } class Reader1 extends Thread//讀者優(yōu)先 {

      int ReadNum;Reader1(int ReadNum){

      this.ReadNum=ReadNum;}

      public void run(){

      Counter.ReaderCounter++;

      System.out.println(“now Reader”+“ ”+ReadNum+“ ”+“is Reading”);

      for(int i=0;i<10;i++){

      System.out.println(“********************************”);

      }

      Counter.ReaderCounter--;

      } } 實(shí)驗(yàn)的結(jié)果:(1)讀者優(yōu)先:

      電子科技大學(xué)計(jì)算機(jī)學(xué)院實(shí)驗(yàn)中心(2)寫者優(yōu)先:

      八、實(shí)驗(yàn)結(jié)論、心得體會(huì)和改進(jìn)建議:

      實(shí)驗(yàn)結(jié)論:基本完成了實(shí)驗(yàn)的要求,實(shí)現(xiàn)了對(duì)經(jīng)典的讀者寫著問(wèn)題的解決。心得體會(huì):通過(guò)本次實(shí)驗(yàn),加深了我對(duì)讀者寫著問(wèn)題的理解,學(xué)會(huì)了用軟件模擬的辦法來(lái)實(shí)現(xiàn)一些簡(jiǎn)單的信號(hào)量對(duì)讀者寫者的控制,并且鍛煉了自己Java編程的能力,和獨(dú)立解決問(wèn)題的能力

      改進(jìn)建議:實(shí)際上,對(duì)于讀者寫者的問(wèn)題,我們有多種解決辦法,在這里我們只是模擬了一下軟件編程的方法,還有一些方法,比如信號(hào)量,中斷屏蔽等方法,還沒(méi)有模擬,所以希望在以后的實(shí)驗(yàn)中可以增加一些對(duì)這些方法的模擬,以加深我們對(duì)讀者寫者問(wèn)題的理解。

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

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

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

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

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

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

      編寫程序?qū)崿F(xiàn)對(duì)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();//先來(lái)先服務(wù)void SJF();//最短進(jìn)程優(yōu)先調(diào)度void RR();//簡(jiǎn)單時(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í)間下,有無(wú)進(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)度過(guò)程:

      開始為空判斷就緒隊(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();//先來(lái)先服務(wù)void SJF();//最短進(jìn)程優(yōu)先調(diào)度void RR();//簡(jiǎn)單時(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{

      //先來(lái)先服務(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)行,表示沒(méi)有 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();//對(duì)進(jìn)程控制塊按照優(yōu)先級(jí)排序(采用冒泡排序)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í)間下,有無(wú)進(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();//先來(lái)先服務(wù) void SJF();//最短進(jìn)程優(yōu)先調(diào)度 void RR();//簡(jiǎn)單時(shí)間片輪轉(zhuǎn) void PD();//最高優(yōu)先數(shù)優(yōu)先 加.以等待新的進(jìn)程到來(lái)

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

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

      #include #include #include

      using namespace std;

      struct fcfs{

      //先來(lái)先服務(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(“

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

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

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

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

      {

      printf(“

      請(qǐng)您輸入進(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)用先來(lái)先服務(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é)果只是一閃而過(guò)的一個(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();

      } //先來(lái)先服務(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(“

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

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

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

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

      printf(“

      請(qǐng)您輸入進(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()//用來(lái)輸出相關(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.先來(lái)先服務(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

      請(qǐng)輸入您的選擇(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<<---!!@@@先來(lái)先服務(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é)果分析

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

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

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

      第三篇:短作業(yè)優(yōu)先調(diào)度和時(shí)間片輪轉(zhuǎn)調(diào)度算法

      實(shí)

      驗(yàn)

      報(bào)

      學(xué)生姓名:

      學(xué) 號(hào):

      指導(dǎo)教師:

      一、實(shí)驗(yàn)室名稱:

      二、實(shí)驗(yàn)項(xiàng)目名稱:進(jìn)程調(diào)度算法的設(shè)計(jì)

      三、實(shí)驗(yàn)原理:

      短作業(yè)(進(jìn)程)優(yōu)先調(diào)度算法:短作業(yè)調(diào)度算法是從后備隊(duì)列中選擇一個(gè)或者若干個(gè)估計(jì)運(yùn)行時(shí)間最短的作業(yè),將他們調(diào)入內(nèi)存運(yùn)行。而短進(jìn)程優(yōu)先調(diào)度算法則是從就緒隊(duì)列中選出一個(gè)估計(jì)運(yùn)行時(shí)間最短的進(jìn)程,將處理機(jī)分配給它,使它立即執(zhí)行并一直執(zhí)行到完成,或者發(fā)生某事件而被阻塞放棄處理機(jī)時(shí)再重新調(diào)度。

      時(shí)間片輪轉(zhuǎn)法:系統(tǒng)將所有的就緒進(jìn)程按先來(lái)先服務(wù)的原則排成一個(gè)隊(duì)列,每次調(diào)度時(shí),把CPU分配給隊(duì)首進(jìn)程,并令其執(zhí)行一個(gè)時(shí)間片。當(dāng)執(zhí)行的時(shí)間片用完時(shí),由一個(gè)計(jì)時(shí)器發(fā)出時(shí)鐘中斷請(qǐng)求,調(diào)度程序便據(jù)此信號(hào)來(lái)停止該進(jìn)程的執(zhí)行,并將它送往就緒隊(duì)列的隊(duì)尾;然后,再把處理機(jī)分配給就緒隊(duì)列中的新的隊(duì)首進(jìn)程,同時(shí)也讓它執(zhí)行一個(gè)時(shí)間片。這樣就可以保證就緒隊(duì)列中的所有進(jìn)程在一個(gè)給定的時(shí)間內(nèi)均能獲得一時(shí)間片的處理機(jī)執(zhí)行時(shí)間。

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

      通過(guò)對(duì)進(jìn)程調(diào)度算法的設(shè)計(jì),深入理解進(jìn)程調(diào)度的原理

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

      1.編寫程序?qū)崿F(xiàn)SJ(P)F算法 2.編寫程序?qū)崿F(xiàn)RR算法

      六、實(shí)驗(yàn)器材(設(shè)備、元器件):

      裝有VC++6.0的PC機(jī)一臺(tái)

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

      1.打開VC,設(shè)計(jì)編寫程序的源代碼 2.編譯運(yùn)行程序的源代碼

      3.分析檢驗(yàn)程序的結(jié)果是否正確 4.總結(jié)實(shí)驗(yàn)結(jié)果及結(jié)論

      短進(jìn)程優(yōu)先調(diào)度源代碼: #include “stdio.h” struct sjf{ char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};sjf a[100];void input(sjf *p,int N){ int i;printf(“intput the process's name & arrivetime & servicetime:nfor exmple: a 0 100n”);for(i=0;i<=N-1;i++){ printf(“input the %dth process's information:n”,i+1);scanf(“%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);} } void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;

      printf(“run order:”);

      printf(“%s”,p[0].name);for(k=1;k%s”,p[k].name);}

      printf(“nthe process's information:n”);

      printf(“nnametarrivetservicetstarttfinishtzztdqzzn”);

      for(k=0;k<=N-1;k++){ printf(“%st%-.2ft%-.2ft%-.2ft%-.2ft%-.2ft%-.2ftn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);} } //排序

      void sort(sjf *p,int N){

      for(int i=0;i<=N-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;

      } } //運(yùn)行階段

      void deal(sjf *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 sjff(sjf *p,int N){float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;//對(duì)結(jié)構(gòu)進(jìn)行初始化 sort(p,N);

      for(int m=0;m

      {if(m==0)

      p[m].finishtime=p[m].arrivetime+p[m].servicetime;

      else

      p[m].finishtime=p[m-1].finishtime+p[m].servicetime;

      int i=0;

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

      {if(p[n].arrivetime<=p[m].finishtime)//判斷內(nèi)存中每次完成之后有多少到達(dá)的進(jìn)程

      i++;

      }

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

      int next=m+1;//m+1=n

      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,zztime,dqzztime,N);

      Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);} void main(){ int N;

      printf(“------短作業(yè)優(yōu)先調(diào)度算法------n”);

      printf(“input the process's number:n”);

      scanf(“%d”,&N);

      input(a,N);

      sjf *b=a;

      sjf *c=a;

      sjff(b,N);}

      時(shí)間片輪轉(zhuǎn)法源代碼: #include #define M 5

      //物理頁(yè)數(shù) #define printf(“|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|n”)typedef struct PCB { int ID;int ReachTime;int TotalTime;}PCB;//進(jìn)程號(hào),到達(dá)時(shí)間和服務(wù)時(shí)間 typedef struct NOTE //備份 {

      Myprintf int ID;int TotalTime;}NOTE;

      PCB A[M];//5個(gè)進(jìn)程 PCB a[M];NOTE temp;int queue[50];//記錄調(diào)度的進(jìn)程 int K=0;//調(diào)度進(jìn)程數(shù)組的標(biāo)識(shí) void INIT()//初始化 { int i;for(i=0;i

      A[i].ID=-1;} } int GetNum()//計(jì)算進(jìn)程數(shù) { int i,j=0;for(i=0;i

      if(A[i].ID!=-1)

      {

      j++;

      } } return j;} int GetReach(int time)//找出到達(dá)進(jìn)程號(hào) { int i;for(i=0;i

      if(a[i].ReachTime<=time)

      {

      a[i].ReachTime=100;

      return i;

      } } return-1;} int GetInsert()//找出插入位置 { int i;for(i=0;i

      if(A[i].ID==-1)

      return i;} return-1;} void Forward(int num)//前移 { int i;for(i=0;i

      A[i].ID=A[i+1].ID;

      A[i].TotalTime=A[i+1].TotalTime;} A[num-1].ID=-1;} void Process()//執(zhí)行進(jìn)程 { queue[K]=A[0].ID;K++;A[0].TotalTime--;temp.ID=A[0].ID;temp.TotalTime=A[0].TotalTime;} void main(){ int i;int time;int t=0;int reach;int insert;int num;printf(“RR算法nn”);INIT();for(i=0;i

      printf(“請(qǐng)輸入進(jìn)程ID:”);

      scanf(“%d”,&a[i].ID);

      printf(“請(qǐng)輸入到達(dá)時(shí)間:”);

      scanf(“%d”,&a[i].ReachTime);

      printf(“請(qǐng)輸入服務(wù)時(shí)間:”);

      scanf(“%d”,&a[i].TotalTime);

      } for(i=0;i

      {

      insert=GetInsert();

      A[insert].ID=a[reach].ID;

      A[insert].TotalTime=a[reach].TotalTime;

      num=GetNum();

      if(num==1)

      continue;//進(jìn)程數(shù)為1

      else

      {

      //進(jìn)程數(shù)不為1

      Process();

      Forward(num);

      if(temp.TotalTime!=0)

      {

      A[num-1].ID=temp.ID;

      A[num-1].TotalTime=temp.TotalTime;

      }

      } } else//沒(méi)有進(jìn)程到達(dá)

      {

      num=GetNum();

      if(num==1)

      {//進(jìn)程數(shù)為1

      Process();

      if(temp.TotalTime==0)

      {

      A[0].ID=-1;

      }

      }

      else if(num==0)

      }

      continue;//進(jìn)程數(shù)為0

      else

      {

      Process();

      Forward(num);

      if(temp.TotalTime!=0)

      {

      A[num-1].ID=temp.ID;

      A[num-1].TotalTime=temp.TotalTime;

      }

      } } } printf(“n”);printf(“調(diào)度順序?yàn)椋簄”);Myprintf;for(i=0;i<50;i++){ if(queue[i]!=-1)

      printf(“|%2d ”,queue[i]);} printf(“|n”);Myprintf;printf(“n”);

      八、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析:

      短作業(yè)優(yōu)先調(diào)度算法的實(shí)驗(yàn)結(jié)果:

      時(shí)間片輪轉(zhuǎn)調(diào)度算法結(jié)果:

      九、實(shí)驗(yàn)結(jié)論:

      本次實(shí)驗(yàn)成功的完成了短作業(yè)優(yōu)先調(diào)度算法和輪轉(zhuǎn)時(shí)間片調(diào)度算法的模擬,通過(guò)本次實(shí)驗(yàn)我們了解到短作業(yè)優(yōu)先調(diào)度算法不利于長(zhǎng)作業(yè)的處理,因?yàn)殚L(zhǎng)作業(yè)將長(zhǎng)期得不到處理,而輪轉(zhuǎn)時(shí)間片調(diào)度算法則解決了這一問(wèn)題。短長(zhǎng)作業(yè)均能在每一個(gè)周期內(nèi)分得一個(gè)時(shí)間片處理自己的任務(wù)。

      十、總結(jié)及心得體會(huì):

      通過(guò)本次實(shí)驗(yàn)對(duì)短作業(yè)優(yōu)先調(diào)度算法和時(shí)間片輪轉(zhuǎn)調(diào)度算法有了更深入的理解,同時(shí),對(duì)程序算法能力有了進(jìn)一步的提高,同時(shí)對(duì)模塊化編程有了更深入得理解,代碼的模塊化會(huì)使程序的代碼復(fù)用率提高,提高編程的效率。

      十一、對(duì)本實(shí)驗(yàn)過(guò)程及方法、手段的改進(jìn)建議:

      本次實(shí)驗(yàn)的時(shí)間片輪轉(zhuǎn)調(diào)度算法由于教材版本不一樣有兩種結(jié)果,本次實(shí)驗(yàn)本人采取的新教材的版本,新版本的難度較老教材要大很多,實(shí)驗(yàn)時(shí)候可以根據(jù)具體情況選擇一個(gè)適合自己的來(lái)做。

      報(bào)告評(píng)分:

      指導(dǎo)教師簽字:

      下載操作系統(tǒng)實(shí)驗(yàn)報(bào)告(讀者寫著問(wèn)題,時(shí)間片輪轉(zhuǎn)算法,內(nèi)存的分配,進(jìn)程的調(diào)度)[范文大全]word格式文檔
      下載操作系統(tǒng)實(shí)驗(yàn)報(bào)告(讀者寫著問(wèn)題,時(shí)間片輪轉(zhuǎn)算法,內(nèi)存的分配,進(jìn)程的調(diào)度)[范文大全].doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(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)范文推薦