![操作系統(tǒng)課程設(shè)計03.doc_第1頁](http://file.renrendoc.com/FileRoot1/2020-1/11/f5166b61-5537-463d-a4c0-e1922d71b62e/f5166b61-5537-463d-a4c0-e1922d71b62e1.gif)
![操作系統(tǒng)課程設(shè)計03.doc_第2頁](http://file.renrendoc.com/FileRoot1/2020-1/11/f5166b61-5537-463d-a4c0-e1922d71b62e/f5166b61-5537-463d-a4c0-e1922d71b62e2.gif)
![操作系統(tǒng)課程設(shè)計03.doc_第3頁](http://file.renrendoc.com/FileRoot1/2020-1/11/f5166b61-5537-463d-a4c0-e1922d71b62e/f5166b61-5537-463d-a4c0-e1922d71b62e3.gif)
![操作系統(tǒng)課程設(shè)計03.doc_第4頁](http://file.renrendoc.com/FileRoot1/2020-1/11/f5166b61-5537-463d-a4c0-e1922d71b62e/f5166b61-5537-463d-a4c0-e1922d71b62e4.gif)
![操作系統(tǒng)課程設(shè)計03.doc_第5頁](http://file.renrendoc.com/FileRoot1/2020-1/11/f5166b61-5537-463d-a4c0-e1922d71b62e/f5166b61-5537-463d-a4c0-e1922d71b62e5.gif)
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
武漢理工大學(xué)計算機(jī)會計課程設(shè)計網(wǎng) 絡(luò) 教 育 學(xué) 院繼 續(xù) 教 育 學(xué) 院計算機(jī)會計課程設(shè)計函授站(學(xué)習(xí)中心) 株 洲 .會 計 專業(yè) 12春 級(春、秋)層次 ???.學(xué) 生 姓 名 : .摘 要本文圍繞Java編程語言在網(wǎng)絡(luò)編程方面的具體應(yīng)用,論述了使用面向?qū)ο蠓椒ǎ瑢annoi塔程序進(jìn)行需求分析、概要設(shè)計、詳細(xì)設(shè)計,最后使用Java編程實現(xiàn)的全過程。關(guān)鍵詞:操作系統(tǒng) XX算法 XX語言一、課程設(shè)計題目:進(jìn)程/作業(yè)調(diào)度二、實現(xiàn)要求:1. 建立作業(yè)的數(shù)據(jù)結(jié)構(gòu)描述2. 使用兩種方式產(chǎn)生作業(yè)/進(jìn)程: (a)自動產(chǎn)生 (b)手工輸入3. 在屏幕上顯示每個作業(yè)/進(jìn)程的執(zhí)行情況。4. 時間的流逝可用下面幾種方法模擬:(a)按鍵盤,每按一次可以認(rèn)為過一個時間單位 (b)響應(yīng)WM_TIMER (本實驗采用b方法)5. 計算并顯示一批作業(yè)/進(jìn)程的周轉(zhuǎn)時間,平均周轉(zhuǎn)時間,帶權(quán)周轉(zhuǎn)時間,平均帶權(quán)周轉(zhuǎn)時間。6. 將一批作業(yè)/進(jìn)程的執(zhí)行情況存入磁盤文件,以后可以讀出并重放。7. 支持的調(diào)度算法:先來先服務(wù),短作業(yè)/進(jìn)程優(yōu)先,時間片輪轉(zhuǎn)調(diào)度算法,優(yōu)先權(quán)調(diào)度算法,高響應(yīng)比優(yōu)先調(diào)度算法,多級反饋隊列調(diào)度算法。三、實驗設(shè)備及環(huán)境: IBM PC及其兼容機(jī)一臺、WindwosXP操作系統(tǒng)、Microsoft Visual C+6.0集成開發(fā)環(huán)境。四實驗?zāi)康模?通過本次課程設(shè)計進(jìn)一步加深對進(jìn)程控制塊、進(jìn)程調(diào)度的理解,能夠?qū)崿F(xiàn)各種不同的進(jìn)程調(diào)度算法。深入理解操作系統(tǒng)設(shè)計中有關(guān)進(jìn)程方面的應(yīng)該注意的相關(guān)事項。五實驗總體設(shè)計思路:1、程序結(jié)構(gòu)框架 程序中自定義了一個進(jìn)程控制塊PCB結(jié)構(gòu)體,所有對進(jìn)程的調(diào)度、進(jìn)程切換等操作全都建立在PCB的基礎(chǔ)之上。PCB中保存了進(jìn)程標(biāo)識符、進(jìn)程到達(dá)時間、等待時間、進(jìn)程調(diào)度狀態(tài)、需要運行的時間等重要信息。PCB的定義如下:struct PCB /PCB結(jié)構(gòu)int pid;/ID號int status;/進(jìn)程狀態(tài)int priority;/進(jìn)程優(yōu)先級數(shù)值越小,優(yōu)先級越高.int start_time;/進(jìn)程開始時間int need_time;/進(jìn)程執(zhí)行所需時間int wait_time;/進(jìn)程已等待時間int end_time;/運行結(jié)束時間struct PCB *next;/PCB指針,指向下一PCB; 程序中還定義了一個正在PCB類型的指針指向正在運行的進(jìn)程的進(jìn)程控制塊,3個就緒隊列。除了多級反饋隊列調(diào)度算法需要用到3個就緒隊列外其他5種調(diào)度算法均只需要一個就緒隊列。 本程序?qū)崿F(xiàn)中采取產(chǎn)生PCB代替真實進(jìn)程的方法來模擬進(jìn)程。 本程序采用MFC框架構(gòu)建,菜單欄主要包括了進(jìn)程選項與調(diào)度算法。以task單文檔視圖為主題結(jié)構(gòu),mainframe實現(xiàn)菜單欄功能。2、程序初始化階段 程序開始運行后首先要產(chǎn)生若干個進(jìn)程,可以采取自動產(chǎn)生也可以采取手工輸入進(jìn)程控制塊參數(shù)的方法產(chǎn)生進(jìn)程。當(dāng)用戶每點擊“自動產(chǎn)生”菜單一次,函數(shù)void CMainFrame:OnAuto()便自動產(chǎn)生一個進(jìn)程并將其掛到就緒隊列末尾,當(dāng)用戶點擊“手工輸入”菜單,便由函數(shù)void CMainFrame:OnManual()彈出輸入對話框引導(dǎo)用戶輸入進(jìn)程參數(shù),之后把新產(chǎn)生的進(jìn)程控制塊掛到就緒隊列末尾。以上兩個函數(shù)均對進(jìn)程編號pid做檢查,以保證每個進(jìn)程的唯一性,不允許有相同的進(jìn)程。 在“調(diào)度算法”菜單中,用戶選擇了調(diào)度算法后,由相應(yīng)的消息響應(yīng)函數(shù)對調(diào)度算法標(biāo)志dispatch進(jìn)行賦值,然后根據(jù)dispatch值調(diào)用相關(guān)函數(shù)執(zhí)行作業(yè)(進(jìn)程)調(diào)度運算。/調(diào)度算法的響應(yīng)函數(shù)/void CMainFrame:OnFcfs()dispatch=1;void CMainFrame:OnSpf()dispatch=2;void CMainFrame:OnTimeroll()dispatch=3;void CMainFrame:OnPriority()dispatch=4;void CMainFrame:OnHrespond()dispatch=5;void CMainFrame:OnMultifeedback()dispatch=6;/void CMainFrame:dispatch_entry() /算法入口switch(dispatch)case 1:fcfs();break;case 2:spf();break;case 3:timeRoll();break;case 4:priority();break;case 5:hirespond();break;case 6:multiFeedback();如果未選擇進(jìn)程調(diào)度算法,系統(tǒng)默認(rèn)使用先來先服務(wù)的調(diào)度算法(dispatch賦值為1)。3、運行階段 用戶點擊“運行”菜單后消息響應(yīng)函數(shù)void CMainFrame:OnRun()設(shè)置計時器開始計時,置程序狀態(tài)為運行狀態(tài),開始對各進(jìn)程進(jìn)行模擬調(diào)度、運行。在模擬進(jìn)程調(diào)度運行的過程中由消息響應(yīng)函數(shù)void CMainFrame:OnTimer(UINT nIDEvent)每秒被調(diào)用一次,在該函數(shù)中對各進(jìn)程的狀態(tài)進(jìn)行刷新(包括進(jìn)程調(diào)度)并輸出到屏幕供用戶觀察進(jìn)程的調(diào)度運行情況。 程序中還有一個free隊列,該隊列中保存所有運行完的進(jìn)程的進(jìn)程控制塊,因為這些進(jìn)程控制塊信息要用來計算進(jìn)程的周轉(zhuǎn)時間,平均周轉(zhuǎn)時間,帶權(quán)周轉(zhuǎn)時間,平均帶權(quán)周轉(zhuǎn)時間。 進(jìn)程運行完后點擊“打印運行結(jié)果”菜單,由void CMainFrame:OnPrintresult()函數(shù)計算并打印進(jìn)程的周轉(zhuǎn)時間,平均周轉(zhuǎn)時間,帶權(quán)周轉(zhuǎn)時間,平均帶權(quán)周轉(zhuǎn)時間。 重放功能的實現(xiàn)較簡單,在調(diào)度開始前每產(chǎn)生一個進(jìn)程便調(diào)用void CMainFrame:store_PCB(const PCB* p)函數(shù)把該進(jìn)程的PCB保存到文件pcb.txt中。當(dāng)運行完后只需把文件pcb.txt中保存的PCB按系統(tǒng)時間先后順序依次讀出并掛到就緒隊列后按之前的調(diào)度算法再開始調(diào)度運行便可。六、主要代碼分析1、進(jìn)程代碼/* void CMainFrame:OnAuto()函數(shù),自動產(chǎn)生進(jìn)程控制塊(PCB)狀態(tài)。產(chǎn)生的 PCB掛接到以存在PCB的后面,其中,為了演示程序,優(yōu)先級和所需時間都限定在1-10之內(nèi)。*/void CMainFrame:OnAuto() /隨機(jī)數(shù)產(chǎn)生srand(unsigned)time(NULL); /產(chǎn)生新的PCB指針ready_end-next=new PCB(); ready_end=ready_end-next;ready_end-next=NULL; /產(chǎn)生新的PCBready_end-pid=getnewpid();ready_end-status=0;ready_end-priority=(rand()%9+1);ready_end-start_time=task_timer;ready_end-need_time=(rand()%9+1);ready_end-wait_time=0;ready_end-end_time=0;/存儲狀態(tài)到pcb.txtstore_PCB(ready_end);/進(jìn)行刷新顯示操作status_print();/* void CMainFrame:OnManual()函數(shù),點擊菜單欄“手動輸入”后手動創(chuàng)建PCB。*/void CMainFrame:OnManual()CInputDlg input;if(input.DoModal()=IDOK)if(!exist_pid(input.m_pid)ready_end-next=new PCB();ready_end=ready_end-next;ready_end-next=NULL;ready_end-pid=input.m_pid;ready_end-status=0;ready_end-priority=input.m_priority;ready_end-start_time=task_timer;ready_end-need_time=input.m_needtime;ready_end-wait_time=0;ready_end-end_time=0;store_PCB(ready_end);status_print();else MessageBox(ID號重復(fù),請重新輸入.);/* 調(diào)用SetTimer函數(shù),以一秒鐘為單位,以定時器TASK_TIMER為標(biāo)志,使用OnTimer()函數(shù)做事件響應(yīng)。*/void CMainFrame:OnRun()if(app_status=false)SetTimer(TASK_TIMER,1000,NULL);app_status=true;其中,void CMainFrame:OnTimer(UINT nIDEvent)為關(guān)鍵函數(shù)。在此函數(shù)中,確定了(1) 函數(shù)判斷replay賦值情況,為真調(diào)用get_PCB_FromFile()函數(shù),從pcb.txt文件中調(diào)用數(shù)據(jù)。(2) 調(diào)用status_print()函數(shù)進(jìn)行顯示操作?!緑oid CMainFrame:status_print()函數(shù),在創(chuàng)建的矩形框內(nèi)每隔單位時間(此時間為1秒)進(jìn)行刷新顯示所有可用PCB操作。】(3) 在第一次運行OnTimer時,系統(tǒng)調(diào)用dispatch_entry()進(jìn)行算法選擇,只要用戶選擇過算法,dispatch值會做響應(yīng)改變,dispatch_entry()根據(jù)dispatch值進(jìn)入相應(yīng)算法。void CMainFrame:OnTimer(UINT nIDEvent)if(TASK_TIMER & app_status=true)task_timer+;if(replay=true)get_PCB_FromFile();add_wait_time();status_print();dispatch_entry();else task_timer=0;CFrameWnd:OnTimer(nIDEvent);【UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) ); 參數(shù)含義: nIDEvent:是指設(shè)置這個定時器的iD,即身份標(biāo)志,這樣在OnTimer()事件中,才能根據(jù)不同的定時器,來做不同的事件響應(yīng)。這個ID是一個無符號的整型。 nElapse:是指時間延遲。單位是毫秒。這意味著,每隔nElapse毫秒系統(tǒng)調(diào)用一次Ontimer()。 】周轉(zhuǎn)時間:是指從作業(yè)被提交給系統(tǒng)開始,到作業(yè)完成為止的這段時間間隔。平均周轉(zhuǎn)時間T=1/nT.帶權(quán)周轉(zhuǎn)時間W是指作業(yè)的周轉(zhuǎn)時間T與系統(tǒng)為它提供服務(wù)的時間之比。平均帶權(quán)周轉(zhuǎn)時間W=1/nW.void CMainFrame:OnPrintresult()CRect rect;CFont font; HideCaret();CDC *pDC;pDC=GetDC();CBrushbrush;CPenpen(PS_SOLID,2,RGB(84,141,226);brush.CreateSolidBrush(RGB(84,141,226);pDC-SelectObject(pen);pDC-SelectObject(brush);CFont* pOldFont=(CFont*)pDC-SelectObject(&font); pDC-Rectangle(100,40,700,600);pDC-TextOut(200,80,PID 到達(dá)時間 服務(wù)時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間);PCB *p=free-next;int i=0,s=100;int turnover,server_time;float sum_turn=0,sum_right=0,right=0;char buffer100;while(p!=NULL) /輸出顯示一個隊列./周轉(zhuǎn)時間turnover=p-end_time - p-start_time; / 帶權(quán)周轉(zhuǎn)時間 right=turnover/ (float)(p-end_time - p-start_time - p-wait_time);server_time=p-end_time - p-start_time - p-wait_time;sprintf(buffer,%3d%10d%16d%18d%17d%25.3f,p-pid,p-start_time,server_time,p-end_time,turnover,right);sum_turn+=turnover;sum_right+=right;i+;pDC-TextOut(200,s,buffer);p=p-next;s=s+20;/ sum_turn/i計算平均周轉(zhuǎn)時間,sum_right/i計算平均帶權(quán)周轉(zhuǎn)時間sprintf(buffer,平均周轉(zhuǎn)時間: %0.3f,sum_turn/i);pDC-TextOut(200,s,buffer);sprintf(buffer,平均帶權(quán)周轉(zhuǎn)時間: %0.3f,sum_right/i);pDC-TextOut(200,s+20,buffer);ReleaseDC(pDC);ShowCaret();/釋放所有PCB占用空間void CMainFrame:OnRelease().PCB *p;while(free-next!=NULL)p=free-next;free-next=p-next;delete p;free_end=free;MessageBox(釋放成功);賦值replay為true,調(diào)用OnRun()函數(shù),進(jìn)行進(jìn)程顯示操作。具體在OnTimer()函數(shù)中已經(jīng)說明void CMainFrame:OnPlayback() if(replay=false)replay=true;OnRun();2、具體算法函數(shù) 每個具體算法函數(shù)對應(yīng)一個dispatch值。void CMainFrame:OnFcfs()dispatch=1;void CMainFrame:OnSpf()dispatch=2;void CMainFrame:OnTimeroll()dispatch=3;void CMainFrame:OnPriority()dispatch=4;void CMainFrame:OnHrespond()dispatch=5;void CMainFrame:OnMultifeedback()dispatch=6; 先來先服務(wù)調(diào)度算法(FCFS)。按照先來先服務(wù)調(diào)度算法定義,依次執(zhí)行隊列中PCB。通過task_run()函數(shù)是從PCB隊列中取出一個最靠前的PCB指針,處理完成后使用pcb_recycle()函數(shù)釋放run指針空間;再繼續(xù)使用task_run()函數(shù)依次反復(fù)直到隊列結(jié)束。void CMainFrame:fcfs()if(run!=NULL | ready-next!=NULL | blocked-next!=NULL)task_run();if(run!=NULL)run-need_time-;if(run-need_time=0)pcb_recycle();task_run();if(run!=NULL)run-wait_time+;else app_status=false;void CMainFrame:task_run()if(run=NULL & ready-next!=NULL)run=ready-next;ready-next=run-next;run-next=NULL;run-status=1;if(run=ready_end)ready_end=ready;void CMainFrame:pcb_recycle()/PCB回收機(jī)制.free_end-next=run;free_end=run;free_end-status=0;free_end-end_time=task_timer;run=NULL; 短作業(yè)進(jìn)程優(yōu)先調(diào)度算法(SPF)。根據(jù)短作業(yè)進(jìn)程優(yōu)先調(diào)度算法定義,調(diào)用task_run_spf()函數(shù)以“need_time”為比較找出需要時間最短的PCB,進(jìn)行顯示后調(diào)用pcb_recycle()釋放run空間;而后繼續(xù)調(diào)用task_run_spf()函數(shù)直到PCB隊列結(jié)束。void CMainFrame:spf()if(run!=NULL | ready-next!=NULL | blocked-next!=NULL)task_run_spf();if(run!=NULL)run-need_time-;if(run-need_time=0)pcb_recycle();task_run_spf();if(run!=NULL)run-wait_time+;else app_status=false;void CMainFrame:task_run_spf()if(run=NULL & ready-next!=NULL)PCB *p,*q,*r;/r指向p前一個PCB,q為搜索指針r=ready;p=q=ready-next;while(q!=NULL)if(p-need_time q-need_time)p=q;while(r-next!=p)r=r-next;q=q-next;r-next=p-next;run=p;run-next=NULL;run-status=1;if(run=ready_end)ready_end=ready; 時間片輪轉(zhuǎn)調(diào)度算法。根據(jù)時間片輪轉(zhuǎn)調(diào)度算法定義,設(shè)定時間片為TIME_CHIP=3,調(diào)用task_run()函數(shù),從PCB隊列中取出一個PCB,判斷此PCB能否在一個時間片內(nèi)執(zhí)行完畢,如果不可以,在執(zhí)行完畢后調(diào)用task_exchange_timeRoll()函數(shù)切換進(jìn)程,并使用task_block()函數(shù)將此進(jìn)程置于PCB隊列最后;如果可以,釋放此PCB所占空間后,調(diào)用task_run()函數(shù)繼續(xù)調(diào)入后面PCB。反復(fù)直到PCB進(jìn)行完畢。void CMainFrame:timeRoll()if(run!=NULL | ready-next!=NULL | blocked-next!=NULL)task_run();if(run!=NULL)if(time_chip-)=0)/進(jìn)程切換.task_exchange_timeRoll();time_chip=TIME_CHIP;else run-need_time-;if(run-need_time=0)time_chip=TIME_CHIP;pcb_recycle();task_run();if(run!=NULL)run-wait_time+;if(rand()%5=0)task_block();task_run();if(rand()%5=4)task_wake();else app_status=false;void CMainFrame:task_exchange_timeRoll()if(ready-next!=NULL)ready_end-next=run;ready_end=run;ready_end-status=0;run=NULL;task_run();void CMainFrame:task_block()if(run!=NULL)blocked_end-next=run;blocked_end=run;blocked_end-status=2;run=NULL;void CMainFrame:task_wake()if(blocked-next!=NULL)if(blocked-next=blocked_end)blocked_end=blocked;ready_end-next=blocked-next;ready_end=ready_end-next;blocked-next=ready_end-next;ready_end-next=NULL;ready_end-status=0; 優(yōu)先權(quán)調(diào)度算法。根據(jù)優(yōu)先權(quán)調(diào)度算法定義,此算法將最初處于最高優(yōu)先權(quán)的PCB完成之后再進(jìn)行第二優(yōu)先權(quán)PCB,即使用非搶占式優(yōu)先權(quán)算法。它使用task_run_priority()函數(shù)找出優(yōu)先權(quán)最高的PCB進(jìn)程,然后進(jìn)行,完成后釋放空間;并繼續(xù)調(diào)用task_run_priority()函數(shù),直到PCB隊列結(jié)束。void CMainFrame:priority()if(run!=NULL | ready-next!=NULL | blocked-next!=NULL)task_run_priority();if(run!=NULL)run-need_time-;if(run-need_time=0)pcb_recycle();task_run_priority();if(run!=NULL)run-wait_time+;else app_status=false;void CMainFrame:task_run_priority()if(run=NULL & ready-next!=NULL)PCB *p,*q,*r;r=ready;p=q=ready-next;while(q!=NULL)if(p-priority q-priority)p=q;while(r-next!=p)r=r-next;q=q-next;r-next=p-next;run=p;run-next=NULL;run-status=1;if(run=ready_end)ready_end=ready; 高響應(yīng)比優(yōu)先算法。根據(jù)計算公式:R=(所需時間+已等待時間)/所需時間,調(diào)用task_run_hirespond()函數(shù)取出首個PCB進(jìn)行,之后反復(fù)調(diào)用task_run_hirespond()函數(shù)直到結(jié)束。void CMainFrame:hirespond()if(run!=NULL | ready-next!=NULL | blocked-next!=NULL)task_run_hirespond();if(run!=NULL)run-need_time-;if(run-need_time=0)pcb_recycle();task_run_hirespond();if(run!=NULL)run-wait_time+;else app_status=false;void CMainFrame:task_run_hirespond()if(run=NULL & ready-next!=NULL)PCB *p,*q,*r;r=ready;p=q=ready-next;while(q!=NULL)if(p-wait_time+p-need_time)/p-need_time) wait_time+q-need_time)/q-need_time) p=q;while(r-next!=p)r=r-next;q=q-next;r-next=p-next;run=p;run-next=NULL;run-status=1;if(run=ready_end)ready_end=ready; 多級反饋隊列調(diào)度算法。設(shè)置多個就緒隊列(ready,ready1,ready2)并初始化,調(diào)用task_run_multiFeedback(r,r_end)函數(shù)從PCB隊列中讀取第一個PCB,分入第一反饋隊列,執(zhí)行它后判斷time_chip值,當(dāng)值為0時調(diào)用task_exchange_multiFeedback(i)函數(shù)進(jìn)行隊列切換到第二隊列,調(diào)用task_run_multiFeedback(r,r_end)函數(shù)從PCB隊列中讀取PCB,反復(fù)進(jìn)行判斷;當(dāng)值不為0時,繼續(xù)向第一隊列添加PCB并判斷run-need_time值,為0調(diào)用pcb_recycle()函數(shù)進(jìn)行PCB空間釋放操作,并繼續(xù)余下進(jìn)程。void CMainFrame:multiFeedback()if(run!=NULL | ready-next!=NULL | ready2-next!=NULL | ready3-next!=NULL | blocked-next!=NULL)int i;PCB *r,*r_end;if(ready-next!=NULL) i=1; r=ready; r_end=ready_end; else if(ready2-next!=NULL ) i=2; r=ready2; r_end=ready2_end; else i=3; r=ready3; r_end=ready3_end; task_run_multiFeedback(r,r_end);if(time_chip-)=0)/進(jìn)程切換.task_exchange_multiFeedback(i);time_chip=TIME_CHIP*i;else run-need_time-;if(run-need_time=0)time_chip=TIME_CHIP*i;pcb_recycle();if( ready-next!=NULL) task_run_multiFeedback(ready,ready_end);else if(ready2-next!=NULL ) task_run_multiFeedback(ready2,ready2_end);else if(ready3-next!=NULL ) task_run_multiFeedback(ready3,ready3_end);if(run!=NULL) run-wait_time+;else app_status=false;/void CMainFrame:task_run_multiFeedback(PCB *r, PCB *r_end)/產(chǎn)生新進(jìn)程if(run=NULL & r-next!=NULL)run=r-next;r-next=run-next;run-next=NULL;run-status=1;if(run=r_end)if(r=ready)ready_end=ready;else if(r=ready2)ready2_end=ready2;else ready3_end=ready3;void CMainFrame:task_exchange_multiFeedback(int i)/進(jìn)程切換.if(i=1)ready2_end-next=run;ready2_end=run;ready2_end-status=0;run=NULL;if( ready-next!=NULL) task_run_multiFeedback(ready,ready_end);else if(ready2-next!=NULL ) task_run_multiFeedback(ready2,ready2_end); else if(ready3-next!=NULL ) task_run_multiFeedback(ready3,ready3_end); else if(i=2 | i=3)ready3_end-next=run;ready3_end=run;ready3_end-status=0;run=NULL;if( ready-next!=NULL) task_run_multiFeedback(ready,ready_end);else if(ready2-next!=NULL ) task_run_multiFeedback(ready2,ready2_end); else if(ready3-next!=NULL ) task_run_multiFeedback(ready3,ready3_end);七、課程設(shè)計心得體會通過本次操作系統(tǒng)課程設(shè)計讓我對操作系統(tǒng)課程中所講授的進(jìn)程調(diào)度部分的認(rèn)識有了一個質(zhì)的進(jìn)步。通過自己動手實現(xiàn)了進(jìn)程相關(guān)的描述信息、進(jìn)程調(diào)度算法、進(jìn)程切換等功能更進(jìn)一步了解了如何對進(jìn)程操作同時也鍛煉了自己編程的的能力。八、程序中有幾個不足之處:1、 使用了背景圖后,在移動窗口覆蓋時會調(diào)用OnDraw()函數(shù)進(jìn)行重繪,有可能覆蓋了輸出顯示。2、 時間片輪轉(zhuǎn)調(diào)度算法中,有stack溢出錯誤,查詢資料無法解決,不過不影響程序編譯與執(zhí)行。3、 多級反饋隊列設(shè)計時有點混亂。4、 進(jìn)程運行之后不能打斷。九、程序運行測試的部分截圖進(jìn)程調(diào)度過程中的截圖調(diào)度運行完成后打印的結(jié)果文件pcb.txt中保存的PCB十、程序?qū)崿F(xiàn)的主要代碼/ MainFrm.h : interface of the CMainFrame class/#if !defined(AFX_MAINFRM_H_4FD998F9_FB1D_409E_B6A1_A6CD8A6DDCC5_INCLUDED_)#define AFX_MAINFRM_H_4FD998F9_FB1D_409E_B6A1_A6CD8A6DDCC5_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#defineMAX_NUM 50#defineTIME_CHIP 3#definePCB_FILENAMEpcb.txt#include/struct PCB /PCB結(jié)構(gòu)int pid;/ID號int status;/進(jìn)程狀態(tài)int priority;/進(jìn)程優(yōu)先級數(shù)值越小,優(yōu)先級越高.int start_time;/進(jìn)程開始時間int need_time;/進(jìn)程執(zhí)行所需時間int wait_time;/進(jìn)程已等待時間int end_time;/運行結(jié)束時間struct PCB *next;/PCB指針,指向下一PCB;/class CMainFrame : public CFrameWndprotected: / create from serialization onlyCMainFrame();DECLARE_DYNCREATE(CMainFrame)/ Attributespublic:/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMainFrame)virtual BOOL PreCreateWindow(CREATESTRUCT& cs);/AFX_VIRTUAL/ Implementationpublic:bool replay;void get_PCB_FromFile();void linkchar(char * s,char c);void store_PCB(constPCB*p);void task_run_multiFeedback(PCB* r,PCB* r_end);void task_exchange_multiFeedback(int i);void task_wake();void task_block();void pcb_recycle();bool exist_pid(int id);void task_run_priority();void task_run_hirespond();void task_exchange_timeRoll();void task_run_spf();void dispatch_entry();void multiFeedback();void hirespond();void priority();void timeRoll();void spf();void fcfs();int getnewpid();void status_print();void task_run();virtual CMainFrame();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected: / control bar embedded membersCStatusBar
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年住宅裝飾工程委托施工協(xié)議
- 2025年不動產(chǎn)分期付款銷售合同范文
- 2025年勞動合同社會保障權(quán)益
- 2025年企業(yè)財務(wù)規(guī)劃委托協(xié)議范本
- 2025年一致行動方股權(quán)交易協(xié)議范例
- 2025年信用貸款延期還款協(xié)議書(7)
- 2025年合作契約解除協(xié)議范例
- 2025年共同策劃建立子公司的合同范例
- 2025年債權(quán)購買協(xié)議書格式
- 2025年中山貨運上崗證考試題庫
- 招投標(biāo)現(xiàn)場項目經(jīng)理答辯(完整版)資料
- 初三開學(xué)第一課家長會優(yōu)秀課件兩篇
- 大學(xué)開學(xué)第一課班會PPT
- 企業(yè)新春茶話會PPT模板
- 重大事故隱患整改臺賬
- 清淤工程施工記錄表
- DB15T 2058-2021 分梳綿羊毛標(biāo)準(zhǔn)
- 2022年涉農(nóng)領(lǐng)域涉嫌非法集資風(fēng)險專項排查工作總結(jié)
- (高職)銀行基本技能ppt課件(完整版)
- 山東省萊陽市望嵐口礦區(qū)頁巖礦
- 機(jī)動車維修經(jīng)營備案告知承諾書
評論
0/150
提交評論