
一、实验目的:
(1)加深对进程的理解
(2)理解进程控制块的结构
(3)理解进程运行的并发性
(4)掌握时间片轮转法进程调度算法
二、实验内容:
(1)建立进程控制块
(2)设计三个链队列,分别表示运行队列、就绪队列和完成队列
(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。
(4)每一个时间片结束输出各进程的进程号,CPU时间(即已经占用的CPU时间),所需时间(即还需要的CPU时间),以及状态(即用W表示等待,R表示运行,F表示完成)
三、实验程序:
#include #include #include typedef struct node { 进程标识符*/ int prio; /*进程优先数*/ 进程时间轮转时间片*/ 进程占用CPU时间*/ 进程到完成还要的时间*/ 计数器*/ 进程的状态*/ 链指针*/ }PCB; PCB *finish,*ready,*tail,*run; //队列指针 int N,t; //进程数,时间片的大小 void firstin() { 就绪队列头指针赋值给运行头指针 进程状态变为运行态 就绪队列头指针后移到下一进程 } void prt1(char a)//输出标题函数 { 优先级法 进程名 占用CPU时间 到完成还要的时间 轮转时间片 状态\\n"); } void prt2(char a,PCB *q)//进程PCB输出 { 优先级法的输出 8c\\n",q->name,q->cputime,q->needtime,q->round,q->state); } void prt(char algo)//输出函数 { 输出标题 如果运行指针不空 输出当前正在运行的PCB 输出就绪队列PCB 输出完成队列的PCB while(p!=NULL) { } getchar(); //按住任意键继续 } void insert(PCB *q)//时间片轮转的插入算法 { 待插入的PCB指针 就绪队列头指针 做pl的前驱指针 } else { 否则插入在就绪队列的头 } } void create(char alg)//时间片轮转法创建链表进程PCB { run=NULL; 输入进程名及其需要运行的时间(中间以空格隔开):\\n"); 进程的状态 printf("*************时间片轮转法进程调度过程*************\\n"); prt(alg); run=ready; ready=ready->next; run->state='R'; } void timeslicecycle(char alg)//时间片轮转法 { 处理时间加t 完成需要时间减t 运行完将其变为完成态,插入完成队列 当进程完成时 就绪队列不空,将第一个进程投入进行 将进程插入到就绪队列中等待轮转 将就绪队列的第一个进程投入运行 } void main()//主函数 { 算法标记 输入进程的个数:"); 输入进程数 定义时间片大小:"); 输入时间片大小 创建进程 时间片轮转法调度 }//main() 四、实验结果: 五、实验小结: 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。时间片轮转调度中关键的一点是时间片的长度的选取。本实验可以自己设置时间片大小t,在试验过程中基本满足了实验要求。通过本次实验,我更加了解了时间片轮转调度算法,通过翻看课本,对其的理解更加的深刻了,在以后的学习中,我会更加努力地学习操作系统的相关课程。当然,实验中也遇到了问题,但都不是理论上的问题,而是编程的问题,根本原因还是编程基础不牢,以后会在编程方面加倍努力。
