操作系統(tǒng)課程設(shè)計(jì)說明書 -基于Linux的模擬進(jìn)程調(diào)度算法的實(shí)現(xiàn)_第1頁
操作系統(tǒng)課程設(shè)計(jì)說明書 -基于Linux的模擬進(jìn)程調(diào)度算法的實(shí)現(xiàn)_第2頁
操作系統(tǒng)課程設(shè)計(jì)說明書 -基于Linux的模擬進(jìn)程調(diào)度算法的實(shí)現(xiàn)_第3頁
操作系統(tǒng)課程設(shè)計(jì)說明書 -基于Linux的模擬進(jìn)程調(diào)度算法的實(shí)現(xiàn)_第4頁
操作系統(tǒng)課程設(shè)計(jì)說明書 -基于Linux的模擬進(jìn)程調(diào)度算法的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE16操作系統(tǒng)課程設(shè)計(jì)說明書

學(xué)院、系:軟件學(xué)院專業(yè)軟件工程設(shè)計(jì)題目:基于Linux的模擬進(jìn)程調(diào)度算法的實(shí)現(xiàn)需求分析題目:基于Linux的模擬進(jìn)程調(diào)度算法的實(shí)現(xiàn)設(shè)計(jì)內(nèi)容:1.創(chuàng)建進(jìn)程:手動(dòng)創(chuàng)建幾個(gè)進(jìn)程,或者隨即創(chuàng)建幾個(gè)進(jìn)程,都在界面上完成;要求包括進(jìn)程的名稱(不能重復(fù))、創(chuàng)建時(shí)間、執(zhí)行時(shí)間等。在此因?yàn)槟硶r(shí)刻僅一個(gè)進(jìn)程在運(yùn)行,需要申請(qǐng)的資源都能申請(qǐng)到。2.完成先來先服務(wù)、最短作業(yè)優(yōu)先以及最高響應(yīng)比優(yōu)先調(diào)度算法。設(shè)計(jì)要求:要求在屏幕上輸出各進(jìn)程不同調(diào)度算法的演示過程以及對(duì)周轉(zhuǎn)時(shí)間以及平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間進(jìn)行計(jì)算,并對(duì)比各算法的優(yōu)劣。設(shè)計(jì)目的:進(jìn)程是操作系統(tǒng)中最重要的概念,也是學(xué)習(xí)現(xiàn)代操作系統(tǒng)的關(guān)鍵。通過本次課程設(shè)計(jì),要求理解進(jìn)程的實(shí)質(zhì)和進(jìn)程管理的機(jī)制。掌握進(jìn)程調(diào)度的工作流程以及進(jìn)程調(diào)度的算法??傮w設(shè)計(jì)進(jìn)程調(diào)度模擬器功能模塊:進(jìn)程調(diào)度模擬器進(jìn)程調(diào)度進(jìn)程調(diào)度模擬進(jìn)程管理進(jìn)程調(diào)度進(jìn)程調(diào)度模擬進(jìn)程管理最短作業(yè)優(yōu)先刪除進(jìn)程最短作業(yè)優(yōu)先刪除進(jìn)程先來先服務(wù)最高響應(yīng)比優(yōu)先添加進(jìn)程先來先服務(wù)最高響應(yīng)比優(yōu)先添加進(jìn)程最高響應(yīng)比優(yōu)先最短作業(yè)優(yōu)先先來先服務(wù)最高響應(yīng)比優(yōu)先最短作業(yè)優(yōu)先先來先服務(wù)圖一圖一(功能模塊)為了實(shí)現(xiàn)進(jìn)程調(diào)度模擬器這一程序,我們主要設(shè)計(jì)了進(jìn)程管理,進(jìn)程調(diào)度與進(jìn)程調(diào)度模擬這三個(gè)主要功能模塊。在進(jìn)程管理模塊下,又有添加進(jìn)程與刪除進(jìn)程兩個(gè)功能模塊;在進(jìn)程調(diào)度與進(jìn)程調(diào)度模擬模塊下,均有先來先服務(wù),最短作業(yè)優(yōu)先,與最高響應(yīng)比優(yōu)先三個(gè)功能模塊。程序流程圖:開始開始進(jìn)程進(jìn)程管理進(jìn)程調(diào)度進(jìn)程調(diào)度先來先服務(wù)最高響應(yīng)比優(yōu)先最短作業(yè)優(yōu)先先來先服務(wù)最高響應(yīng)比優(yōu)先最短作業(yè)優(yōu)先進(jìn)程調(diào)度模擬進(jìn)程調(diào)度模擬最高響應(yīng)比優(yōu)先先來先服務(wù)最短作業(yè)優(yōu)先最高響應(yīng)比優(yōu)先先來先服務(wù)最短作業(yè)優(yōu)先結(jié)束結(jié)束圖二(程序流程圖)表結(jié)構(gòu)設(shè)計(jì):為了實(shí)現(xiàn)進(jìn)程調(diào)度模擬器這一程序,我們?cè)诔绦蛑兄饕褂昧吮磉@一結(jié)構(gòu)。表一名稱類型備注序號(hào)Int主鍵進(jìn)程名稱Varchar不可重復(fù)創(chuàng)建時(shí)間Int無運(yùn)行時(shí)間Int無表二名稱類型備注序號(hào)Int主鍵進(jìn)程名稱Varchar不可重復(fù)創(chuàng)建時(shí)間Int無開始時(shí)間Int無運(yùn)行時(shí)間Int無結(jié)束時(shí)間Int無周轉(zhuǎn)時(shí)間Int無帶權(quán)周轉(zhuǎn)時(shí)間Int無表三名稱類型備注序號(hào)Int主鍵進(jìn)程名稱Varchar不可重復(fù)剩余時(shí)間Int無周轉(zhuǎn)時(shí)間Int無進(jìn)程狀態(tài)Varchar無3.詳細(xì)設(shè)計(jì)這次課程設(shè)計(jì)中,石宏偉負(fù)責(zé)設(shè)計(jì)添加進(jìn)程模塊,賀心同負(fù)責(zé)設(shè)計(jì)刪除進(jìn)程,宋玉雪負(fù)責(zé)算法設(shè)計(jì),我負(fù)責(zé)進(jìn)程模擬以及將我們每個(gè)人設(shè)計(jì)的模塊組合成完整的程序。核心代碼:MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow),thread(NULL){ui->setupUi(this);ui->iptExecutionTime->setValidator(newQIntValidator(0,99,this));ui->iptCreationTime->setValidator(newQIntValidator(0,99,this));ui->statusBar->showMessage("就緒進(jìn)程數(shù):0");popMenu=newQMenu(ui->lstProcesses);actionDeleteCurrentRow=newQAction("刪除當(dāng)前選中行",this);actionInsertOneNewRow=newQAction("在當(dāng)前行前插入一行",this);actionAppendOneNewRow=newQAction("在所有行后新增一行",this);connect(actionDeleteCurrentRow,SIGNAL(triggered()),this,SLOT(on_DeleteCurrentRow_clicked()));connect(actionInsertOneNewRow,SIGNAL(triggered()),this,SLOT(on_InsertOneNewRow_clicked()));connect(actionAppendOneNewRow,SIGNAL(triggered()),this,SLOT(on_AppendOneNewRow_clicked()));}MainWindow::~MainWindow(){deleteui;}voidMainWindow::on_btnAddNew_clicked(){intnewRowId=ui->lstProcesses->rowCount();QStringProcessName=ui->iptProcessName->text(),CreationTime=ui->iptCreationTime->text(),ExecutionTime=ui->iptExecutionTime->text();if(ProcessName.isEmpty()||CreationTime.isEmpty()||ExecutionTime.isEmpty()){QMessageBox::critical(this,"錯(cuò)誤","有元素為空!");return;}for(inti=0;i!=newRowId;++i){QTableWidgetItem*item=ui->lstProcesses->item(i,0);if(item!=NULL&&item->text()==ProcessName){QMessageBox::critical(this,"錯(cuò)誤","進(jìn)程名重復(fù)!");return;}}ui->lstProcesses->insertRow(newRowId);ui->lstProcesses->setItem(newRowId,0,newQTableWidgetItem(ProcessName));ui->lstProcesses->setItem(newRowId,1,newQTableWidgetItem(CreationTime));ui->lstProcesses->setItem(newRowId,2,newQTableWidgetItem(ExecutionTime));ui->statusBar->showMessage(QString("就緒進(jìn)程數(shù):").append('0'+newRowId+1));}voidMainWindow::on_tabWidget_currentChanged(intindex){if(index==0){ui->statusBar->showMessage(QString("就緒進(jìn)程數(shù):").append(QString::number(ui->lstProcesses->rowCount())));return;}QWidget*tab=index==1?ui->tab_2:ui->tab_3;QTableWidget*tableWidget=index==1?ui->lstExecuting:ui->lstScheduling;tableWidget->clearContents();tableWidget->setRowCount(ui->lstProcesses->rowCount());if(ui->lstProcesses->rowCount()!=0){for(introw=0;row!=ui->lstProcesses->rowCount();++row){for(intcol=0;col!=3;++col){QTableWidgetItem*item=ui->lstProcesses->item(row,col);if(item==NULL||item->text().isEmpty()){tab->setEnabled(false);return;}}}tab->setEnabled(true);}else{tab->setEnabled(false);}if(index==2){lstScheduling_reset();}}voidMainWindow::on_lstProcesses_customContextMenuRequested(constQPoint&){QList<QTableWidgetSelectionRange>selectedRange=ui->lstProcesses->selectedRanges();popMenu->addAction(actionDeleteCurrentRow);popMenu->addAction(actionInsertOneNewRow);popMenu->addAction(actionAppendOneNewRow);if(selectedRange.size()!=1){actionDeleteCurrentRow->setEnabled(false);actionInsertOneNewRow->setEnabled(false);}else{actionDeleteCurrentRow->setEnabled(true);actionInsertOneNewRow->setEnabled(selectedRange[0].bottomRow()==selectedRange[0].topRow());}popMenu->exec(QCursor::pos());}voidMainWindow::on_DeleteCurrentRow_clicked(){QList<QTableWidgetSelectionRange>selectedRange=ui->lstProcesses->selectedRanges();introw=selectedRange[0].topRow(),count=selectedRange[0].bottomRow()-row+1;while(count--)ui->lstProcesses->removeRow(row);ui->statusBar->showMessage(QString("就緒進(jìn)程數(shù):").append(QString::number(ui->lstProcesses->rowCount())));}voidMainWindow::on_InsertOneNewRow_clicked(){ui->lstProcesses->insertRow(ui->lstProcesses->selectedRanges()[0].topRow());ui->statusBar->showMessage(QString("就緒進(jìn)程數(shù):").append(QString::number(ui->lstProcesses->rowCount())));}voidMainWindow::on_AppendOneNewRow_clicked(){ui->lstProcesses->insertRow(ui->lstProcesses->rowCount());ui->statusBar->showMessage(QString("就緒進(jìn)程數(shù):").append(QString::number(ui->lstProcesses->rowCount())));}voidMainWindow::on_lstProcesses_itemChanged(QTableWidgetItem*currentItem){if(currentItem->text().isEmpty())return;if(currentItem->column()==0){introwCount=ui->lstProcesses->rowCount();for(inti=0;i!=rowCount;++i){QTableWidgetItem*item=ui->lstProcesses->item(i,0);if(item!=NULL&&item!=currentItem&&item->text()==currentItem->text()){QMessageBox::critical(this,"錯(cuò)誤","進(jìn)程名重復(fù)!");currentItem->setText("");return;}}}else{boolok;intval=currentItem->text().toInt(&ok);if(!(ok&&val>=0&&val<100)){QMessageBox::critical(this,"錯(cuò)誤","數(shù)值錯(cuò)誤!");currentItem->setText("");return;}}}程序運(yùn)行結(jié)果:圖三(進(jìn)程管理)進(jìn)程調(diào)度:核心代碼:先來先服務(wù):總是把處理機(jī)分配給最先進(jìn)入就緒隊(duì)列的進(jìn)程,一個(gè)進(jìn)程一旦分得處理機(jī),便一直執(zhí)行下去,直到該進(jìn)程完成或阻塞時(shí),才釋放處理機(jī)。voidMainWindow::on_btnFCFS_clicked(){QList<Process>ProcessList=Process::getProcessesFromTable(*ui->lstProcesses);qSort(ProcessList.begin(),ProcessList.end(),Process::SortBy(&Process::CreationTime,std::less<int>()));intTimeNow=0,SumTATime=0,count=ProcessList.size(),newRowId=0;floatSumTATWW=0;ui->lstExecuting->clearContents();foreach(constProcess&process,ProcessList){intStartTime=TimeNow>process.CreationTime?TimeNow:process.CreationTime,EndTime=StartTime+process.ExecutionTime,TurnaroundTime=EndTime-process.CreationTime;floatTATimeWithWeigh=TurnaroundTime/(float)process.ExecutionTime;ui->lstExecuting->setItem(newRowId,0,newQTableWidgetItem(process.ProcessName));ui->lstExecuting->setItem(newRowId,1,newQTableWidgetItem(QString::number(process.CreationTime)));ui->lstExecuting->setItem(newRowId,2,newQTableWidgetItem(QString::number(StartTime)));ui->lstExecuting->setItem(newRowId,3,newQTableWidgetItem(QString::number(process.ExecutionTime)));ui->lstExecuting->setItem(newRowId,4,newQTableWidgetItem(QString::number(EndTime)));ui->lstExecuting->setItem(newRowId,5,newQTableWidgetItem(QString::number(TurnaroundTime)));ui->lstExecuting->setItem(newRowId,6,newQTableWidgetItem(QString::number(TATimeWithWeigh,'f',2)));TimeNow=EndTime;SumTATime+=TurnaroundTime;SumTATWW+=TATimeWithWeigh;++newRowId;}QStringinfo;info.sprintf("平均周轉(zhuǎn)時(shí)間:%.2f平均帶權(quán)周轉(zhuǎn)時(shí)間:%.2f",(float)SumTATime/count,SumTATWW/count);ui->statusBar->showMessage(info);}程序運(yùn)行結(jié)果:圖四(先來先服務(wù))最短作業(yè)優(yōu)先:從就緒隊(duì)列中選出下一個(gè)“CPU執(zhí)行期最短”的進(jìn)程,為之分配處理機(jī)。structCompSJf{QList<Process>::iteratoroperator()(QList<Process>::iteratora,QList<Process>::iteratorb){returna->ExecutionTime<b->ExecutionTime?a:b;}};voidMainWindow::on_btnSJF_clicked(){QList<Process>ProcessList=Process::getProcessesFromTable(*ui->lstProcesses);intTimeNow=0,SumTATime=0,count=ProcessList.size(),newRowId=0;floatSumTATWW=0;qSort(ProcessList.begin(),ProcessList.end(),Process::SortBy(&Process::CreationTime,std::less<int>()));ui->lstExecuting->clearContents();while(!ProcessList.isEmpty()){QList<Process>::iteratorit=ChooseProcess(ProcessList,TimeNow,CompSJf());Process&process=*it;intStartTime=TimeNow>process.CreationTime?TimeNow:process.CreationTime,EndTime=StartTime+process.ExecutionTime,TurnaroundTime=EndTime-process.CreationTime;floatTATimeWithWeigh=TurnaroundTime/(float)process.ExecutionTime;ui->lstExecuting->setItem(newRowId,0,newQTableWidgetItem(process.ProcessName));ui->lstExecuting->setItem(newRowId,1,newQTableWidgetItem(QString::number(process.CreationTime)));ui->lstExecuting->setItem(newRowId,2,newQTableWidgetItem(QString::number(StartTime)));ui->lstExecuting->setItem(newRowId,3,newQTableWidgetItem(QString::number(process.ExecutionTime)));ui->lstExecuting->setItem(newRowId,4,newQTableWidgetItem(QString::number(EndTime)));ui->lstExecuting->setItem(newRowId,5,newQTableWidgetItem(QString::number(TurnaroundTime)));ui->lstExecuting->setItem(newRowId,6,newQTableWidgetItem(QString::number(TATimeWithWeigh,'f',2)));TimeNow=EndTime;SumTATime+=TurnaroundTime;SumTATWW+=TATimeWithWeigh;ProcessList.erase(it);++newRowId;}QStringinfo;info.sprintf("平均周轉(zhuǎn)時(shí)間:%.2f平均帶權(quán)周轉(zhuǎn)時(shí)間:%.2f",(float)SumTATime/count,SumTATWW/count);ui->statusBar->showMessage(info);}程序運(yùn)行結(jié)果:圖五(最短作業(yè)優(yōu)先)最高響應(yīng)比優(yōu)先:響應(yīng)比=作業(yè)響應(yīng)時(shí)間/作業(yè)執(zhí)行時(shí)間=(作業(yè)執(zhí)行時(shí)間+作業(yè)等待時(shí)間)/作業(yè)執(zhí)行時(shí)間=1+作業(yè)等待時(shí)間/作業(yè)執(zhí)行時(shí)間structCompHRRN{CompHRRN(intTN):TimeNow(TN){}QList<Process>::iteratoroperator()(QList<Process>::iteratora,QList<Process>::iteratorb){return(float)(TimeNow-a->CreationTime)/a->ExecutionTime>(float)(TimeNow-b->CreationTime)/b->ExecutionTime?a:b;}intTimeNow;};}voidMainWindow::on_btnHRRN_clicked(){QList<Process>ProcessList=Process::getProcessesFromTable(*ui->lstProcesses);intTimeNow=0,SumTATime=0,count=ProcessList.size(),newRowId=0;floatSumTATWW=0;qSort(ProcessList.begin(),ProcessList.end(),Process::SortBy(&Process::CreationTime,std::less<int>()));ui->lstExecuting->clearContents();while(!ProcessList.isEmpty()){QList<Process>::iteratorit=ChooseProcess(ProcessList,TimeNow,CompHRRN(TimeNow));Process&process=*it;intStartTime=TimeNow>process.CreationTime?TimeNow:process.CreationTime,EndTime=StartTime+process.ExecutionTime,TurnaroundTime=EndTime-process.CreationTime;floatTATimeWithWeigh=TurnaroundTime/(float)process.ExecutionTime;ui->lstExecuting->setItem(newRowId,0,newQTableWidgetItem(process.ProcessName));ui->lstExecuting->setItem(newRowId,1,newQTableWidgetItem(QString::number(process.CreationTime)));ui->lstExecuting->setItem(newRowId,2,newQTableWidgetItem(QString::number(StartTime)));ui->lstExecuting->setItem(newRowId,3,newQTableWidgetItem(QString::number(process.ExecutionTime)));ui->lstExecuting->setItem(newRowId,4,newQTableWidgetItem(QString::number(EndTime)));ui->lstExecuting->setItem(newRowId,5,newQTableWidgetItem(QString::number(TurnaroundTime)));ui->lstExecuting->setItem(newRowId,6,newQTableWidgetItem(QString::number(TATimeWithWeigh,'f',2)));TimeNow=EndTime;SumTATime+=TurnaroundTime;SumTATWW+=TATimeWithWeigh;ProcessList.erase(it);++newRowId;}QStringinfo;info.sprintf("平均周轉(zhuǎn)時(shí)間:%.2f平均帶權(quán)周轉(zhuǎn)時(shí)間:%.2f",(float)SumTATime/count,SumTATWW/count);ui->statusBar->showMessage(info);}程序運(yùn)行結(jié)果:圖六(最高響應(yīng)比優(yōu)先)進(jìn)程調(diào)度模擬:核心代碼:先來先服務(wù):voidThreadOfFCFS::run(){boolanyProcessRunning=ProcessList[0].isRunning;while(anyProcessRunning||std::find_if(ProcessList.begin(),ProcessList.end(),Process::Choose(&Process::ExecutionTime,std::not_equal_to<int>(),0))!=ProcessList.end()){currentThread()->sleep(1);foreach(QList<Process>::iteratorit,FindAll(ProcessList,UnfinishedProcess())){Process&process=*it;introw=ui->lstScheduling->findItems(process.ProcessName,Qt::MatchFixedString)[0]->row();if(process.isRunning){//正在運(yùn)行--process.ExecutionTime;ui->lstScheduling->item(row,2)->setText(QString::number(ui->lstScheduling->item(row,2)->text().toInt()+1));if(process.ExecutionTime==0){//運(yùn)行完成ui->lstScheduling->item(row,1)->setText("");anyProcessRunning=process.isRunning=false;ui->lstScheduling->item(row,3)->setText("完成");}else{ui->lstSchedu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論