操作系统:FCFS调度算法简单实现
由于本人(小白一个)一直以来想要写博客,加上最近学习操作系统,为了巩固自己的学习成果以及加深印象,现在决定开始写博客,可以说这是我的第一篇博客。
这篇文章主要描述的计算机操作系统的FCFS(先来先服务)的调度算法,可以用在进程调度和作业调度中。它的基本思想是按进程或作业到达的时间先后顺序进行调度。
下面就详细讲下本小白实现此简单算法的基本功能,过程以及思想。 基本功能: 1、输出每个进程的调度时间表 2、上一个进程结束前,下一个进程还没有到达,程序计算周转时间仍然正确
3、进程可以不按到达时间大小排列输入,输出的调度时间表依然正确
首先我们得知道进程是怎么构造的,在这篇文章中我是以结构体数组的形式来构造多个进程,结构体里的各个成分分别表示进程的基本信息,数组的大小为常数 5。 以下是我的进程具体构造:
struct PCB { char name[8 ]; int arrive_time; int run_time; int finish_time; int zhouzhuan_time; float daiquan_time; }; #define N 5 struct PCB pcb [N ],temp ;
输入进程功能:自定义一个输入函数,设置for循环语句,循环输入,很容易实现
void input () { int i; cout<<"--------------------------------------" <<endl; cout<<" FCFS调度算法 " <<endl; cout<<"--------------------------------------" <<endl; cout<<" 输入五个进程信息:" <<endl; for ( i=0 ;i<N;i++) { printf ("请输入进程名:\n" ); scanf ("%s" ,pcb[i].name); printf ("请输入到达时间:" ); scanf ("%d" ,&pcb[i].arrive_time); printf ("请输入要运行时间:" ); scanf ("%d" ,&pcb[i].run_time); } cout<<"各进程:" <<endl; for ( i=0 ;i<N;i++) { printf ("%s " ,pcb[i].name); printf ("%d " ,pcb[i].arrive_time); printf ("%d \n" ,pcb[i].run_time); } }
要实现进程无需按到达时间先后输入,则需要将输入的进程按照到达时间先后进行排序,然后计算各个进程的各个时间。这里我设置了一个排序自定义函数。
void sort () { for (int i=0 ;i<N-1 ;i++) { for (int j=i+1 ;j<N;j++) { if (pcb[i].arrive_time>pcb[j].arrive_time) { temp=pcb[i]; pcb[i]=pcb[j]; pcb[j]=temp; } } } }
输出调度时间顺序时间表则设置一个进程输出函数,具体实现如下:
void output () { int i; cout<<"FCFS调度算法:" <<endl; pcb[0 ].finish_time=pcb[0 ].arrive_time+pcb[0 ].run_time; pcb[0 ].zhouzhuan_time=pcb[0 ].finish_time-pcb[0 ].arrive_time; pcb[0 ].daiquan_time=(float )pcb[0 ].zhouzhuan_time/pcb[0 ].run_time; for (i=1 ;i<N;i++) { if (pcb[i].arrive_time>pcb[i-1 ].finish_time) { pcb[i].finish_time=pcb[i].arrive_time+pcb[i].run_time; pcb[i].zhouzhuan_time=pcb[i].run_time; pcb[i].daiquan_time=(float )pcb[i].zhouzhuan_time/pcb[i].run_time; } else { pcb[i].finish_time=pcb[i-1 ].finish_time+pcb[i].run_time; pcb[i].zhouzhuan_time=pcb[i].finish_time-pcb[i].arrive_time; pcb[i].daiquan_time=(float )pcb[i].zhouzhuan_time/pcb[i].run_time; } } for (i=0 ;i<N;i++) { sumzhouzhuantime+=pcb[i].zhouzhuan_time; sumdaiquanzhouzhuantime+=pcb[i].daiquan_time; } printf ("----------------------------------------------------------------\n" ); printf ("进程名 到达时间 运行时间 完成时间 周转时间 带权周转时间 \n" ); printf ("----------------------------------------------------------------\n" ); for (i=0 ;i<N;i++) { printf (" %s %d %d %d %d %.2f\n" ,pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time,pcb[i].daiquan_time); } cout<<"平均周转时间:" <<sumzhouzhuantime/N<<endl; cout<<"平均带权周转时间:" <<sumdaiquanzhouzhuantime/N<<endl; printf ("----------------------------------------------------------------\n" ); }
到这就大功告成了,在主函数中执行这些函数就行了。 下面是总的代码(方便大家学习):
#include <iostream> using namespace std;#define N 5 struct PCB { char name[8 ]; int arrive_time; int run_time; int finish_time; int zhouzhuan_time; float daiquan_time; }; float sumzhouzhuantime,sumdaiquanzhouzhuantime;struct PCB pcb [N ],temp ;void input () ; void sort () ; void output () ; void main () { input (); sort ( ); output (); } void input () { int i; cout<<"--------------------------------------" <<endl; cout<<" FCFS调度算法 " <<endl; cout<<"--------------------------------------" <<endl; cout<<" 输入五个进程信息:" <<endl; for ( i=0 ;i<N;i++) { printf ("请输入进程名:\n" ); scanf ("%s" ,pcb[i].name); printf ("请输入到达时间:" ); scanf ("%d" ,&pcb[i].arrive_time); printf ("请输入要运行时间:" ); scanf ("%d" ,&pcb[i].run_time); } cout<<"各进程:" <<endl; for ( i=0 ;i<N;i++) { printf ("%s " ,pcb[i].name); printf ("%d " ,pcb[i].arrive_time); printf ("%d \n" ,pcb[i].run_time); } } void sort () { for (int i=0 ;i<N-1 ;i++) { for (int j=i+1 ;j<N;j++) { if (pcb[i].arrive_time>pcb[j].arrive_time) { temp=pcb[i]; pcb[i]=pcb[j]; pcb[j]=temp; } } } } void output () { int i; cout<<"FCFS调度算法:" <<endl; pcb[0 ].finish_time=pcb[0 ].arrive_time+pcb[0 ].run_time; pcb[0 ].zhouzhuan_time=pcb[0 ].finish_time-pcb[0 ].arrive_time; pcb[0 ].daiquan_time=(float )pcb[0 ].zhouzhuan_time/pcb[0 ].run_time; for (i=1 ;i<N;i++) { if (pcb[i].arrive_time>pcb[i-1 ].finish_time) { pcb[i].finish_time=pcb[i].arrive_time+pcb[i].run_time; pcb[i].zhouzhuan_time=pcb[i].run_time; pcb[i].daiquan_time=(float )pcb[i].zhouzhuan_time/pcb[i].run_time; } else { pcb[i].finish_time=pcb[i-1 ].finish_time+pcb[i].run_time; pcb[i].zhouzhuan_time=pcb[i].finish_time-pcb[i].arrive_time; pcb[i].daiquan_time=(float )pcb[i].zhouzhuan_time/pcb[i].run_time; } } for (i=0 ;i<N;i++) { sumzhouzhuantime+=pcb[i].zhouzhuan_time; sumdaiquanzhouzhuantime+=pcb[i].daiquan_time; } printf ("----------------------------------------------------------------\n" ); printf ("进程名 到达时间 运行时间 完成时间 周转时间 带权周转时间 \n" ); printf ("----------------------------------------------------------------\n" ); for (i=0 ;i<N;i++) { printf (" %s %d %d %d %d %.2f\n" ,pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time,pcb[i].daiquan_time); } cout<<"平均周转时间:" <<sumzhouzhuantime/N<<endl; cout<<"平均带权周转时间:" <<sumdaiquanzhouzhuantime/N<<endl; printf ("----------------------------------------------------------------\n" ); }
运行结果如下: 这段程序有个问题不能实现任意数量进程的输入,不就我就会更新。 小白还在学习阶段,有很多问题,希望大家能够指出,谢谢大家,一起加油!