創(chuàng)作不易,本篇文章如果幫助到了你,還請點贊 關(guān)注支持一下?>??<)!!
主頁專欄有更多知識,如有疑問歡迎大家指正討論,共同進步!
??c++系列專欄:C/C++零基礎(chǔ)到精通 ??給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
c語言內(nèi)容??:
專欄:c語言之路重點知識整合
【c語言】全部知識點總結(jié)
一、先到先服務(wù)進程調(diào)度算法
先來先服務(wù)進程調(diào)度算法(FCFS)是按照進程到達(dá)的先后順序進行調(diào)度的算法。
當(dāng)一個進程到達(dá)時,它會被放到進程隊列的末尾,并在前面等待其他進程執(zhí)行完畢。
一旦輪到該進程執(zhí)行,它會一直執(zhí)行直到完成,或者被阻塞,或者需要等待I/O操作完成。
#include <stdlib.h>
#include <stdio.h>
typedef struct
{ // 定義一個結(jié)構(gòu)體,里面包含的有一個進程相關(guān)的信息
char name[10]; //進程名稱 (輸入)
float arrivetime; //到達(dá)時間 (輸入)
float servicetime; //服務(wù)時間 (輸入)
float starttime; //開始時間
float finishtime; //結(jié)束時間
float zztime; //周轉(zhuǎn)時間=finishtime-arrivetime
float dqzztime; //帶權(quán)周轉(zhuǎn)時間=zztime/servicetime
}pcb;
//輸入進程信息
void input(pcb* p, int N) //p為pdb數(shù)組名, N為pcb數(shù)組的元素個數(shù)
{
int i;
printf("\n");
printf("請輸入進程的名字 到達(dá)時間 服務(wù)時間: (例如: 進程1 0 100)\n");
for (i = 0; i <= N - 1; i++)
{
printf("請輸入進程%d的信息:", i + 1); // i=0時,輸入第1個進程相關(guān)信息
scanf("%s", &p[i].name);
scanf("%f", &p[i].arrivetime);
scanf("%f", &p[i].servicetime);
}
}
//排序: 按照進程的arrivetime(從小到大)對pcb數(shù)組中的N個進程進行排序
void sort(pcb* p, int N)
{
for (int i = 0; i < N - 1; i++)
{
for (int j = i + 1; j < N; j++)
{
if (p[i].arrivetime > p[j].arrivetime)
{
pcb temp;
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
}
//運行
void run(pcb* p, int N)
{
int k;
for (k = 0; k <= N - 1; k++)
{
if (k == 0) //第1個進程
{
p[k].starttime = p[k].arrivetime; //第1個進程到達(dá)之后即可執(zhí)行
p[k].finishtime = p[k].starttime + p[k].servicetime;
}
else
{
p[k].starttime = (p[k - 1].finishtime >= p[k].arrivetime) ? p[k - 1].finishtime : p[k].arrivetime;
p[k].finishtime = p[k].starttime + p[k].servicetime;
}
}
for (k = 0; k <= N - 1; k++)
{
p[k].zztime = p[k].finishtime - p[k].arrivetime;
p[k].dqzztime = p[k].zztime / p[k].servicetime;
}
}
//顯示
void Print(pcb* p, int N)
{
int k;
printf("調(diào)用先來先服務(wù)算法以后進程運行的順序是: ");
printf("%s", p[0].name); //首先運行第一個進程p[0]
for (k = 1; k < N; k++)
{
printf("-->");
printf("%s", p[k].name); //輸出 -->p[k].name
}
printf("\n");
printf("具體進程調(diào)度信息:\n");
printf("進程名 到達(dá)時間 服務(wù)時間 開始時間 結(jié)束時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間\n");
for (k = 0; k <= N - 1; k++)
{
printf("%4s", p[k].name);
printf("%10.3f", p[k].arrivetime);
printf("%10.3f", p[k].servicetime);
printf("%10.3f", p[k].starttime);
printf("%10.3f", p[k].finishtime);
printf("%10.3f", p[k].zztime);
printf("%10.3f\n", p[k].dqzztime);
}
}
//先來先服務(wù)算法FCFS
void FCFS(pcb* p, int N)
{
sort(p, N);
run(p, N);
Print(p, N);
int k;
float Attime = 0; //平均周轉(zhuǎn)時間
float AQttime = 0; //平均帶權(quán)周轉(zhuǎn)時間
for (k = 0; k <= N - 1; k++)
{
Attime += p[k].zztime;
AQttime += p[k].dqzztime;
}
Attime = Attime / N;
AQttime = AQttime / N;
printf("調(diào)用先來先服務(wù)算法的平均周轉(zhuǎn)時間為:");
printf("%.3f\n", Attime);
printf("調(diào)用先來先服務(wù)算法的平均帶權(quán)周轉(zhuǎn)時間為:");
printf("%.3f\n", AQttime);
}
int main()
{
pcb a[100]; //a為pcb數(shù)組 a[0]~a[N-1]對象第1個進程到第N個進程的信息
int N; //N為進程數(shù)目
printf("\n");
printf("\n");
printf("<<----------先到先服務(wù)調(diào)度算法---------->>");
printf("\n");
printf("請輸入進程數(shù)目:");
scanf("%d", &N);
input(a, N); //a是pcb數(shù)組名,N是實際使用數(shù)組元素個數(shù)
FCFS(a, N); //fcfs模擬調(diào)度
return 0;
}
二、短進程優(yōu)先調(diào)度算法
短進程優(yōu)先調(diào)度算法(SPN)是根據(jù)進程執(zhí)行時間短的優(yōu)先級進行調(diào)度的算法。
當(dāng)一個進程到達(dá)時,系統(tǒng)會估算其執(zhí)行時間,如果短于當(dāng)前正在執(zhí)行的進程,那么該進程就會優(yōu)先執(zhí)行。如果有多個進程具有相同的最短執(zhí)行時間,那么默認(rèn)使用FCFS算法。
#include <stdlib.h>
#include <stdio.h>
//定義一個結(jié)構(gòu)體:PCB
typedef struct{
char name[10];
float arrivetime;
float servicetime;
float starttime;
float finishtime;
float zztime;
float dqzztime;
}pcb;
//***輸入進程信息,將N個進程的信息寫入pcb型數(shù)組***
void input(pcb *p,int N)
{
int i;
printf("\n");
printf("請輸入進程的名字 到達(dá)時間 服務(wù)時間: (例如: a 0 100)\n");
for(i=0; i <= N-1; i++)
{
printf("請輸入進程%d的信息:", i+1);
scanf("%s", &p[i].name);
scanf("%f", &p[i].arrivetime);
scanf("%f", &p[i].servicetime);
}
}
//***優(yōu)先級排序***
void sort(pcb *p, int N)
{
/*
1、對pcb型數(shù)組中的元素進行一個簡單的排序
找到優(yōu)先級最高的進程
并把其他進程也進行簡單排序,方便后續(xù)工作
*/
//排序: N次循環(huán),每次找到從i到N-1中優(yōu)先級最高的進程,放到p[i]
for(int i=0;i<=N-1;i++)
{
//循環(huán)比較剩余的變量 //排序后:從0~N-1 arrivetime增加 , arrivetime相同時, servicetime短的優(yōu)先
for(int j=i+1;j<N;j++)
{
if(p[i].arrivetime>p[j].arrivetime || (p[i].arrivetime==p[j].arrivetime && p[i].servicetime>p[j].servicetime) )
{
//p[j]的優(yōu)先級高于p[i],因此把p[j]放到p[i]
pcb temp;
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
/*
2、每個進程運行完成之后,找到當(dāng)前時刻已經(jīng)到達(dá)的最短進程
P[0]優(yōu)先級最高,p[0].finishtime=p[0].arrivetime+p[0].servicetime
m!=0時:p[m].finishtime=p[m-1].finishtime+p[m].servicetime
*/
for(int m=0; m<N-1; m++)
{
if(m == 0)
p[m].finishtime = p[m].arrivetime + p[m].servicetime;
else
p[m].finishtime = ((p[m-1].finishtime >= p[m].arrivetime)? p[m-1].finishtime: p[m].arrivetime) + p[m].servicetime;
//(1)找到p[m].finishtime時刻哪些進程已經(jīng)到達(dá)
int i=0; //i統(tǒng)計 p[m].finishtime時刻有幾個進程已經(jīng)到達(dá)
//從下一個進程p[m+1]開始尋找
for(int n = m+1; n <= N-1; n++)
{
if(p[n].arrivetime <= p[m].finishtime)
i++;
else
break;
/*由于在第1步已經(jīng)對進程按照到達(dá)時間進行了排序
故:當(dāng)p[n].arrivetime > p[m].finishtime時,
說明p[n]進程和其后面的其他進程都未到達(dá)。
i的值為p[m].finishtime時刻已經(jīng)到達(dá)的進程數(shù)目。
*/
}
//(2)找到p[m].finishtime時刻已經(jīng)到達(dá)的最短進程
float min = p[m+1].servicetime; //next進程服務(wù)時間為p[m+1].servicetime (初值)
int next = m+1; //next進程為m+1 (初值)
//p[m+1]至p[m+i]這i個已到達(dá)進程中找到最短進程
for(int k = m+1; k < m+i; k++) //k為m+1 ~ m+i-1
{
//min的初值是p[m+1].servicetime, k+1為m+2 ~m+i
if(p[k+1].servicetime < min)
{
min = p[k+1].servicetime;
next = k+1;
}
}
//(3)把最短進程放在p[m+1]進程處
pcb temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
}
//***運行***
void run(pcb *p, int N)
{
int k;
//計算各進程的開始時間和結(jié)束時間
for(k=0; k <= N-1; k++)
{
if(k==0) //第1個進程
{
p[k].starttime = p[k].arrivetime; //第1個進程到達(dá)之后即可執(zhí)行
p[k].finishtime = p[k].starttime + p[k].servicetime;
}
else
{
p[k].starttime = (p[k-1].finishtime >= p[k].arrivetime)? p[k-1].finishtime: p[k].arrivetime;
p[k].finishtime = p[k].starttime + p[k].servicetime;
}
}
//計算各進程的周轉(zhuǎn)時間和帶權(quán)周轉(zhuǎn)時間
for(k=0; k<=N-1; k++)
{
p[k].zztime = p[k].finishtime - p[k].arrivetime;
p[k].dqzztime = p[k].zztime / p[k].servicetime;
}
}
//***顯示***
void Print(pcb *p, int N)
{
int k;
printf("調(diào)用最短進程優(yōu)先算法以后進程運行的順序是: ");
printf("%s",p[0].name);
for(k=1;k<N;k++)
{
printf("-->");
printf("%s", p[k].name);
}
printf("\n");
printf("具體進程調(diào)度信息:\n");
printf("進程名 到達(dá)時間 服務(wù)時間 開始時間 結(jié)束時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間\n");
for(k=0; k<=N-1; k++)
{
printf("%4s", p[k].name);
//%m.nf:輸出共占m列,其中有n位小數(shù),如數(shù)值寬度小于m左端補空格
printf("%10.3f", p[k].arrivetime);
printf("%10.3f", p[k].servicetime);
printf("%10.3f", p[k].starttime);
printf("%10.3f", p[k].finishtime);
printf("%10.3f", p[k].zztime);
printf("%10.3f\n", p[k].dqzztime);
}
}
//***短進程優(yōu)先***
void sjff(pcb *p,int N)
{
sort(p, N);
run(p, N);
Print(p, N);
int k;
float Attime = 0; // 平均周轉(zhuǎn)時間
float AQttime = 0; //平均帶權(quán)周轉(zhuǎn)時間
for(k=0; k<=N-1; k++)
{
Attime += p[k].zztime;
AQttime += p[k].dqzztime;
}
Attime = Attime/N;
AQttime = AQttime/N;
printf("調(diào)用短進程優(yōu)先算法的平均周轉(zhuǎn)時間為:");
printf("%.3f\n", Attime);
printf("調(diào)用短進程優(yōu)先算法的平均帶權(quán)周轉(zhuǎn)時間為:");
printf("%.3f\n", AQttime);
}
//***主函數(shù)***
int main()
{
//定義一個pcb型數(shù)組a
pcb a[100];
int N; //進程數(shù)目
printf("\n");
printf("\n");
printf("<<----------******短進程優(yōu)先調(diào)度算法******---------->>");
printf("\n");
printf("輸入進程數(shù)目:");
scanf("%d", &N);
input(a, N);
sjff(a, N);
return 0;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-525845.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-525845.html
大家的點贊、收藏、關(guān)注將是我更新的最大動力! 歡迎留言或私信建議或問題。 |
大家的支持和反饋對我來說意義重大,我會繼續(xù)不斷努力提供有價值的內(nèi)容!如果本文哪里有錯誤的地方還請大家多多指出(●'?'●) |
到了這里,關(guān)于【操作系統(tǒng)】c語言--進程調(diào)度算法(FCFS和SPN)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!