目錄
先來先服務調度算法:
先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度,也可用於進程調度。當在作業調度中采用該算法時,每次調度都是從后備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,為它們分配資源、創建進程,然后放入就緒隊列。在進程調度中采用FCFS算法時,則每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞后才放棄處理機。
短進程優先調度算法:
短作業(進程)優先調度算法SJ(P)F,是指對短作業或短進程優先調度的算法。它們可以分別用於作業調度和進程調度。短作業優先(SJF)的調度算法是從后備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。而短進程優先(SPF)調度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執行並一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新調度。
兩種進程調度算法優缺點
|
優點 |
缺點 |
先來先服務調度算法 |
|
|
短進程優先調度算法 |
|
|
思維導圖
程序代碼:
/*
實驗題目:先來先服務FCFS和短作業優先SJF進程調度算法
*******實驗要求*********
1. 先來先服務調度算法FCFS:
1)是一種最簡單的調度算法,適用於作業調度和進程調度
2)每次調度都是從后備隊列中選擇一個或者多個最先進入該隊列的作業,將它們調入內存,分配資源,創建進程,然后放入就緒隊列
3)FCFS算法比較有利於長作業(進程),不利於短作業(進程)
4)既可用於作業調度,也可用於進程調度
2. 周轉時間 = 完成時間 - 到達時間
帶權周轉時間 = 周轉時間/服務時間
*/
#include<stdio.h>
#include <stdlib.h> //malloc的頭文件
#include <time.h>
#include <math.h>
struct node { //進程控制塊
char name;
double arr; //到達時間
double ing; //服務時間
double finish;//結束時間
double round; //周轉時間
double daiquan;//帶權周轉時間
double pingjunround; //平均周轉時間
double pingjundaiquan; //平均帶權周轉時間
}ai[100];
node t;
void FCFS()
{
int n,i;
printf("請輸入進程個數:\n");
scanf("%d", &n);
printf("請輸入%d個進程的名字\n", n);
for (i = 0;i<n;i++)
{
getchar();
scanf("%s",&ai[i].name);
ai[i].arr = (double)(rand()%10 + 1); //隨機
ai[i].ing = (double)(rand()%10 + 1); //隨機
}
//排序
for (i = 1; i < n; i++)
{
for (int j = 0; j < n - i; j++)
{
if (ai[j].arr > ai[j + 1].arr)
{
t = ai[j];
ai[j] = ai[j + 1];
ai[j + 1] = t;
}
}
}
printf("進程名 \t到達時間\t服務時間\t結束時間\t周轉時間\t平均周轉時間\t帶權周轉時間\t平均帶權周轉時間\n");
ai[0].finish =ai[0].arr+ai[0].ing;
ai[0].round=ai[0].finish-ai[0].arr;
ai[0].daiquan=ai[0].round/ai[0].ing;
ai[0].pingjunround=ai[0].round;
ai[0].pingjundaiquan=ai[0].daiquan;
printf("%c \t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf\n",ai[0].name,ai[0].arr,ai[0].ing,ai[0].finish,ai[0].round,ai[0].pingjunround,ai[0].daiquan,ai[0].pingjundaiquan);
for (i = 1;i<n;i++)
{
ai[i].finish = ai[i-1].finish + ai[i].ing;
ai[i].round = ai[i].finish - ai[i].arr;
ai[i].daiquan = ai[i].round / ai[i].ing;
ai[i].pingjunround=(ai[i].round+ai[i-1].round)/(double)(i+1);
ai[i].pingjundaiquan=(ai[i].daiquan+ai[i-1].daiquan)/(double)(i+1);
printf("%c \t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf\n",ai[i].name,ai[i].arr,ai[i].ing,ai[i].finish,ai[i].round,ai[i].pingjunround,ai[i].daiquan,ai[i].pingjundaiquan);
}
}
void SPF()
{
int n,i,time=0;
printf("請輸入進程個數:\n");
scanf("%d", &n);
printf("請輸入%d個進程的名字\n", n);
for (i = 0;i<n;i++)
{
getchar();
scanf("%s",&ai[i].name);
ai[i].arr = (double)(rand()%10 + 1);
ai[i].ing = (double)(rand()%10 + 1);
}
for ( i = 1; i<n; i++)
{
for (int j = 0; j<n - i; j++)
{
if (ai[j].arr>ai[j + 1].arr)//將到達時間短的交換到前邊
{
t = ai[j];
ai[j] = ai[j + 1];
ai[j + 1] = t;
}
}
for (int k = 0; k < n - i; k++)
{
if ((ai[k].ing > ai[k + 1].ing) && (ai[k].arr >= ai[k + 1].arr))//將服務時間短的交換到前邊
{
t = ai[k];
ai[k] = ai[k + 1];
ai[k + 1] = t;
}
}
}
printf("進程名 \t到達時間\t服務時間\t結束時間\t周轉時間\t平均周轉時間\t帶權周轉時間\t平均帶權周轉時間\n");
ai[0].finish =ai[0].arr+ai[0].ing;
ai[0].round=ai[0].finish-ai[0].arr;
ai[0].daiquan=ai[0].round/ai[0].ing;
ai[0].pingjunround=ai[0].round;
ai[0].pingjundaiquan=ai[0].daiquan;
printf("%c \t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf\n",ai[0].name,ai[0].arr,ai[0].ing,ai[0].finish,ai[0].round,ai[0].pingjunround,ai[0].daiquan,ai[0].pingjundaiquan);
for (i = 1; i < n; i++) //排序
{
for (int j = i; j < n - 1; j++)
{
for (int d = i + 1; d<n; d++)
if ((ai[i - 1].finish >= ai[j].arr) && (ai[i - 1].finish >= ai[d].arr) && (ai[j].ing > ai[d].ing))
{
t = ai[j];
ai[j] = ai[d];
ai[d] = t;
}
}
if (ai[i].arr<ai[i - 1].finish) //當前到達時間在上一個作業結束時間之前
{
ai[i].finish = ai[i - 1].finish + ai[i].ing;
ai[i].round = ai[i].finish - ai[i].arr;
ai[i].daiquan = ai[i].round / ai[i].ing;
ai[i].pingjunround=(ai[i].round+ai[i-1].round)/(double)(i+1);
ai[i].pingjundaiquan=(ai[i].daiquan+ai[i-1].daiquan)/(double)(i+1);
}
else //當前到達時間在上一個作業結束時間之后
{
ai[i].finish = ai[i].arr + ai[i].ing;
ai[i].round = ai[i].finish - ai[i].arr;
ai[i].daiquan = ai[i].round / ai[i].ing;
ai[i].pingjunround=(ai[i].round+ai[i-1].round)/(double)(i+1);
ai[i].pingjundaiquan=(ai[i].daiquan+ai[i-1].daiquan)/(double)(i+1);
}
}
for (i = 1;i<n;i++)
{
printf("%c \t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf \t\t%.2lf\n",ai[i].name,ai[i].arr,ai[i].ing,ai[i].finish,ai[i].round,ai[i].pingjunround,ai[i].daiquan,ai[i].pingjundaiquan);
}
}
int main()
{
srand( (unsigned)time( NULL ) ); //隨機
printf("請選擇算法“1-FCFS,2-SPF”\n");
int choose;
scanf("%d",&choose);
if(choose==1){ FCFS(); }
else if(choose==2) { SPF(); }
return 0;
}