操作系统实验二——进程调度算法(FCFS、RR)
生活随笔
收集整理的這篇文章主要介紹了
操作系统实验二——进程调度算法(FCFS、RR)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 進程調度算法
- FCFS算法代碼
- RR算法代碼
進程調度算法
FCFS算法代碼
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector>using namespace std;/* 先來先服務(FCFS) */ // 定義先來先服務結構體、參數(shù) struct fcfs{char name[10];// 進程名稱float daodatime;// 到達時間float fuwutime;// 服務時間float kaishitime;// 開始時間float wanchengtime; // 完成時間float zhouzhuangtime;// 周轉時間float daiquantime;// 帶權周轉時間 };// 構造一個輸入進程信息的函數(shù),定義結構體指針并初始化 void input(fcfs *p, int N) {int i;for(i = 0; i <= N - 1; i++){printf("輸入第%d個進程的名字、到達時間、服務時間(例如:PA 2 1):\n", i+1);// 把輸入信息保存到結構體指針所對應的內存中scanf("%s %f %f", p[i].name, &p[i].daodatime, &p[i].fuwutime);p[i].kaishitime = 0;p[i].wanchengtime = 0;p[i].zhouzhuangtime = 0;p[i].daiquantime = 0;} }// 構造一個輸出函數(shù) void print(fcfs *p, int N) {int k;printf("\n進程的相關信息如下:\n");printf("\n名字 到達時間 服務時間 開始時間 完成時間 周轉時間 帶權周轉時間\n");for(k = 0; k < N; k++){printf("%3s\t%-.3f\t%-.3f\t%-.3f\t%-.3f\t%-.3f\t%-.3f\n", p[k].name, p[k].daodatime, p[k].fuwutime,p[k].kaishitime, p[k].wanchengtime, p[k].zhouzhuangtime, p[k].daiquantime);}printf("執(zhí)行順序:\n");printf("%s", p[0].name);for(k = 1; k < N; k++){printf("-->%s", p[k].name);} }// 根據(jù)進程到達時間進行排序,從小到大 void sort(fcfs *p, int N) {int i,j;for(i = 1; i < N; i++){fcfs t = p[i];for(j = i - 1; j >= 0 && t.daodatime < p[j].daodatime; j--)p[j+1] = p[j];p[j+1] = t;} }// 核心運行階段 void run(fcfs *p, int N) {int k;for(k = 0; k < N; k++){// 第一個進程到達if(k == 0){p[k].kaishitime = p[k].daodatime;p[k].wanchengtime = p[k].daodatime + p[k].fuwutime;}else{if(p[k].daodatime <= p[k - 1].wanchengtime){p[k].kaishitime = p[k - 1].wanchengtime;p[k].wanchengtime = p[k].kaishitime + p[k].fuwutime;}else{p[k].kaishitime = p[k].daodatime;p[k].wanchengtime = p[k].kaishitime + p[k].fuwutime;}}}// 計算周轉時間和帶權周轉時間for(k = 0; k < N; k++){// 周轉時間 = 完成時間 - 到達時間p[k].zhouzhuangtime = p[k].wanchengtime - p[k].daodatime;// 帶權周轉時間 = 周轉時間/服務時間p[k].daiquantime = p[k].zhouzhuangtime/p[k].fuwutime;} }// 定義先來先服務函數(shù) void FCFS_MAIN() {int N;printf("請輸入進程的數(shù)量:\n");scanf("%d",&N);fcfs *p = new fcfs[N];input(p, N);// 輸入sort(p, N);// 根據(jù)到達時間從小到大排序run(p, N);// 運行print(p, N);// 輸出delete [] p; }int main() {FCFS_MAIN();return 0; }RR算法代碼
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector>using namespace std;/* 時間片調度服務(rr) */ // 時間片調度服務結構體、參數(shù) struct rr{char name[10];// 進程名稱float daodatime;// 到達時間float fuwutime;// 服務時間float run_time;//運行時間float kaishitime;// 開始時間float wanchengtime; // 完成時間float zhouzhuangtime;// 周轉時間float daiquantime;// 帶權周轉時間int run_flag; /*調度標志*/int start_flag; //是否為第一次開始調度 };int left;//剩余未完成的進程個數(shù)int pattern;//工作模式int time_counter=0; // 構造一個輸入進程信息的函數(shù),定義結構體指針并初始化 void input(rr *p, int N) {int i;printf("請選擇算法模式(1:時間片固定 0:時間可變)\n");scanf("%d",&pattern);for(i = 0; i <= N - 1; i++){printf("輸入第%d個進程的名字、到達時間、服務時間(例如:PA 2 1):\n", i+1);// 把輸入信息保存到結構體指針所對應的內存中scanf("%s %f %f", p[i].name, &p[i].daodatime, &p[i].fuwutime);p[i].run_time = p[i].fuwutime;p[i].kaishitime = 0;p[i].wanchengtime = 0;p[i].zhouzhuangtime = 0;p[i].daiquantime = 0;p[i].run_flag=0; //運行是否結束p[i].start_flag=0;//是否首次被執(zhí)行} }// 構造一個輸出函數(shù) void print(rr *p, int N) {int k;printf("\n進程的相關信息如下:\n");printf("\n名字 到達時間 服務時間 開始時間 完成時間 周轉時間 帶權周轉時間\n");for(k = 0; k < N; k++){printf("%3s\t%-.3f\t%-.3f\t%-.3f\t%-.3f\t%-.3f\t%-.3f\n", p[k].name, p[k].daodatime, p[k].fuwutime,p[k].kaishitime, p[k].wanchengtime, p[k].zhouzhuangtime, p[k].daiquantime);}printf("執(zhí)行順序:\n");printf("%s", p[0].name);for(k = 1; k < N; k++){printf("-->%s", p[k].name);} }// 根據(jù)進程到達時間進行排序,從小到大 void sort(rr *p, int N) {int i,j;for(i = 1; i < N; i++){rr t = p[i];for(j = i - 1; j >= 0 && ((t.daodatime < p[j].daodatime)||t.daodatime == p[j].daodatime&&t.fuwutime < p[j].fuwutime); j--)p[j+1] = p[j];p[j+1] = t;} }// 核心運行階段 void run(rr *p, int N) {float time_temp=0;int i;int j=0;int k=0;time_temp=p[0].daodatime;while(left) //時間片運行的主循環(huán)代碼{if(pattern==0)time_counter=time_counter*(N/left);for(i=0; i<N; i++) //遍歷一遍n個進程{if(p[i].daodatime>time_temp){time_temp=p[i].daodatime;}if(p[i].run_flag==0)//該進程還未結束{if(p[i].start_flag==0) //該條件成立則說明,該進程是第一次執(zhí)行,記錄開始執(zhí)行時間{p[i].kaishitime=time_temp;p[i].start_flag=1;// left--;}if(p[i].run_time/time_counter>1)//至少有兩倍的時間片未執(zhí)行{p[i].run_time=p[i].run_time-time_counter;time_temp=time_temp+time_counter;}else if(p[i].run_time-time_counter==0)//恰好在當前時間片結束{time_temp=time_temp+time_counter;p[i].wanchengtime=time_temp;p[i].run_flag=1;// p[i].run_time=copy_task[i].run_time;left--;}else//僅剩下不足一倍的時間片{time_temp=time_temp+p[i].run_time;p[i].wanchengtime=time_temp;p[i].run_flag=1;// p[i].run_time=copy_task[i].run_time;left--;}}}}// 計算周轉時間和帶權周轉時間for(k = 0; k < N; k++){// 周轉時間 = 完成時間 - 到達時間p[k].zhouzhuangtime = p[k].wanchengtime - p[k].daodatime;// 帶權周轉時間 = 周轉時間/服務時間p[k].daiquantime = p[k].zhouzhuangtime/p[k].fuwutime;} }// 定義先來先服務函數(shù) void rr_MAIN() {int N;printf("請輸入進程的數(shù)量:\n");scanf("%d",&N);printf("請輸入時間片的長度:\n");scanf("%d",&time_counter);rr *p = new rr[N];left=N;input(p, N);// 輸入sort(p, N);// 根據(jù)到達時間從小到大排序run(p, N);// 運行print(p, N);// 輸出delete [] p; }int main() {rr_MAIN();return 0; }總結
以上是生活随笔為你收集整理的操作系统实验二——进程调度算法(FCFS、RR)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php需要帮助搞域名吗,域名转向系统的实
- 下一篇: 基于MVC4+EF5+EasyUI技术实