一、实验目的及要求
了解进程调度的概念和方法,通过本实验以加深对进程调度的理解。
二、实验原理与内容(题目)
通过编写c语言程序,实现先来先服务的进程调度算法。
三、实验过程(实验代码)
(一)新建c文件,FCFS.c
(二)写一个PCB结构体,用于记录必要的进程信息
/**
* 进程的超简化PCB结构
**/
typedef struct FCFS{
char processName[20]; //进程名
struct FCFS *next; //下一进程
}PCB;
(三)写一个inputProcess函数,用于接收进程的输入
/**
* 输入进程
*
**/
void inputProcess(PCB *L){
PCB *follow = L; //
PCB *P;
char processName[15];
printf("Please input the process and input end to exit \n\n");
for(int i = 1;strcmp(processName,"end");i++){
//输入进程名称
printf("the No.%d processName: ",i);
scanf("%s",processName);
if (!strcmp(processName,"end")){
break;
}
P=(PCB*)malloc(sizeof(PCB));
strcpy(P->processName,processName);
//将进程连接到队列下一个
follow->next = P;
P->next = NULL;
follow = P;
}
}
(四)写一个outputProcess函数,用于输出FCFS算法调度下进程运行的序列。
/**
* 输出进程运行顺序
*
**/
void outputProcess(PCB *L){
PCB *p;
p= L->next;
printf("the process sequence: \n");
while (p)
{
printf("%-15s", p->processName);
p=p->next;
}
printf("\n");
}
(五)写一个main方法,调用函数实现FCFS算法
int main(int argc, char const *argv[]){
//初始化进程PCB队列
PCB *L = (PCB*)malloc(sizeof(PCB));
L->next = NULL;
//输入进程
inputProcess(L);
//如果队列非空,输出进程运行序列
if( L->next != NULL){
outputProcess(L);
}
return 0;
}
(六)运行程序,记录结果。
五、测试/调试及实验结果分析
此次实验的测试/调试结果完全符合预期,从截图可以看出进程的运行顺序是按照进程进入系统的顺序来的,这符合先来先服务调度算法的思想。
六、实验结论与体会
先来先服务调度算法是按照作业到达的先后顺序进行调度,或者说是考虑在系统中等待时间最长的进程。在这个实验程序这里,等待时间的定义并不是位于同一时间的,而是总的等待时间。先来先服务调度算法考虑的是当下等待时间最长的作业,而不管作业所需运行时间的长短。这种调度算法具有片面性。
在实现这个算法时,我切身体会到了先来先服务算法的特点,FCFS的特点是每次调度都是从就绪的进程对列选择一个最先进入该队列的进程。但这样的调度方式也会有明显的缺点,不考虑作业所需要执行时间的长短,就会导致进程处理的效率低下。