#include<cstdio> #include<cstdlib> struct PCB { char name[10]; char state; //狀態 int super; //優先級 int ntime; //預計運行時間 int rtime; //實際運行時間 PCB *link; }*ready=NULL, *p; void disp(PCB *pr) /*創建進程顯示函數,用於顯示當前進程 */ { printf("\n qname \t state \t super \t ntime \t rtime \n"); printf("|%s \t ",pr->name); printf("|%c \t ",pr->state); printf("|%d \t ",pr->super); printf("|%d \t ",pr->ntime); printf("|%d \t ",pr->rtime); printf("\n"); } void check() /* 創建進程查看函數 */ { printf("\n ******** 當前正在運行的進程是:%s",p->name); /* 顯示當前運行進程 */ disp(p); printf("\n ******** 當前就緒隊列狀態爲:\n"); /* 顯示就緒隊列狀態 */ PCB *pr=ready; while(pr!=NULL) disp(pr), pr=pr->link; } void sort() /* 創建對進程進行優先級排列函數 */ { if(ready==NULL || (p->super)>(ready->super)) /* 優先級最大者,插入隊首 */ { p->link=ready; ready=p; } else /* 進程比較優先級,插入適當的位置中 */ { PCB *first=ready, *second=first->link; while(second!=NULL) { if((p->super)>(second->super)) /* 若插入進程比當前進程優先數大,插入到當前進程前面 */ { first->link=p; p->link=second; return; } first=first->link; second=second->link; } first->link=p; } } void input() /* 創建進程控制塊函數 */ { system("cls"); printf("\n 請輸入進程數目?"); int num; scanf("%d",&num); for(int i=0;i<num;i++) { printf("\n 進程號 No.%d:\n",i); p=(PCB *)malloc(sizeof(PCB)); printf("\n 輸入進程名:"); scanf("%s",p->name); printf("\n 輸入進程優先數:"); scanf("%d",&(p->super)); printf("\n 輸入進程運行時間:"); scanf("%d",&(p->ntime)); printf("\n"); p->rtime=0; p->state='w'; p->link=NULL; sort(); /* 調用 sort 函數 */ } system("cls"); printf("\n ******** 進程建立以下:\n"); PCB *pr=ready; while(pr!=NULL) disp(pr), pr=pr->link; } inline void destroy() /*創建進程撤消函數(進程運行結束,撤消進程) */ { printf("\n 進程 [%s] 已完成.\n",p->name), free(p); } inline void running() /* 創建進程就緒函數(進程運行時間到,置就緒狀態) */ { (p->rtime)++; if(p->rtime==p->ntime) destroy(); /* 調用 destroy 函數 */ else --(p->super), p->state='w', sort(); } int main() /*主函數*/ { input(); int h=0; while(ready!=NULL) { getchar(); printf("\n The execute number:%d \n",++h); p=ready; ready=p->link; p->link=NULL; p->state='r'; check(); running(); printf("\n 按任意鍵繼續......"), getchar(); } printf("\n\n 進程已經所有完成.\n"); getchar(); return 0; } /* 3 A 3 5 B 2 3 C 1 4 */
#include<bits/stdc++.h> using namespace std; int cur_time; int limit; double turnover_time_sum, weighted_turnover_time_sum; struct JCB { int index; //做業序號 string name; //做業名稱 string state; //狀態 int estimate_time; //預計運行時間 int arrive_time; //到達時間 int running_time; //實際運行時間 int end_time; //結束時間 inline int turnover_time()const //週轉時間 { return cur_time-arrive_time; } inline double weighted_turnover_time()const { return turnover_time()*1.0/running_time; } inline int waiting_time()const //等待時間 { return turnover_time()-running_time; } void print()const { printf("做業 %d : \t",index); cout<<"|名稱: "<<name<<" \t"; cout<<"|狀態: "<<state<<" \t"; printf("|到達: %d \t",arrive_time); printf("|預計運行: %d \t",estimate_time); printf("|已運行: %d \t",running_time); printf("|已等待: %d \t",waiting_time()); if(state=="destroy") { printf("|週轉時間: %d \t",turnover_time()); printf("|帶權週轉: %.2f",weighted_turnover_time()); } printf("\n"); } }; bool cmp(const JCB &a,const JCB &b) { return a.arrive_time<b.arrive_time; } vector<JCB> memory; //內存 queue<JCB> fifo; //FIFO隊列 vector<JCB> destroy; //待銷燬 JCB createJob(int index) //建立 { JCB res; printf("\n\n做業序號: %d\n",res.index=index); res.state="reserve"; printf("請輸入做業名稱:\n"); cin>>res.name; printf("請輸入預計運行時間:\n"); cin>>res.estimate_time; printf("請輸入到達時間:\n"); cin>>res.arrive_time; res.running_time=0; return res; } void printJobs() //輸出各個做業狀況 { printf("\n************************************************************\n"); printf("目前時間: %d\n",cur_time); printf("\n內存中存在 %d 個做業:\n",memory.size()); for(auto job:memory) job.print(); queue<JCB> tmp=fifo; printf("\n後備隊列中存在 %d 個做業:\n",tmp.size()); while(tmp.size()) tmp.front().print(), tmp.pop(); printf("\n待銷燬 %d 個做業:\n",destroy.size()); for(auto job:destroy) job.print(); cout<<endl<<endl<<endl<<endl; } void runJobs() //運行內存中的做業 { for(unsigned int i=0;i<memory.size();i++) { memory[i].running_time++; if(memory[i].running_time==memory[i].estimate_time) { memory[i].state="destroy"; memory[i].end_time=cur_time; destroy.push_back(memory[i]); memory.erase(memory.begin()+i); i--; } } } void destroyJobs() //銷燬待銷燬的做業 { for(unsigned int i=0;i<destroy.size();i++) { turnover_time_sum+=destroy[i].turnover_time(); weighted_turnover_time_sum+=destroy[i].weighted_turnover_time(); } destroy.clear(); } int main() { printf("請輸入內存容許的最多做業數目:\n"); cin>>limit; printf("請輸入做業總數目:\n"); int num; cin>>num; vector<JCB> tmp; for(int i=0;i<num;i++) tmp.push_back(createJob(i)); sort(tmp.begin(),tmp.end(),cmp); cur_time=0; turnover_time_sum=weighted_turnover_time_sum=0.0; while(tmp.size()>0 || fifo.size()>0 || memory.size()>0) { while(memory.size()<limit && fifo.size()>0) { JCB tmp=fifo.front(); fifo.pop(); tmp.state="running"; memory.push_back(tmp); } for(unsigned int i=0;i<tmp.size();i++) { if(tmp[i].arrive_time==cur_time) { fifo.push(tmp[i]); tmp.erase(tmp.begin()+i); i--; } } runJobs(); printJobs(); destroyJobs(); cur_time++; } printf("\n\n該組做業平均週轉時間 %.2f, 平均帶權週轉時間 %.2f.\n",turnover_time_sum/num,weighted_turnover_time_sum/num); } /* 2 7 YJC 5 3 HBG 3 1 WYY 10 5 QQQ 2 7 ZVD 8 1 WCY 10 10 YJLGXC 7 5 */
#include<bits/stdc++.h> using namespace std; int cur_time; int limit; double turnover_time_sum, weighted_turnover_time_sum; struct JCB { int index; //做業序號 string name; //做業名稱 string state; //狀態 int estimate_time; //預計運行時間 int arrive_time; //到達時間 int running_time; //實際運行時間 int end_time; //結束時間 inline int turnover_time()const //週轉時間 { return cur_time-arrive_time; } inline double weighted_turnover_time()const { return turnover_time()*1.0/running_time; } inline int waiting_time()const //等待時間 { return turnover_time()-running_time; } void print()const { printf("做業 %d : \t",index); cout<<"|名稱: "<<name<<" \t"; cout<<"|狀態: "<<state<<" \t"; printf("|到達: %d \t",arrive_time); printf("|預計運行: %d \t",estimate_time); printf("|已運行: %d \t",running_time); printf("|已等待: %d \t",waiting_time()); if(state=="destroy") { printf("|週轉時間: %d \t",turnover_time()); printf("|帶權週轉: %.2f",weighted_turnover_time()); } printf("\n"); } bool operator<(const JCB &o)const { return o.estimate_time<estimate_time; } }; bool cmp(const JCB &a,const JCB &b) { return a.arrive_time<b.arrive_time; } vector<JCB> memory; //內存 priority_queue<JCB> heap; //優先隊列 vector<JCB> destroy; //待銷燬 JCB createJob(int index) //建立 { JCB res; printf("\n\n做業序號: %d\n",res.index=index); res.state="reserve"; printf("請輸入做業名稱:\n"); cin>>res.name; printf("請輸入預計運行時間:\n"); cin>>res.estimate_time; printf("請輸入到達時間:\n"); cin>>res.arrive_time; res.running_time=0; return res; } void printJobs() //輸出各個做業狀況 { printf("\n************************************************************\n"); printf("目前時間: %d\n",cur_time); printf("\n內存中存在 %d 個做業:\n",memory.size()); for(auto job:memory) job.print(); priority_queue<JCB> tmp=heap; printf("\n後備隊列中存在 %d 個做業:\n",tmp.size()); while(tmp.size()) tmp.top().print(), tmp.pop(); printf("\n待銷燬 %d 個做業:\n",destroy.size()); for(auto job:destroy) job.print(); cout<<endl<<endl<<endl<<endl; } void runJobs() //運行內存中的做業 { for(unsigned int i=0;i<memory.size();i++) { memory[i].running_time++; if(memory[i].running_time==memory[i].estimate_time) { memory[i].state="destroy"; memory[i].end_time=cur_time; destroy.push_back(memory[i]); memory.erase(memory.begin()+i); i--; } } } void destroyJobs() //銷燬待銷燬的做業 { for(unsigned int i=0;i<destroy.size();i++) { turnover_time_sum+=destroy[i].turnover_time(); weighted_turnover_time_sum+=destroy[i].weighted_turnover_time(); } destroy.clear(); } int main() { printf("請輸入內存容許的最多做業數目:\n"); cin>>limit; printf("請輸入做業總數目:\n"); int num; cin>>num; vector<JCB> tmp; for(int i=0;i<num;i++) tmp.push_back(createJob(i)); sort(tmp.begin(),tmp.end(),cmp); cur_time=0; turnover_time_sum=weighted_turnover_time_sum=0.0; while(tmp.size()>0 || heap.size()>0 || memory.size()>0) { //將若干做業調度運行 while(memory.size()<limit && heap.size()>0) { JCB tmp=heap.top(); heap.pop(); tmp.state="running"; memory.push_back(tmp); } //當前時間點到達的做業進入後備隊列 for(unsigned int i=0;i<tmp.size();i++) { if(tmp[i].arrive_time==cur_time) { heap.push(tmp[i]); tmp.erase(tmp.begin()+i); i--; } } runJobs(); printJobs(); destroyJobs(); cur_time++; } printf("\n\n該組做業平均週轉時間 %.2f, 平均帶權週轉時間 %.2f.\n",turnover_time_sum/num,weighted_turnover_time_sum/num); } /* 2 7 YJC 5 3 HBG 3 1 WYY 10 5 QQQ 2 7 ZVD 8 1 WCY 10 10 YJLGXC 7 5 */
#include<bits/stdc++.h> using namespace std; int cur_time; int limit; double turnover_time_sum, weighted_turnover_time_sum; struct JCB { int index; //做業序號 string name; //做業名稱 string state; //狀態 int estimate_time; //預計運行時間 int arrive_time; //到達時間 int running_time; //實際運行時間 int end_time; //結束時間 inline int turnover_time()const //週轉時間 { return cur_time-arrive_time; } inline double weighted_turnover_time()const { return turnover_time()*1.0/running_time; } inline int waiting_time()const //等待時間 { return turnover_time()-running_time; } inline double response_ratio()const //響應比 { return (waiting_time()+estimate_time)*1.0/estimate_time; } void print()const { printf("做業 %d : \t",index); cout<<"|名稱: "<<name<<" \t"; cout<<"|狀態: "<<state<<" \t"; printf("|到達: %d \t",arrive_time); printf("|預計運行: %d \t",estimate_time); printf("|已運行: %d \t",running_time); printf("|已等待: %d \t",waiting_time()); if(state=="reserve") { printf("|響應比: %.2f",response_ratio()); } if(state=="destroy") { printf("|週轉時間: %d \t",turnover_time()); printf("|帶權週轉: %.2f",weighted_turnover_time()); } printf("\n"); } bool operator>(const JCB &o)const { return response_ratio()>o.response_ratio(); } }; bool cmp(const JCB &a,const JCB &b) { return a.arrive_time<b.arrive_time; } vector<JCB> memory; //內存 vector<JCB> rq; //後備隊列 vector<JCB> destroy; //待銷燬 JCB createJob(int index) //建立 { JCB res; printf("\n\n做業序號: %d\n",res.index=index); res.state="reserve"; printf("請輸入做業名稱:\n"); cin>>res.name; printf("請輸入預計運行時間:\n"); cin>>res.estimate_time; printf("請輸入到達時間:\n"); cin>>res.arrive_time; res.running_time=0; return res; } void printJobs() //輸出各個做業狀況 { printf("\n************************************************************\n"); printf("目前時間: %d\n",cur_time); printf("\n內存中存在 %d 個做業:\n",memory.size()); for(auto job:memory) job.print(); printf("\n後備隊列中存在 %d 個做業:\n",rq.size()); for(auto job:rq) job.print(); printf("\n待銷燬 %d 個做業:\n",destroy.size()); for(auto job:destroy) job.print(); cout<<endl<<endl<<endl<<endl; } void runJobs() //運行內存中的做業 { for(unsigned int i=0;i<memory.size();i++) { memory[i].running_time++; if(memory[i].running_time==memory[i].estimate_time) { memory[i].state="destroy"; memory[i].end_time=cur_time; destroy.push_back(memory[i]); memory.erase(memory.begin()+i); i--; } } } JCB findJobs() //在後備隊列查找做業 { unsigned int idx=0; for(unsigned int i=1;i<rq.size();i++) { if(rq[i]>rq[idx]) idx=i; } printf("調度該做業進入內存:\n"); rq[idx].print(); JCB res=rq[idx]; res.state="running"; rq.erase(rq.begin()+idx); return res; } void destroyJobs() //銷燬待銷燬的做業 { for(unsigned int i=0;i<destroy.size();i++) { turnover_time_sum+=destroy[i].turnover_time(); weighted_turnover_time_sum+=destroy[i].weighted_turnover_time(); } destroy.clear(); } int main() { printf("請輸入內存容許的最多做業數目:\n"); cin>>limit; printf("請輸入做業總數目:\n"); int num; cin>>num; vector<JCB> tmp; for(int i=0;i<num;i++) tmp.push_back(createJob(i)); sort(tmp.begin(),tmp.end(),cmp); cur_time=0; turnover_time_sum=weighted_turnover_time_sum=0.0; while(tmp.size()>0 || rq.size()>0 || memory.size()>0) { //將若干做業調度運行 while(memory.size()<limit && rq.size()>0) memory.push_back(findJobs()); //當前時間點到達的做業進入後備隊列 for(unsigned int i=0;i<tmp.size();i++) { if(tmp[i].arrive_time==cur_time) { rq.push_back(tmp[i]); tmp.erase(tmp.begin()+i); i--; } } runJobs(); printJobs(); destroyJobs(); cur_time++; } printf("\n\n該組做業平均週轉時間 %.2f, 平均帶權週轉時間 %.2f.\n",turnover_time_sum/num,weighted_turnover_time_sum/num); } /* 2 7 YJC 5 3 HBG 3 1 WYY 10 5 QQQ 2 7 ZVD 8 1 WCY 10 10 YJLGXC 7 5 */