前言:
本文采用的進(jìn)程調(diào)度算法有:先來先服務(wù),短作業(yè)優(yōu)先,優(yōu)先級調(diào)度算法和時(shí)間片輪轉(zhuǎn)調(diào)度算法。
針對這四種算法,我采用的是建立數(shù)組結(jié)構(gòu)體,如:
struct job {
char name[10]; //作業(yè)的名字
int starttime; //作業(yè)到達(dá)系統(tǒng)時(shí)間
int needtime; //作業(yè)服務(wù)時(shí)間
int runtime; //作業(yè)周轉(zhuǎn)時(shí)間
int endtime; //作業(yè)結(jié)束時(shí)間
double dqzz_time; //帶權(quán)周轉(zhuǎn)時(shí)間
};
一,先來先服務(wù)算法:
1,算法思想:
先來先服務(wù)(FCFS)調(diào)度算法是一種最簡單的調(diào)度算法,該算法既可用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度。采用FCFS算法,每次從后備隊(duì)列中選擇一個(gè)或多個(gè)最先進(jìn)入該隊(duì)列的作業(yè),將他們調(diào)入內(nèi)存,為他們分配資源,創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列。在進(jìn)程調(diào)度中采用FCFS算法時(shí),則每次調(diào)度是從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行。該進(jìn)程一直運(yùn)行到完成或發(fā)生某事件而阻塞后才放棄處理機(jī)。
2,算法實(shí)例:
首先,先對運(yùn)行函數(shù)進(jìn)行聲明:
void FCFS(struct job jobs[50], int n);//先來先服務(wù)算法
其中n為進(jìn)程個(gè)數(shù)。
其次,按照進(jìn)程到達(dá)時(shí)間進(jìn)行排序:
for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
if (jobs[j].starttime < jobs[i].starttime)
{ //把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].starttime;
jobs[j].starttime = jobs[i].starttime;
jobs[i].starttime = t_time;
//把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].needtime;
jobs[j].needtime = jobs[i].needtime;
jobs[i].needtime = t_time;
strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
strcpy(jobs[j].name, jobs[i].name);
strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
}
}
}
二,短作業(yè)優(yōu)先算法
1,算法思想:
短作業(yè)優(yōu)先(SJF, Shortest Job First)又稱為“短進(jìn)程優(yōu)先”SPN(Shortest Process Next);是對FCFS算法的改進(jìn),其目標(biāo)是減少平均周轉(zhuǎn)時(shí)間。
短作業(yè)優(yōu)先調(diào)度算法基于這樣一種思想:
運(yùn)行時(shí)間短的優(yōu)先調(diào)度;
如果運(yùn)行時(shí)間相同則調(diào)度最先發(fā)起請求的進(jìn)程。
等待時(shí)間:一個(gè)進(jìn)程從發(fā)起請求到開始執(zhí)行的時(shí)間間隔。
現(xiàn)在有n個(gè)進(jìn)程請求cpu,每個(gè)進(jìn)程用一個(gè)二元組表示:(p,q),p代表該進(jìn)程發(fā)起請求的時(shí)間,p代表需要占用cpu的時(shí)間。
請計(jì)算n個(gè)進(jìn)程的平均等待時(shí)間。
2,算法實(shí)例:
首先,先對運(yùn)行函數(shù)進(jìn)行聲明:
void SJF(struct job jobs[50], int n);//短作業(yè)優(yōu)先算法
其中n為進(jìn)程個(gè)數(shù)。
其次,按照最短運(yùn)行時(shí)間排序:
for (i = 1; i < n; i++)
{
for (j = i; j < n; j++)
{
//按最短運(yùn)行時(shí)間排序
//關(guān)于jobs[i - 1].endtime > jobs[j].starttime如果到達(dá)時(shí)間太遲于上一輪的結(jié)束時(shí)間,會(huì)造成浪費(fèi)時(shí)間資源用以等待
if (jobs[i - 1].endtime > jobs[j].starttime && jobs[j].needtime < jobs[i].needtime)
{
t_time = jobs[i].starttime;
jobs[i].starttime = jobs[j].starttime;
jobs[j].starttime = t_time;
//把短的賦值到臨時(shí)變量t_time中
t_time = jobs[i].needtime;
jobs[i].needtime = jobs[j].needtime;
jobs[j].needtime = t_time;
strcpy(t_name, jobs[i].name); //將第二個(gè)參數(shù)的值復(fù)制給第一個(gè)參數(shù),返回第一個(gè)參數(shù)
strcpy(jobs[i].name, jobs[j].name);
strcpy(jobs[j].name, t_name);
} //按最短運(yùn)行時(shí)間排序
}
if (jobs[i].starttime > jobs[i - 1].endtime)
{ //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;//結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
jobs[i].runtime = jobs[i].needtime;//周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
}
else
{
jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間=結(jié)束時(shí)間-到達(dá)時(shí)間
}
jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;
}
三,優(yōu)先級調(diào)度算法
1,算法思想:
優(yōu)先級調(diào)度的含義
當(dāng)該算法用于作業(yè)調(diào)度時(shí),系統(tǒng)從后備作業(yè)隊(duì)列中選擇若干個(gè)優(yōu)先級最高的,且系統(tǒng)能滿足資源要求的作業(yè)裝入內(nèi)存運(yùn)行。
當(dāng)該算法用于進(jìn)程調(diào)度時(shí),將把處理機(jī)分配給就緒進(jìn)程隊(duì)列中優(yōu)先級最高的進(jìn)程。
調(diào)度算法的兩種方式
優(yōu)先級調(diào)度算法細(xì)分成如下兩種方式:
非搶占式優(yōu)先級算法
在這種調(diào)度方式下,系統(tǒng)一旦把處理機(jī)分配給就緒隊(duì)列中優(yōu)先級最高的進(jìn)程后,該進(jìn)程就能一直執(zhí)行下去,直至完成;或因等待某事件的發(fā)生使該進(jìn)程不得不放棄處理機(jī)時(shí),系統(tǒng)才能將處理機(jī)分配給另一個(gè)優(yōu)先級高的就緒進(jìn)程。
搶占式優(yōu)先級調(diào)度算法
在這種調(diào)度方式下,進(jìn)程調(diào)度程序把處理機(jī)分配給當(dāng)時(shí)優(yōu)先級最高的就緒進(jìn)程,使之執(zhí)行。一旦出現(xiàn)了另一個(gè)優(yōu)先級更高的就緒進(jìn)程時(shí),進(jìn)程調(diào)度程序就停止正在執(zhí)行的進(jìn)程,將處理機(jī)分配給新出現(xiàn)的優(yōu)先級最高的就緒進(jìn)程。
優(yōu)先級的類型
進(jìn)程的優(yōu)先級可采用靜態(tài)優(yōu)先級和動(dòng)態(tài)優(yōu)先級兩種,優(yōu)先級可由用戶自定或由系統(tǒng)確定。
2,算法實(shí)例:
首先,先對運(yùn)行函數(shù)進(jìn)行聲明:
void HRRN(struct job jobs[50],int n);//優(yōu)先調(diào)度算法
其中n為進(jìn)程個(gè)數(shù)。
其次,設(shè)計(jì)優(yōu)先級:
double hrrn[10];//動(dòng)態(tài)優(yōu)先級
然后,按照優(yōu)先級進(jìn)行比較并排序:
for (i = 1; i < n; i++)
{
for (j = i; j < n; j++)
{
//優(yōu)先級=(等待時(shí)間+要求服務(wù)時(shí)間)/ 要求服務(wù)時(shí)間
hrrn[j] = static_cast<double>(jobs[i - 1].endtime - jobs[j].starttime + jobs[j].needtime) / jobs[j].needtime;
}//這是此時(shí)第i個(gè)進(jìn)程結(jié)束后的所有進(jìn)程的優(yōu)先級
for (int t = i + 1; t < n; t++) {
if (hrrn[t] > hrrn[i]) {
t_time = jobs[t].starttime;
jobs[t].starttime = jobs[i].starttime;
jobs[i].starttime = t_time;
//把短的賦值到臨時(shí)變量t_time中
t_time = jobs[t].needtime;
jobs[t].needtime = jobs[i].needtime;
jobs[i].needtime = t_time;
strcpy(t_name, jobs[t].name);
strcpy(jobs[t].name, jobs[i].name);
strcpy(jobs[i].name, t_name);
}//按優(yōu)先級進(jìn)行比較并排序
}
jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//第i個(gè)進(jìn)程的結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
}
四,時(shí)間片輪轉(zhuǎn)調(diào)度算法
1,算法思想:
時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡單,最公平且使用最廣的算法。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間。如果在時(shí)間片結(jié)束時(shí)進(jìn)程還在運(yùn)行,則CPU將被剝奪并分配給另一個(gè)進(jìn)程。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進(jìn)行切換。調(diào)度程序所要做的就是維護(hù)一張就緒進(jìn)程列表,當(dāng)進(jìn)程用完它的時(shí)間片后,它被移到隊(duì)列的末尾。
2,算法實(shí)例:
首先,先對運(yùn)行函數(shù)進(jìn)行聲明:
void RR(struct job jobs[50],int n);//時(shí)間片輪轉(zhuǎn)算法
其中n為進(jìn)程個(gè)數(shù)。
其次,以scanf函數(shù)從鍵盤得到一個(gè)時(shí)間片長度:
printf("請輸入時(shí)間片的大小:");
scanf("%d",&t);
?這里由于我用以運(yùn)行結(jié)果顯示方便,因此直接用周轉(zhuǎn)時(shí)間和帶權(quán)周轉(zhuǎn)時(shí)間的結(jié)果表示:
for (i = 0; i < n; i++) {
s += jobs[i].needtime;//s是用來確認(rèn)所有進(jìn)程全部結(jié)束
f[i] = jobs[i].needtime;//f[i]用以存儲(chǔ)單個(gè)進(jìn)程剩余所需運(yùn)行時(shí)間
}
do {
for (i = 0; i < n; i++) {
if (f[i]) { //若f[i] == 0,則說明本進(jìn)程的運(yùn)行已全部結(jié)束
//如果本進(jìn)程剩余時(shí)間比時(shí)間片大,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,本進(jìn)程剩余運(yùn)行時(shí)間減一個(gè)時(shí)間片,并將s減一個(gè)時(shí)間片
if (f[i] > t) {
time += t;
f[i] -= t;
s -= t;
}
//如果本進(jìn)程剩余時(shí)間比時(shí)間片小,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,s減一個(gè)本進(jìn)程剩余運(yùn)行時(shí)間,并將本進(jìn)程剩余運(yùn)行時(shí)間歸零
else {
time += t;
jobs[i].endtime = time;
s -= f[i];
f[i] = 0;
}
}
}
} while (s);
for (i = 0; i < n; i++) {
jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間 = 結(jié)束時(shí)間 - 到達(dá)時(shí)間
jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
}
其中time為總運(yùn)行時(shí)間。
五,對每個(gè)進(jìn)程的最終結(jié)果進(jìn)行輸出
聲明:
void print(struct job jobs[50], int n);
代碼如下:
void print(struct job jobs[50], int n)
{
int i;
double avertime;
double dqzz_avertime;
int sum_runtime = 0;
double sum_time = 0.00;
printf("作業(yè)名 到達(dá)時(shí)間 運(yùn)行時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間\n");
for (i = 0; i < n; i++)
{
printf("%s %2d %2d %2d %2d %.2f\n", jobs[i].name, jobs[i].starttime, jobs[i].needtime, jobs[i].endtime, jobs[i].runtime, jobs[i].dqzz_time);
sum_runtime = sum_runtime + jobs[i].runtime;
sum_time = sum_time + jobs[i].dqzz_time;
}
avertime = sum_runtime * 1.0 / n;
dqzz_avertime = sum_time * 1.000 / n;
printf("平均周轉(zhuǎn)時(shí)間:%.2f \n", avertime);
printf("平均帶權(quán)周轉(zhuǎn)時(shí)間:%.3f \n", dqzz_avertime);
printf("\n");
}
六,運(yùn)行結(jié)果
1,先來先服務(wù)算法:
2,短作業(yè)優(yōu)先算法:
?
3,優(yōu)先級調(diào)度算法:
?
4,時(shí)間片輪轉(zhuǎn)算法:
七,總結(jié)
每個(gè)算法都有自己的優(yōu)缺點(diǎn),我個(gè)人的話,則更傾向于優(yōu)先級調(diào)度算法,既考慮到了長進(jìn)程的等待時(shí)間,也考慮到了短作業(yè)稍稍優(yōu)先的模式。
全部運(yùn)行代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-773731.html
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
struct job {
char name[10]; //作業(yè)的名字
int starttime; //作業(yè)到達(dá)系統(tǒng)時(shí)間
int needtime; //作業(yè)服務(wù)時(shí)間
int runtime; //作業(yè)周轉(zhuǎn)時(shí)間
int endtime; //作業(yè)結(jié)束時(shí)間
double dqzz_time; //帶權(quán)周轉(zhuǎn)時(shí)間
};
void FCFS(struct job jobs[50], int n);//先來先服務(wù)算法
void SJF(struct job jobs[50], int n);//短作業(yè)優(yōu)先算法
void HRRN(struct job jobs[50],int n);//優(yōu)先調(diào)度算法
void RR(struct job jobs[50],int n);//時(shí)間片輪轉(zhuǎn)算法
void print(struct job jobs[50], int n);
int main() {
struct job jobs[50];
int n, i; //n個(gè)作業(yè)
int flag;
printf("請選擇調(diào)度算法,1:先來先服務(wù) 2:短作業(yè)優(yōu)先 3:優(yōu)先調(diào)度算法 4:時(shí)間輪轉(zhuǎn)調(diào)度算法");
scanf("%d", &flag);
printf("請輸入作業(yè)個(gè)數(shù):");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("請輸入第%d個(gè)作業(yè)的作業(yè)名:\n",i + 1);
scanf("%s", jobs[i].name); //作業(yè)名
printf("請輸入第%d個(gè)作業(yè)的到達(dá)時(shí)間:\n",i + 1);
scanf("%d", &jobs[i].starttime);//到達(dá)時(shí)間
printf("請輸入第%d個(gè)作業(yè)的服務(wù)時(shí)間:\n",i + 1);
scanf("%d", &jobs[i].needtime);//運(yùn)行(服務(wù)時(shí)間)時(shí)間
}
printf("\n");
switch (flag){
case 1:
FCFS(jobs, n);
printf("先來先服務(wù)(FCFS)算法運(yùn)行結(jié)果:\n");
print(jobs, n);
break;
case 2:
SJF(jobs, n);
printf("短作業(yè)優(yōu)先(SJF)算法運(yùn)行結(jié)果:\n");
print(jobs, n);
break;
case 3:
HRRN(jobs, n);
printf("優(yōu)先調(diào)度算法(HRRN)算法運(yùn)行結(jié)果:\n");
print(jobs, n);
break;
case 4:
RR(jobs, n);
printf("時(shí)間輪轉(zhuǎn)調(diào)度算法(RR)算法運(yùn)行結(jié)果:\n");
print(jobs, n);
break;
}
}
void FCFS(struct job jobs[50], int n){
int i = 0, j = 0;
char t_name[10];//用于交換的臨時(shí)變量
int t_time;//用于交換的臨時(shí)變量
for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
if (jobs[j].starttime < jobs[i].starttime)
{ //把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].starttime;
jobs[j].starttime = jobs[i].starttime;
jobs[i].starttime = t_time;
//把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].needtime;
jobs[j].needtime = jobs[i].needtime;
jobs[i].needtime = t_time;
strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
strcpy(jobs[j].name, jobs[i].name);
strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
}
}
}
for (i = 0; i < n; i++)
{
if (i == 0)
{ //第一個(gè)進(jìn)程
jobs[i].runtime = jobs[i].needtime; //周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
jobs[i].endtime = jobs[i].starttime + jobs[i].needtime; //結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
}
else if (jobs[i].starttime > jobs[i - 1].endtime)
{ //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
jobs[i].runtime = jobs[i].needtime;
jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;
}
else
{ //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程未運(yùn)行完畢
jobs[i].runtime = jobs[i].needtime + jobs[i - 1].endtime - jobs[i].starttime;
//周轉(zhuǎn)時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間 - 到達(dá)時(shí)間(結(jié)束時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間)
jobs[i].endtime = jobs[i].starttime + jobs[i].runtime; //結(jié)束時(shí)間 = 到達(dá)時(shí)間 + 周轉(zhuǎn)時(shí)間
}
jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
}
}
void SJF(struct job jobs[50], int n)
{
int i = 0, j = 0;
char t_name[10];//用于交換的臨時(shí)變量
int t_time;//用于交換的臨時(shí)變量
for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
if (jobs[j].starttime < jobs[i].starttime)
{ //把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].starttime;
jobs[j].starttime = jobs[i].starttime;
jobs[i].starttime = t_time;
//把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].needtime;
jobs[j].needtime = jobs[i].needtime;
jobs[i].needtime = t_time;
strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
strcpy(jobs[j].name, jobs[i].name);
strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
}
}
}
jobs[0].endtime = jobs[0].starttime + jobs[0].needtime;//結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
jobs[0].runtime = jobs[0].needtime;//周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
jobs[0].dqzz_time = jobs[0].runtime * 1.0 / jobs[0].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
for (i = 1; i < n; i++)
{
for (j = i; j < n; j++)
{
//按最短運(yùn)行時(shí)間排序
//關(guān)于jobs[i - 1].endtime > jobs[j].starttime如果到達(dá)時(shí)間太遲于上一輪的結(jié)束時(shí)間,會(huì)造成浪費(fèi)時(shí)間資源用以等待
if (jobs[i - 1].endtime > jobs[j].starttime && jobs[j].needtime < jobs[i].needtime)
{
t_time = jobs[i].starttime;
jobs[i].starttime = jobs[j].starttime;
jobs[j].starttime = t_time;
//把短的賦值到臨時(shí)變量t_time中
t_time = jobs[i].needtime;
jobs[i].needtime = jobs[j].needtime;
jobs[j].needtime = t_time;
strcpy(t_name, jobs[i].name); //將第二個(gè)參數(shù)的值復(fù)制給第一個(gè)參數(shù),返回第一個(gè)參數(shù)
strcpy(jobs[i].name, jobs[j].name);
strcpy(jobs[j].name, t_name);
} //按最短運(yùn)行時(shí)間排序
}
if (jobs[i].starttime > jobs[i - 1].endtime)
{ //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;//結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
jobs[i].runtime = jobs[i].needtime;//周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
}
else
{
jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間=結(jié)束時(shí)間-到達(dá)時(shí)間
}
jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;
}
}
void HRRN(struct job jobs[50], int n) {
int i = 0, j = 0;
double hrrn[10];//動(dòng)態(tài)優(yōu)先級
char t_name[10];//用于交換的臨時(shí)變量
int t_time;//用于交換的臨時(shí)變量
for (i = 0; i < n; i++) {
if (jobs[i].starttime == 0) {
t_time = jobs[0].starttime;
jobs[0].starttime = jobs[i].starttime;
jobs[i].starttime = t_time;
//把第一個(gè)到達(dá)的放入臨時(shí)變量t_time中
t_time = jobs[0].needtime;
jobs[0].needtime = jobs[i].needtime;
jobs[i].needtime = t_time;
strcpy(t_name, jobs[0].name);
strcpy(jobs[0].name, jobs[i].name);
strcpy(jobs[i].name, t_name);
}
}
hrrn[0] = 1;//第一個(gè)運(yùn)行的進(jìn)程不需要等待,優(yōu)先級=1
jobs[0].endtime = jobs[0].needtime;//第一個(gè)進(jìn)程的結(jié)束時(shí)間即其服務(wù)時(shí)間
for (i = 1; i < n; i++)
{
for (j = i; j < n; j++)
{
//優(yōu)先級=(等待時(shí)間+要求服務(wù)時(shí)間)/ 要求服務(wù)時(shí)間
hrrn[j] = static_cast<double>(jobs[i - 1].endtime - jobs[j].starttime + jobs[j].needtime) / jobs[j].needtime;
}//這是此時(shí)第i個(gè)進(jìn)程結(jié)束后的所有進(jìn)程的優(yōu)先級
for (int t = i + 1; t < n; t++) {
if (hrrn[t] > hrrn[i]) {
t_time = jobs[t].starttime;
jobs[t].starttime = jobs[i].starttime;
jobs[i].starttime = t_time;
//把短的賦值到臨時(shí)變量t_time中
t_time = jobs[t].needtime;
jobs[t].needtime = jobs[i].needtime;
jobs[i].needtime = t_time;
strcpy(t_name, jobs[t].name);
strcpy(jobs[t].name, jobs[i].name);
strcpy(jobs[i].name, t_name);
}//按優(yōu)先級進(jìn)行比較并排序
}
jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//第i個(gè)進(jìn)程的結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
}
for (i = 0; i < n; i++)
{
if (i == 0)
{ //第一個(gè)進(jìn)程
jobs[i].runtime = jobs[i].needtime; //周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
jobs[i].endtime = jobs[i].starttime + jobs[i].needtime; //結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
}
else if (jobs[i].starttime > jobs[i - 1].endtime)
{ //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
jobs[i].runtime = jobs[i].needtime;
jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;
}
else
{ //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程未運(yùn)行完畢
jobs[i].runtime = jobs[i].needtime + jobs[i - 1].endtime - jobs[i].starttime;
//周轉(zhuǎn)時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間 - 到達(dá)時(shí)間(結(jié)束時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間)
jobs[i].endtime = jobs[i].starttime + jobs[i].runtime; //結(jié)束時(shí)間 = 到達(dá)時(shí)間 + 周轉(zhuǎn)時(shí)間
}
jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
}
}
void RR(struct job jobs[50], int n) {
int t, s = 0, time = 0;
int f[1000];
printf("請輸入時(shí)間片的大?。?);
scanf("%d",&t);
int i = 0, j = 0;
for (i = 0; i < 1000; i++) {
f[i] = 0;
}
char t_name[10];//用于交換的臨時(shí)變量
int t_time;//用于交換的臨時(shí)變量
for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面
{
if (jobs[j].starttime < jobs[i].starttime)
{ //把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].starttime;
jobs[j].starttime = jobs[i].starttime;
jobs[i].starttime = t_time;
//把到達(dá)時(shí)間早的賦值到t_time
t_time = jobs[j].needtime;
jobs[j].needtime = jobs[i].needtime;
jobs[i].needtime = t_time;
strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
strcpy(jobs[j].name, jobs[i].name);
strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
}
}
}
for (i = 0; i < n; i++) {
s += jobs[i].needtime;//s是用來確認(rèn)所有進(jìn)程全部結(jié)束
f[i] = jobs[i].needtime;//f[i]用以存儲(chǔ)單個(gè)進(jìn)程剩余所需運(yùn)行時(shí)間
}
do {
for (i = 0; i < n; i++) {
if (f[i]) { //若f[i] == 0,則說明本進(jìn)程的運(yùn)行已全部結(jié)束
//如果本進(jìn)程剩余時(shí)間比時(shí)間片大,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,本進(jìn)程剩余運(yùn)行時(shí)間減一個(gè)時(shí)間片,并將s減一個(gè)時(shí)間片
if (f[i] > t) {
time += t;
f[i] -= t;
s -= t;
}
//如果本進(jìn)程剩余時(shí)間比時(shí)間片小,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,s減一個(gè)本進(jìn)程剩余運(yùn)行時(shí)間,并將本進(jìn)程剩余運(yùn)行時(shí)間歸零
else {
time += t;
jobs[i].endtime = time;
s -= f[i];
f[i] = 0;
}
}
}
} while (s);
for (i = 0; i < n; i++) {
jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間 = 結(jié)束時(shí)間 - 到達(dá)時(shí)間
jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
}
}
void print(struct job jobs[50], int n)
{
int i;
double avertime;
double dqzz_avertime;
int sum_runtime = 0;
double sum_time = 0.00;
printf("作業(yè)名 到達(dá)時(shí)間 運(yùn)行時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間\n");
for (i = 0; i < n; i++)
{
printf("%s %2d %2d %2d %2d %.2f\n", jobs[i].name, jobs[i].starttime, jobs[i].needtime, jobs[i].endtime, jobs[i].runtime, jobs[i].dqzz_time);
sum_runtime = sum_runtime + jobs[i].runtime;
sum_time = sum_time + jobs[i].dqzz_time;
}
avertime = sum_runtime * 1.0 / n;
dqzz_avertime = sum_time * 1.000 / n;
printf("平均周轉(zhuǎn)時(shí)間:%.2f \n", avertime);
printf("平均帶權(quán)周轉(zhuǎn)時(shí)間:%.3f \n", dqzz_avertime);
printf("\n");
}
(本文僅供學(xué)習(xí)時(shí)參考,如有錯(cuò)誤,純屬作者技術(shù)不到位,不足之處請多指教,謝謝)文章來源地址http://www.zghlxwxcb.cn/news/detail-773731.html
到了這里,關(guān)于操作系統(tǒng)有關(guān)進(jìn)程調(diào)度算法(含先來先服務(wù),短作業(yè)優(yōu)先,優(yōu)先級調(diào)度算法和時(shí)間片輪轉(zhuǎn)調(diào)度算法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!