操作系统实验三进程调度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

{

相关文档
最新文档