計算機操作原理進程調度算法---先來先服務,短進程優先(C語言)


 

目錄

先來先服務調度算法:

短進程優先調度算法:

兩種進程調度算法優缺點

思維導圖

程序代碼: 


先來先服務調度算法

先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度,也可用於進程調度。當在作業調度中采用該算法時,每次調度都是從后備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,為它們分配資源、創建進程,然后放入就緒隊列。在進程調度中采用FCFS算法時,則每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞后才放棄處理機。

 

短進程優先調度算法:

短作業(進程)優先調度算法SJ(P)F,是指對短作業或短進程優先調度的算法。它們可以分別用於作業調度和進程調度。短作業優先(SJF)的調度算法是從后備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。而短進程優先(SPF)調度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執行並一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新調度。

兩種進程調度算法優缺點

 

優點

缺點

先來先服務調度算法

  1. 公平,實現簡單,有利於長進程調度
  2. 有利與CPU繁忙型進程,用於批處理系統
  1. 不考慮等待時間和執行時間,會產生飢餓現象,不利於處理短進程調度。
  2. 不利於I/O繁忙型進程,不適於分時系統。

短進程優先調度算法

  1. 有利於短進程調度
  2. 對預計執行時間短的進程有限分配處理機,通常后來的短進程不會搶先正在執行的進程
  1. 完全未考慮作業(進程)的緊迫程度,因而不能保證緊迫性作業(進程)會被及時處理。
  2. 不利於長進程調度

思維導圖

程序代碼: 



/*
實驗題目:先來先服務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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM