实验三 进程调度模拟程序2.0
?????????????????????????????????????????????????????????????????????????????? 實驗三 進程調度模擬程序2.0
一、實驗目的
用高級語言完成一個進程調度程序,以加深對進程的概念及進程調度算法的理解。
二、實驗要求
設計一個有 N個進程并發執行的進程調度模擬程序。
1.模擬進程數據的生成
允許用戶指定作業的個數(2-24),默認值為5。
允許用戶選擇輸入每個進程的到達時間,所需運行時間,進程的運行時間以時間片為單位。
2. 模擬調度程序的功能
2.1 按照模擬數據的到達時間和所需運行時間,能分別執行以下調度算法。
FCFS
SJ
HRRN
RR
?
2.2 顯示每種算法下各進程的調度執行順序。
?
2.3計算各進程的開始執行時間,各作業的完成時間,周轉時間和帶權周轉時間(周轉系數)。
?
2.4模擬數據結果分析:對同一組模擬數據,比較各算法的平均周轉時間,周轉系數。
?
三、實驗說明
1)? 先來先服務(FCFS)調度算法,即按作業到達的先后次序進行調度??偸鞘紫日{度在系統中等待時間最長的作業。
2)? 短作業優先 (SJF) 調度算法,優先調度要求運行時間最短的作業。
3)? 響應比高者優先(HRRN)調度算法,為每個作業設置一個優先權(響應比),調度之前先計算各作業的優先權,優先數高者優先調度。RP (響應比)= 作業周轉時間 / 作業運行時間=1+作業等待時間/作業運行時間。
4)? 時間片輪轉(RR)調度算法:調度程序每次把CPU分配給就緒隊列首進程使用一個時間片,就緒隊列中的每個進程輪流地運行一個時間片。當這個時間片結束時,強迫一個進程讓出處理器,讓它排列到就緒隊列的尾部,等候下一輪調度。
?
四、實驗環境
可以選用Turbo C作為開發環境。也可以選用Windows下的VB,CB等可視化環境,利用各種控件較為方便。自主選擇實驗環境。
?
五、代碼分析及實驗截圖
?// 24diaodu.cpp : 定義控制臺應用程序的入口點。
//
//#include"StdAfx.h"
#include<stdio.h>
#include<time.h>
#include<windows.h>
struct job
{
??? char name[10];? //程序名
??? char status;
??? int id;
??? int arrT;??????? //到達時間
??? int runT;??????? //運行時間
??? int starT;??????? //開始時間
??? int finishT;??? //結束時間
??? int best;?????? //優先級
??? float TAtime,TAWtime;
??? float rp;?????? //響應比
}job[24];
//隨機產生數據
int Pseudo_random_number()
{
??? int i,n;
??? srand((unsigned)time(0));?
??? //參數seed是rand()的種子,用來初始化rand()的起始值。
??? //輸入作業數
??? n=rand()%23+5;
??? for(i=0; i<n; i++)
??? {
??????? job[i].id=i+1;
??????? //作業到達時間
??????? job[i].arrT=rand()%29+1;
??????? //作業運行時間
??????? job[i].runT=rand()%7+1;
??? }
??? printf("\n id??? 作業到達時間???? 作業運行所需要時間\n");
??? for(i=0; i<n; i++)
??? {
??????? printf("\n%3d%12d%15d",job[i].id,job[i].arrT,job[i].runT);
??? }
??? return n;
}
void sort(struct job temp[24],int num)
{
??? int i;
??? int j;
??? struct job k;
??? for(i=0;i<num-1;i++)
??? {
??????? for(j=i+1;j<num;j++)
??????? {
??????????? if(temp[j].arrT<temp[i].arrT)
??????????? {
??????????????? k = temp[j];
??????????????? temp[j] = temp[i];
??????????????? temp[i] = k;
??????????? }
??????? }
??? }
}
void FCFS(struct job temp[24],int num)
{
??? int i=0;
??? float sumTAtime=0;
??? float aveTAtime=0;
??? printf("┬┬┬┬┬┬┬┬┬先來先服務算法FCFS┬┬┬┬┬┬┬┬┬\n");
??? sort(temp,num);
??? temp[i].starT = temp[i].arrT;
??? temp[i].finishT = temp[i].starT + temp[i].runT;
??? temp[i].TAtime = temp[i].finishT - temp[i].arrT;
??? sumTAtime+=temp[i].TAtime;
??? aveTAtime+=temp[i].TAtime/temp[i].runT;
??? for(i=1;i<num;i++)
??? {
??????? temp[i].starT = temp[i-1].finishT;
??????? temp[i].finishT = temp[i].starT + temp[i].runT;
??????? temp[i].TAtime = temp[i].finishT - temp[i].arrT;
??????? temp[i].rp=temp[i].TAtime/temp[i].runT;
??????? sumTAtime+=temp[i].TAtime;
??????? aveTAtime+=temp[i].TAtime/temp[i].runT;
??? }
??? printf("作業名? 到達時間? CPU所需時間? 開始時間? 結束時間? 周轉時間\n");
??? for(i=0;i<num;i++)???
??? {
??????? printf("%s\t? %d\t???? %d\t???????? %d\t?? %d\t?? %f\n",temp[i].name,temp[i].arrT,
??????????? temp[i].runT,temp[i].starT,temp[i].finishT,temp[i].TAtime);
??? }
??? printf("平均周轉時間=%f\n",sumTAtime/num);
??? printf("平均帶權周轉時間=%f\n",aveTAtime/num);
}
void SJF(struct job temp[24],int num)
{
??
??? int i=0;
??? int j;
??? struct job k;
??? float sumTAtime=0;
??? float aveTAtime=0;
?printf("┬┬┬┬┬┬┬┬┬最短作業優先算法SJF┬┬┬┬┬┬┬┬┬\n");
??? sort(temp,num);
??? temp[i].starT = temp[i].arrT;
??? temp[i].finishT = temp[i].starT + temp[i].runT;
??? temp[i].TAtime = temp[i].finishT - temp[i].arrT;
??? sumTAtime+=temp[i].TAtime;
??? aveTAtime+=temp[i].TAtime/temp[i].runT;
??? for(i=1;i<num-1;i++)
??? {
??????? for(j=i+1;j<num;j++)
??????? {
??????????? if(temp[j].runT<temp[i].runT)
??????????? {
??????????????? k=temp[j];
??????????????? temp[j]=temp[i];
??????????????? temp[i]=k;
??????????? }
??????? }
??? }
??? for(i=1;i<num;i++)
??? {
??????? temp[i].starT = temp[i-1].finishT;
??????? temp[i].finishT = temp[i].starT + temp[i].runT;
??????? temp[i].TAtime = temp[i].finishT - temp[i].arrT;
??????? sumTAtime+=temp[i].TAtime;
??????? aveTAtime+=temp[i].TAtime/temp[i].runT;
??? }
??? printf("作業名? 到達時間? CPU所需時間? 開始時間? 結束時間? 周轉時間\n");
??? for(i=0;i<num;i++)???
??? {
??????? printf("? %s\t? %d\t???? %d\t???????? %d\t?? %d\t?? %f\n",temp[i].name,temp[i].arrT,
??????????? temp[i].runT,temp[i].starT,temp[i].finishT,temp[i].TAtime);
??? }
??? printf("平均周轉時間=%f\n",sumTAtime/num);
??? printf("平均帶權周轉時間=%f\n",aveTAtime/num);
}
void HRRN(struct job temp[24],int num)
{
??? int i=0;
??? int j;
??? struct job k;
?float sumTAtime=0;
??? float aveTAtime=0;
??? printf("┬┬┬┬┬┬┬┬┬最短作業優先算法HRRF┬┬┬┬┬┬┬┬┬\n");
??? sort(temp,num);
???
??? temp[i].starT = temp[i].arrT;
??? temp[i].finishT = temp[i].starT + temp[i].runT;
??? temp[i].TAtime = temp[i].finishT - temp[i].arrT;
??? sumTAtime+=temp[i].TAtime;
??? aveTAtime+=temp[i].TAtime/temp[i].runT;
??? for(i=1;i<num;i++)
??? {
??????? temp[i].starT = temp[i-1].finishT;
??????? temp[i].finishT = temp[i].starT + temp[i].runT;
??????? temp[i].TAtime = temp[i].finishT - temp[i].arrT;
??????? temp[i].rp=temp[i].TAtime/temp[i].runT;
??????? sumTAtime+=temp[i].TAtime;
??????? aveTAtime+=temp[i].TAtime/temp[i].runT;
??? }
??? for(i=1;i<num-1;i++)
??? {
??????? for(j=i+1;j<num;j++)
??????? {
??????????? if(temp[j].rp<temp[i].rp)
??????????? {
??????????????? k=temp[j];
??????????????? temp[j]=temp[i];
??????????????? temp[i]=k;
??????????? }
??????? }
??? }
??? for(i=1;i<num;i++)
??? {
??????? temp[i].starT = temp[i-1].finishT;
??????? temp[i].finishT = temp[i].starT + temp[i].runT;
??????? temp[i].TAtime = temp[i].finishT - temp[i].arrT;
??????? temp[i].rp=temp[i].TAtime/temp[i].runT;
??????? sumTAtime+=temp[i].TAtime;
??????? aveTAtime+=temp[i].TAtime/temp[i].runT;
??? }
??? printf("作業名? 到達時間? CPU所需時間? 開始時間? 結束時間? 周轉時間\n");
??? for(i=0;i<num;i++)???
??? {
??????? printf("? %s\t? %d\t???? %d\t???????? %d\t?? %d\t?? %f\n",temp[i].name,temp[i].arrT,
??????????? temp[i].runT,temp[i].starT,temp[i].finishT,temp[i].TAtime);
??? }
??? printf("平均周轉時間=%f\n",sumTAtime/num);
??? printf("平均帶權周轉時間=%f\n",aveTAtime/num);
}
int main()
{
??? int x;
??? int num;
??? int i;
??? printf("┏----------------------┓\n");
??? printf("┣1.隨機數產生數據------┫\n");
??? printf("┣2.自己輸入模擬數據----┫\n");
??? printf("┗----------------------┛\n");
??? printf("請選擇菜單項:");
??? scanf("%d",&x);
??? if(x==1)
??? {
??????? num=Pseudo_random_number();
??? }
??? else if(x==2)
??? {
??????? printf("程序個數:");
??????? scanf("%d",&num);
??????? printf("\n");
??????? for(i = 0;i<num;i++)
??????? {
??????????? printf("第%d個程序:\n",i+1);
??????????? printf("輸入程序名:");
??????????? scanf("%s",&job[i].name);
??????????? printf("到達時間:");
??????????? scanf("%d",&job[i].arrT);
??????????? printf("運行時間:");
??????????? scanf("%d",&job[i].runT);
??????????? printf("優先級:");
??????????? scanf("%d",&job[i].best);
??????????? printf("\n");
??????? }
??????? printf("經按到達時間排序后,未達到隊列是\n");
??????? printf("id\t到達時間\t運行時間\t優先級\n");
??????? for(i=0;i<num;i++)???
??????? {
??????????? printf("%s\t%d\t\t%d\t\t%d\n",job[i].name,job[i].arrT,job[i].runT,job[i].best);
??????? }
??? }
??? while(1)
??? {
??????? printf("\n");
??????? printf("┏-----------------------------┓\n");
??????? printf("┣0.退出算法調度---------------┫\n");
??????? printf("┣1.FCFS算法調度---------------┫\n");
??????? printf("┣2.SJF算法調度----------------┫\n");
??????? printf("┣3.HRRF算法調度---------------┫\n");
??????? printf("┣4.RR算法調度---------------┫\n");
??????? printf("┗-----------------------------┛\n");
??????? printf("請輸入菜單項:");
??????? scanf("%d",&x);
??????? if(x==1)
??????? {
??????????? FCFS(job,num);
??????? }
??????? else if(x==2)
??????? {
??????????? SJF(job,num);
??????? }
??????? else if(x==3)
??????? {
??????????? HRRN(job,num);
??????? }
??????? else if(x==0)
??????? {
??????????? exit(0);
??????? }
??????? /*else if(x==4)
?????? {
??????????? RR(job,num);
??????? }*/
??????? return 0;
??? }
}
六、總結
1、在操作系統中,系統調度是很重要的,學好進程調度對我們以后的學習有很大的幫助。
2、在各種調度算法之中,FCFS是最簡單的調度算法,但它只考慮作業等候時間忽略作業計算時間,有利于長作業而不利于短作業。
??? FJS短作業優先算法對FCFS算法進行了改進,改善平均周轉時間以及平均帶權周轉時間,但是它對長作業非常不利,有可能長
??? 時間得不到執行。
3、HRRF算法是介于FJF和FCFS算法之間的折中算法,既考慮左作業的運行時間,既照顧短作業又不使長作業的等待時間過長,它
??? 的缺點是每次計算作業的響應比有一定的時間開銷,時間上比SJF差些。
?
轉載于:https://www.cnblogs.com/lfsm/p/5458671.html
總結
以上是生活随笔為你收集整理的实验三 进程调度模拟程序2.0的全部內容,希望文章能夠幫你解決所遇到的問題。