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