操作系统实验三进程调度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验
实验三进程调度
学号 1215108019 姓名李克帆
班级 12电子2班
华侨大学电子工程系
实验目的
1、理解有关进程控制块、进程队列的概念。
2、掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。
实验内容与基本要求
1、设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转
调度算法。
2、建立进程就绪队列。
3、编制两种进程调度算法:优先权调度算法和时间片轮转调度算法。
实验报告内容
1、优先权调度算法和时间片轮转调度算法原理。
优先权算法:(1)当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。
(2)当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。
时间片轮转法:
系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片.时间片的大小从几ms到几百ms.当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片.这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间.
2、程序流程图。
3、程序及注释。
#include
#include
//使用timer()函数
#include
//时间延迟
#define DELAY 200 //每次运算后的停留时间
//时间片
#define SJP 3 //这里的时间片是固定的,这就要求每个进程的服务时间略小于4
/**********全局变量声明**********/
unsigned short TIME=0; //无符号,定义时间
unsigned short NUM=0; //无符号,定义进程数量
char TYPE='1'; //模拟类型
//PCB结构体定义
typedef struct PCB// struct 结构体
{
char name[16];
char state;
//[R]Run,[F]Finish,[P]Pause,[N]New
unsigned short priority; //数字越大,优先级越高,最小为1 unsigned short t_arrive; //到达时间
unsigned short t_start; //开始时间
unsigned short t_finish; //完成时间
unsigned short t_service; //服务时间
unsigned short t_run; //运行时间
unsigned short t_wait; //等待时间
struct PCB *next;
} pcb;
pcb *now=NULL, //定义now指针,一开始不赋值。指向现在运行的pcb
*head=NULL; //pcb链头部指针
/**********函数声明**********/
void fcfs(); //先到先服务
void sjf(); //短作业优先
void gyxb(); //高优先比
void sjplz(); //时间片轮转
void init(); //初始化,完成pcb录入
pcb *sort(pcb*); //对init()录入的pcb按到达时间排序
void timer(); //定时器,每一个延迟自我调用一次
void result(); //打印结果
//先到先服务算法
void fcfs()
{
if(now->t_arrive>TIME) //判断有无进程到达
{
printf("[时间:%d]\t无进程运行\n",TIME);
return;
}
if(now->state=='N') //判断state的状态
{
now->state='R'; //如果是新的程序,将state改为R
now->t_start=TIME;
printf("[时间:%d]\t进程:%s 首次运行\n",TIME,now->name);//显示该程序第一次运行
}
else if(now->state=='R')//else if语句中嵌套两个if语句,用来判断进程处在运行阶段还是完成阶段
{
(now->t_run)++;//now取t_run中的地址,再取内容
if(now->t_run>=now->t_service)//判断任务是否完成,标准时运行时间大于服务时间
{
now->state='F';//如果完成,则state的状态由Run改为Finally
now->t_finish=TIME;
printf("[时间:%d]\t进程:%s 任务完成\n",TIME,now->name);//任务完成,跳出if
now=now->next;
if(now!=NULL) fcfs();//判断是否还有未完成的程序
}
else printf("[时间:%d]\t进程:%s 正在运行,已运行时间:%d\n",TIME,now->name,now->t_run);//任务未完成,返回外层语句继续循环执行
}
}
//短作业优先算法
void sjf()
{
pcb *p=head,*p_min=NULL;//创建p和p_min两个指针
unsigned short t_min=9999;
//从现在时间以前并且未结束的进程中,选出服务时间最小的进程
while(p!=NULL && p->t_arrive<=TIME)
{