操作系统实验:FCFS与短作业优先进程调度算法实现

需积分: 50 3 下载量 59 浏览量 更新于2024-09-12 收藏 2KB TXT 举报
本文档是关于操作系统中作业进程调度的实验描述,主要涉及两种调度算法:先来先服务(FCFS)算法和短作业优先(SJF)算法。FCFS算法按照作业到达的顺序进行执行,而SJF算法则优先执行服务时间较短的作业,以提高系统的效率。代码部分展示了FCFS算法的实现,包括结构体定义、调度函数以及获取输入信息的函数。 在操作系统中,进程调度是核心功能之一,它的主要任务是决定哪个进程在何时获得CPU执行。调度的目标通常包括减少平均等待时间、周转时间以及提高系统吞吐量等。本文档中的FCFS算法是最简单的调度策略,它按照作业到达的先后顺序进行处理,不考虑其他因素。这种算法实现简单,但可能导致长作业等待时间过长,效率较低。 FCFS算法的实现中,定义了一个结构体`pcb`,代表进程控制块,包含进程ID、名称、状态、到达时间、开始时间、完成时间、服务时间和两个周转时间相关的浮点数。`time`变量表示当前系统时间,`n`表示进程数量,`head`指向链表的头结点,用于存储所有进程的信息。`run_fcfs`函数负责执行FCFS调度,更新进程的状态和时间,并打印相关信息。`fcfs`函数遍历链表,对每个状态为'F'(即就绪)的进程调用`run_fcfs`进行调度。 在实际操作系统中,除了FCFS之外,还有多种调度算法,如短作业优先(SJF)、优先级调度、轮转法(RR)等。短作业优先算法可以降低平均等待时间,但可能会导致长作业长时间得不到执行,形成饥饿现象。在实验中,可能需要编写类似的代码来实现SJF算法,以比较不同算法的效果。 实验中,`getInfo`函数可能是用于获取用户输入的进程信息,如进程ID、到达时间和服务时间等,以便构建进程链表。这部分内容没有给出具体的实现,但在实际运行时是必不可少的,因为它决定了调度器将处理哪些进程及其属性。 通过这样的实验,学生可以深入理解进程调度的基本原理和不同算法的性能差异,为后续学习操作系统中的高级调度概念打下基础。同时,编程实现也能锻炼学生的编程能力和问题解决能力。
1135 浏览量
#include //定义一个结构体 struct sjf{ char name[10]; //进程名 float arrivetime; //到达时间 float servicetime;//服务时间 float starttime; //开始时间 float finishtime;//完成时间 float zztime;//周转时间 float dqzztime;//带权周转 }; //定义一个结构体数组 sjf a[100]; //定义一个输入函数 void input(sjf *p,int N) { int i; printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++) { printf("input the %dth process's information:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); } } //定义一个输出函数 void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) { int k; printf("run order:");//执行顺序 printf("%s",p[0].name); for(k=1;k%s",p[k].name); } printf("\nthe process's information:\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n"); for(k=0;k<=N-1;k++) { printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //按到达时间排序 void sort(sjf *p,int N) { for(int i=0;i<=N-1;i++) for(int j=0;j<=i;j++) if(p[i].arrivetime<p[j].arrivetime) { sjf temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) { int k; for(k=0;k=p[k].arrivetime) { p[k].starttime=p[k-1].finishtime;} else { p[k].starttime =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].zzti
7549 浏览量
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先(抢占式和非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程的进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格式显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31