




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
課程設(shè)計闡明書(操作系統(tǒng))題目:進程調(diào)度院系:計算機科學(xué)與工程學(xué)院專業(yè)班級:信息安全13-2學(xué)號:3029xx學(xué)生姓名:xx指引教師:xx12月15日
安徽理工大學(xué)課程設(shè)計(論文)任務(wù)書計算機科學(xué)與工程學(xué)院學(xué)號3029xx學(xué)生姓名Xx專業(yè)(班級)信息安全13-2設(shè)計題目進程調(diào)度模仿程序設(shè)計技術(shù)參數(shù)(1)系統(tǒng)作業(yè)或進程數(shù)目;(2)進程等待時間(3)進程運營時間設(shè)計要求1.依照設(shè)計任務(wù),用自己熟悉計算機語言編制程序,在機器上調(diào)試運營,并通過上機考核。2.模仿在單解決器狀況下進程調(diào)度,目是加深對進程調(diào)度工作理解。3.設(shè)計一種準時間片輪轉(zhuǎn)調(diào)度算法實現(xiàn)解決器調(diào)度程序。4.在完畢電子設(shè)計后,規(guī)定寫一份詳細設(shè)計報告。工作量1.編寫代碼不少于200行;2.程設(shè)計闡明書不少于15頁。工作計劃.11.23-11.25依照課程設(shè)計規(guī)定,查找有關(guān)資料,完畢需求分析;.11.26-11.27進行系統(tǒng)概要設(shè)計;.11.28-12.5進行系統(tǒng)詳細設(shè)計和源代碼書寫;.12.6-12.10對系統(tǒng)進行調(diào)試分析,寫出課程設(shè)計報告。參考資料[1]龔沛曾等編.C/C++程序設(shè)計教程.北京:高等教誨出版社,.[2][美]PrataS.著.CPrimerPlus(第5版中文版).北京:人民郵電出版社,.[3]湯子瀛等編著.計算機操作系統(tǒng).西安:西安電子科技大學(xué)出版社,[4]胡志剛,譚長庚等,《計算機操作系統(tǒng)》,中南大學(xué)出版社[5]羅宇,鄒鵬等,《操作系統(tǒng)》(第二版),電子工業(yè)出版社4月[6]龐麗萍,《操作系統(tǒng)原理》,華中理工大學(xué)出版社,指引教師簽字教研室主任簽字安徽理工大學(xué)課程設(shè)計(論文)成績評估表學(xué)生姓名:xx學(xué)號:3029xx專業(yè)班級:信息安全13-2程序設(shè)計訓(xùn)練題目:進程調(diào)度模仿程序評價單元評價要素評價內(nèi)涵滿分評分知識水平30%文獻查閱與知識運用能力能獨立查閱文獻資料,并能合理地運用到程序設(shè)計訓(xùn)練之中;能將所學(xué)課程(專業(yè))知識精確地運用到程序設(shè)計之中,并歸納總結(jié)本程序設(shè)計訓(xùn)練所涉及關(guān)于課程知識20程序設(shè)計方案設(shè)計能力程序設(shè)計整體思路清晰,程序設(shè)計方案合理可行10闡明書質(zhì)量50%難度級別與程序設(shè)計訓(xùn)練任務(wù)書題目難度級別相稱10寫作水平整體思路清晰,構(gòu)造合理,層次分明,語言表達流暢,綜合概括能力強30寫作規(guī)范符合程序設(shè)計訓(xùn)練報告基本規(guī)定,用語、格式、圖表、數(shù)據(jù)及各種資料引用規(guī)范(符合原則)10學(xué)習(xí)體現(xiàn)20%工作量程序設(shè)計訓(xùn)練工作量飽滿,能準時完畢程序設(shè)計訓(xùn)練規(guī)定工作量10學(xué)習(xí)態(tài)度學(xué)習(xí)態(tài)度認真,遵守程序設(shè)計階段紀律,作風(fēng)嚴謹,準時完畢程序設(shè)計規(guī)定任務(wù),準時上交程序設(shè)計訓(xùn)練關(guān)于資料10成績:指引教師:年月日摘要當(dāng)代計算機系統(tǒng)中,進程是資源分派和獨立運營基本單位,是操作系統(tǒng)核心概念。因而,進程就成為理解操作系統(tǒng)如何實現(xiàn)系統(tǒng)管理最基本,也是最重要概念。進程調(diào)度是進程管理過程重要構(gòu)成某些,是必然要發(fā)生事件。在當(dāng)代操作系統(tǒng)中,進程并發(fā)機制在絕大多數(shù)時候,會產(chǎn)生不斷變化進程就緒隊列和阻塞隊列。處在執(zhí)行態(tài)進程無論是正?;蚍钦=K結(jié)、或轉(zhuǎn)換為阻塞狀態(tài),都會引起從就緒隊列中,由進程調(diào)度選取一種進程進占CPU。進程調(diào)度核心是進程調(diào)度算法.在本課程設(shè)計中,用良好清晰界面向顧客展示了進程調(diào)度中時間片輪轉(zhuǎn)調(diào)度算法。在最后實現(xiàn)成果中,顧客可指定需要模仿進程數(shù),CPU時間片和進程最大執(zhí)行時間,并且選取需要演示算法,界面將會動態(tài)顯示進程調(diào)度過程及各個隊列變化。通過此進程調(diào)度模仿系統(tǒng),顧客可以對時間片輪轉(zhuǎn)調(diào)度算法有進一步以及直觀理解。核心詞:進程,調(diào)度,PCB,時間片輪轉(zhuǎn)
目錄1.設(shè)計目 62.設(shè)計思路 63.設(shè)計過程 83.1流程圖 83.2算法 83.3數(shù)據(jù)構(gòu)造 103.4源代碼 104.實驗成果及分析 204.1使用闡明 204.2程序演示 205.實驗總結(jié) 246.參照文獻 241.設(shè)計目 依照設(shè)計任務(wù),用自己熟悉計算機語言編制程序,在機器上調(diào)試運營,并通過上機考核。編寫一程序,可以創(chuàng)立若干個虛擬進程,并對若干個虛擬進程進行調(diào)度,調(diào)度方略為時間片輪轉(zhuǎn)。虛擬程序描述:虛擬指令格式:操作命令操作時間其中,操作命令有如下幾種: C:表達在CPU上計算 I:表達輸入 O:表達輸出 W:表達等待 H:表達進程結(jié)束操作時間代表該操作命令要執(zhí)行多長時間假設(shè)I/O設(shè)備數(shù)量沒有限制I、O、W三條指令事實上是不占用CPU,執(zhí)行這三條指令就應(yīng)將進程放入相應(yīng)等待隊列(Input等待隊列、Output等待隊列、Wait等待隊列)例有一虛擬程序p1.prc描述如下:c30o12c9i14h0 該虛擬程序表達含義是:先在CPU上計算30秒,再在輸出設(shè)備上輸出12秒,計算9秒,在輸入設(shè)備上輸入14秒,程序結(jié)束。2.設(shè)計思路 進程調(diào)度是操作系統(tǒng)中重要功能,用來創(chuàng)立進程、撤除進程、實現(xiàn)進程狀態(tài)轉(zhuǎn)換,它提供了在可運營進程之間復(fù)用CPU辦法。在進程管理中,進程調(diào)度是核心,由于在采用多道程序設(shè)計系統(tǒng)中,往往有若干個進程同步處在就緒狀態(tài),當(dāng)就緒進程個數(shù)不不大于解決器數(shù)目時,就必要依照某種方略決定哪些進程優(yōu)先占用解決器。本程序用時間片輪轉(zhuǎn)調(diào)度算法對各種進程進行調(diào)度,每個進程有三個狀態(tài)就緒、運營和完畢,初始狀態(tài)為就緒狀態(tài)。 時間片輪轉(zhuǎn)調(diào)度算法中,系統(tǒng)將所有就緒進程按先來先服務(wù)算法原則,排成一種隊列,每次調(diào)度時,系統(tǒng)把解決機分派給隊列首進程,并讓其執(zhí)行一種時間片。當(dāng)執(zhí)行時間片用完時,由一種計時器發(fā)出時鐘中斷祈求,調(diào)度程序依照這個祈求停止該進程運營,將它送到就緒隊列末尾,再把解決機分給就緒隊列中新隊列首進程,同步讓它也執(zhí)行一種時間片。(1)建立一種進程控制塊。PCB來代表。PCB涉及:進程名、鏈接指針、到達時間、預(yù)計運營時間、剩余時間和進程狀態(tài)。進程狀態(tài)分為就緒(W)、運營(R)和完畢(F)。(2)為每個進程任意擬定一種規(guī)定運營時間和到達時間。(3)按照進程到達先后順序排成一種循環(huán)隊列。再設(shè)一種對首指針指向第一種到達進程首址。(4)執(zhí)行解決機調(diào)度時,開始選取對首第一種進程運營。此外再設(shè)一種當(dāng)前運營進程指針,指向當(dāng)前正運營進程。(5)執(zhí)行:a)預(yù)測運營時間減1;b)輸出當(dāng)前運營進程名字。(6)進程執(zhí)行一次后,若該進程剩余運營時間為零,則將該進程狀態(tài)置為完畢態(tài)F,并退出循環(huán)隊列;若不為空,則將其移至隊尾。繼續(xù)在運營隊首進程。(7)若就緒隊列不空,則重復(fù)上述(5)和(6)環(huán)節(jié)直到所有進程都運營完為止。在所設(shè)計調(diào)度程序中,規(guī)定包括顯示或打印語句。以便顯示或打印每次選操作系統(tǒng)課程設(shè)計中進程名稱及運營一次后隊列變化狀況。3.設(shè)計過程3.1流程圖3.2算法 如果就緒隊列中有n個進程,且時間片為q,則每個進程會得到CPU時間,每個長度不超過q時間單元。每個進程必要等待CPU時間不會超過(n-1)q個時間單元,直到它下一種時間片為止voidRun(){ inti,flag=0,time=10,pcbnum,Index=0,exenum,num,quenum;charcmd;intj,m,n; inttotal=0; JobEnQueueInit(&total); save(); while(total!=0){ if( !EmptyQueue(Queue[1])){ outqueue(&Queue[1],&pcbnum); insertqueue(&Queue[0],pcbnum); }elsepcbnum=GetHead(Queue[0]);delay();jobpcb[pcbnum].status='e';printf("\n\t\t作業(yè)%d\n",pcbnum+1); printf("\t\t\t所處狀態(tài):%c\t執(zhí)行了%d秒\n",jobpcb[pcbnum].status,time); for(i=0;i<3;i++){if(jobpcb[i].id>=0){//所有作業(yè)除在就緒隊列獲執(zhí)行結(jié)束外等待時間都減去時間片 if(jobpcb[i].status!='r'&&jobpcb[i].status!='h')jobpcb[i].wtime=jobpcb[i].wtime-time; if(jobpcb[i].wtime<=0){//查找所有隊列所在位置 for(j=0;j<5;j++){ for(m=Queue[j].head;m<Queue[j].tail;m++){ if(Queue[j].pcbnum[m]==i){flag=1;break; } } if(flag==1)break; } if(flag==1){ //刪除該指令 for(n=m;n<Queue[j].tail;n++)Queue[j].pcbnum[n]=Queue[j].pcbnum[n+1]; Queue[j].tail--; jobpcb[i].exetoIndex++; Index=jobpcb[i].exetoIndex; JobEnQueue(i,Index,&total); } }}}if(!EmptyQueue(Queue[1])){ outqueue(&Queue[0],&pcbnum); if(jobpcb[pcbnum].wtime>0){ insertqueue(&Queue[1],pcbnum); jobpcb[pcbnum].status='r'; } }printf("\n\n\t\t尚有\(zhòng)t%d個作業(yè)沒有完畢\n",total);save(); }}3.3數(shù)據(jù)構(gòu)造voiddelay()intchange(char*m)intAllocPCB()intAllocJob()voiddisplayIndex()intCreatePcbLine()voidinitqueue(structQnode*l)voidinsertqueue(structQnode*l,intpcbnum)intEmptyQueue(structQnodel)voidoutqueue(structQnode*l,int*pcbnum)voiddisplay()voidJobEnQueueInit(int*total)voidsave()voidJobEnQueue(intpcbnum,intIndex,int*total)intGetHead(structQnodel)voidRun()voidInitFile()3.4源代碼//進程調(diào)度模仿程序,以時間片輪轉(zhuǎn)調(diào)度算法為核心#defineNULL0#include<stdio.h>#include<conio.h>#include<string.h>#include<malloc.h>#include<time.h>FILE*GroupFile[10];//定義一種pcb構(gòu)造體typedefstructindex{charname;//指令inttime;//指令執(zhí)行時間 }index;structpcb{charfilename[10];//進程名 intid;//作業(yè)編號 intexetoIndex;//當(dāng)前正在執(zhí)行指令 charstatus;//當(dāng)前狀態(tài) intwtime;//等待時間};structpcbjobpcb[100];//pcb表typedefstructjob{indexidx[100];//指令集 intpcbnum;//pcb編號相應(yīng)}job;jobjobtab[100];//作業(yè)表charjobp[3][50];//作業(yè)//隊列構(gòu)造體structQnode{ intpcbnum[100];//pcb編號inthead,tail;};structQnodeQueue[5];//5個隊列0E1R2I3O4Wvoidinitqueue(structQnode*l);//延遲voiddelay(){ time_tbegin,end;time(&begin);do{time(&end); }while((end-begin)<=1);}//字符轉(zhuǎn)化為數(shù)值intchange(char*m){ inti,j=0;intlen=strlen(m);for(i=0;i<len;i++)j=j*10+m[i]-'0';returnj;}//申請pcb進程塊intAllocPCB(){inti;for(i=0;i<3;i++)if(jobpcb[i].id==-1)break;if(i<3)returni;return-1;}//申請jobintAllocJob(){inti;for(i=0;i<3;i++)if(jobtab[i].pcbnum==-1)break;if(i<3)returni;return-1;}//顯示指令voiddisplayIndex(){ inti,j;for(i=0;i<3;i++){printf("Job%d\n",i+1); for(j=0;j<10;j++)printf("%d%c%d\n",j+1,jobtab[i].idx[j].name,jobtab[i].idx[j].time); }}//創(chuàng)立進程程序intCreatePcbLine(){ charline[10]; int i,ll,jnum,pnum,ln=0,bpos,pos=0; charbuff[50];charname[20];charch; for(i=0;i<3;i++){ ln=0; jnum=AllocJob(); if(jnum==-1)return0; pnum=AllocPCB(); if(pnum==-1)return0; jobtab[jnum].pcbnum=pnum; strcpy(jobpcb[pnum].filename,""); jobpcb[pnum].status='r'; jobpcb[pnum].exetoIndex=0; jobpcb[pnum].id=jnum; jobpcb[pnum].wtime=0; intlen=strlen(jobp[i]); pos=0; while(pos<len){ while(jobp[i][pos]=='')pos++; jobtab[jnum].idx[ln].name=jobp[i][pos++];/// while(jobp[i][pos]=='')pos++; bpos=0; while(jobp[i][pos]!='') buff[bpos++]=jobp[i][pos++]; buff[bpos]='\0'; jobtab[jnum].idx[ln].time=change(buff);///// if(pos<len){pos++;ln++; } } } displayIndex();}//初始化隊列voidinitqueue(structQnode*l){l->head=0; l->tail=0;}//插進入隊列/voidinsertqueue(structQnode*l,intpcbnum){l->pcbnum[l->tail++]=pcbnum;}//隊列與否為空intEmptyQueue(structQnodel){if(l.head==l.tail)return1;return0;}//刪除隊列voidoutqueue(structQnode*l,int*pcbnum){if(l->head>=l->tail)*pcbnum=-1; else *pcbnum=l->pcbnum[l->head++];}//顯示作業(yè)voiddisplay(){inti,j; for(i=0;i<5;i++){printf("隊列%d",i); for(j=Queue[i].head;j<Queue[i].tail;j++) printf("pcb編號%d\n\n",Queue[i].pcbnum[j]); }}//作業(yè)入隊列voidJobEnQueueInit(int*total){inti,num,Index=0; charcmd; for(i=0;i<3;i++) if(jobpcb[i].id>=0){ cmd=jobtab[jobpcb[i].id].idx[Index].name; switch(cmd){ case'c':insertqueue(&Queue[1],i);jobpcb[i].status='r';break;case'i':insertqueue(&Queue[2],i);jobpcb[i].status='i';break;case'o':insertqueue(&Queue[3],i);jobpcb[i].status='o';break;case'w':insertqueue(&Queue[4],i);jobpcb[i].status='w';break; case'h':jobpcb[i].status='h';num=jobpcb[i].id;jobtab[num].pcbnum=-1;jobpcb[i].id=-1; } if(cmd=='h'){jobpcb[i].wtime=0;total--;} jobpcb[i].wtime=jobtab[jobpcb[i].id].idx[Index].time;(*total)++; } }//保存成果voidsave(){FILE*fp;inti;fp=fopen("pcbtable.txt","a");fprintf(fp,"文獻名作業(yè)編號執(zhí)行到指令數(shù)所處狀態(tài)等待時間\n");for(i=0;i<3;i++)fprintf(fp,"\t%s\t%d\t%d\t%c\t%d\n",jobpcb[i].filename,jobpcb[i].id,jobpcb[i].exetoIndex, jobpcb[i].status,jobpcb[i].wtime);fclose(fp);}//作業(yè)入隊列voidJobEnQueue(intpcbnum,intIndex,int*total){intnum; charcmd; if(jobpcb[pcbnum].id>=0){ cmd=jobtab[jobpcb[pcbnum].id].idx[Index].name; switch(cmd){ case'c':insertqueue(&Queue[1],pcbnum);jobpcb[pcbnum].status='r';break;case'i':insertqueue(&Queue[2],pcbnum);jobpcb[pcbnum].status='i';break;case'o':insertqueue(&Queue[3],pcbnum);jobpcb[pcbnum].status='o';break;case'w':insertqueue(&Queue[4],pcbnum);jobpcb[pcbnum].status='w';break; case'h':jobpcb[pcbnum].status='h';num=jobpcb[pcbnum].id;jobtab[num].pcbnum=-1;jobpcb[pcbnum].id=-1; } if(cmd=='h'){ jobpcb[pcbnum].wtime=0; printf("\n\t\t作業(yè)%d完畢\n",pcbnum+1,jobpcb[pcbnum].status); (*total)--; } elsejobpcb[pcbnum].wtime=jobtab[jobpcb[pcbnum].id].idx[Index].time; printf("\n\t\t作業(yè)%d\n",pcbnum+1); printf("\t\t\t\t所處狀態(tài):%c\n",jobpcb[pcbnum].status); printf("\t\t還需要時間%d秒\n",jobpcb[pcbnum].wtime); }}//得到隊列首元素intGetHead(structQnodel){ returnl.pcbnum[l.head];}//執(zhí)行voidRun(){ inti,flag=0,time=10,pcbnum,Index=0,exenum,num,quenum;charcmd;intj,m,n; inttotal=0; JobEnQueueInit(&total); save(); while(total!=0){ if( !EmptyQueue(Queue[1])){ outqueue(&Queue[1],&pcbnum); insertqueue(&Queue[0],pcbnum); }elsepcbnum=GetHead(Queue[0]);delay();jobpcb[pcbnum].status='e';printf("\n\t\t作業(yè)%d\n",pcbnum+1); printf("\t\t\t所處狀態(tài):%c\t執(zhí)行了%d秒\n",jobpcb[pcbnum].status,time); for(i=0;i<3;i++){if(jobpcb[i].id>=0){//所有作業(yè)除在就緒隊列獲執(zhí)行結(jié)束外等待時間都減去時間片 if(jobpcb[i].status!='r'&&jobpcb[i].status!='h')jobpcb[i].wtime=jobpcb[i].wtime-time; if(jobpcb[i].wtime<=0){//查找所有隊列所在位置 for(j=0;j<5;j++){ for(m=Queue[j].head;m<Queue[j].tail;m++){ if(Queue[j].pcbnum[m]==i){flag=1;break; } } if(flag==1)break; } if(flag==1){ //刪除該指令 for(n=m;n<Queue[j].tail;n++)Queue[j].pcbnum[n]=Queue[j].pcbnum[n+1]; Queue[j].tail--; jobpcb[i].exetoIndex++; Index=jobpcb[i].exetoIndex; JobEnQueue(i,Index,&total); } }}}if(!EmptyQueue(Queue[1])){ outqueue(&Queue[0],&pcbnum); if(jobpcb[pcbnum].wtime>0){ insertqueue(&Queue[1],pcbnum); jobpcb[pcbnum].status='r'; } }printf("\n\n\t\t尚有\(zhòng)t%d個作業(yè)沒有完畢\n",total);save(); }}//初始化voidInitFile(){inti;GroupFile[0]=fopen("p1.prc","r");GroupFile[1]=fopen("p2.prc","r");GroupFile[2]=fopen("p3.prc","r");fgets(jobp[0],255,GroupFile[0]);fgets(jobp[1],255,GroupFile[1]);fgets(jobp[2],255,GroupFile[2]); for(i=0;i<100;i++){ jobpcb[i].exetoIndex=0;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療機構(gòu)裝修工人合同
- 脊柱手術(shù)室護理
- 策劃書行業(yè)分析
- 咖啡廳內(nèi)部裝修設(shè)計協(xié)議
- 2024瑪納斯中等職業(yè)技術(shù)學(xué)校工作人員招聘考試及答案
- 2024河北雄安新區(qū)興達技工學(xué)校工作人員招聘考試及答案
- 簡化版代理銷售合同
- 化工制圖與識圖試題庫含答案
- 市政基礎(chǔ)設(shè)施工程施工承包合同范本
- 植物考試題及答案
- 2025年浙江省杭州市拱墅區(qū)中考語文模擬試卷含答案
- 原發(fā)性高血壓護理措施
- 人工智能基礎(chǔ)(Python實現(xiàn))-課件 第8章 生成式大模型應(yīng)用
- 2024年安徽寧馬投資有限責(zé)任公司招聘10人筆試參考題庫附帶答案詳解
- 紀檢監(jiān)察審查調(diào)查業(yè)務(wù)培訓(xùn)
- 《變頻器原理及應(yīng)用》課件
- 2024年中考模擬試卷英語(蘇州卷)
- 攝像服務(wù)行業(yè)品牌建設(shè)研究-深度研究
- JT-T-1045-2016道路運輸企業(yè)車輛技術(shù)管理規(guī)范
- DB33T 1192-2020 建筑工程施工質(zhì)量驗收檢查用表統(tǒng)一標(biāo)準
- 電鍍與化學(xué)鍍
評論
0/150
提交評論