计算机操作系统-处理机调度实验报告.pdf
中南大学 实验名称:处理机调度 课程名称:计算机操作系统 学生姓名 盛 希 玲 学 号 05 学 院 信息科学与工程学院 专业班级 电子信息工程 0602 完成时间 2008 年 10 月 12 日 目 录 一 实验内容.错误!未定义书签。二 实验目的.错误!未定义书签。三 实验题目.错误!未定义书签。四 基本思想.错误!未定义书签。五 算法分析.错误!未定义书签。六 流程图.错误!未定义书签。七 算法描述.错误!未定义书签。八 运行输出结果.错误!未定义书签。一 实验内容 选择一个调度算法,实现处理机调度。二 实验目的 多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。三 实验题目 设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。四 基本思想 先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。五 算法分析 定义一个结构体,此包含了PCB 的信息:struct PCB char PID5;/*进程名*/int needtime;/*要求运行的时间*/int cputime;/*已运行时间*/int priority;/*优先权(越小越高)*/int starttime;/*进入就绪队列的时间*/int overtime;/*运行完成的时间*/int state;/*状态:1 就绪 2 运行 3 完成*/struct PCB*next;子函数 struct PCB*create(int num,int n)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。main()函数中用一 while 循环输出进入时间片的进程状态。六 流程图 开始 调用 creat()函数,初始化进程 PCB,各进程按优先级排按优先级选择绪队列中进程放入时间片运转 是否开始运行 运行,每运行一秒优先权和已运行时间加一 时间片结束,是否就绪进程队列不为零 将 进 入 就绪 队 列 的进程 就 绪队列 是 否 有 新进程进入 是否所有进程运行结束 结束 七 算法描述#define NULL 0#define LEN sizeof(struct PCB)#include#include struct PCB char PID5;/*进程名*/int needtime;/*要求运行的时间*/int cputime;/*已运行时间*/int priority;/*优先权(越小越高)*/int starttime;/*进入就绪队列的时间*/int overtime;/*运行完成的时间*/int state;/*状态:1 就绪 2 运行 3 完成*/struct PCB*next;struct PCB*create(int num,int n)/*创建进程,并将进程按优先级顺序插入队列中*/struct PCB*head,*p,*p1,*p2;int i;head=NULL;/*头指针指零*/for(i=1;iPID);printf(要求运行的时间:);/*输入要运行的时间*/scanf(%d,&p-needtime);p-cputime=0;/*占用处理机的时间赋为零*/printf(优先权:);/*输入优先权*/scanf(%d,&p-priority);if(n=1)p-starttime=0;/*进入就绪队列的时间赋为零*/else printf(进入就绪队列时间:);/*输入进入就绪队列的时间*/scanf(%d,&p-starttime);p-overtime=-1;/*运行没有结束所以运行完成的时间赋为-1*/p-state=1;/*状态赋为就绪状态*/p1=head;/*p1 指针指向头指针*/if(head=NULL)/*如果头指针为零将头指针指向新建立的进程*/head=p;head-next=NULL;else /*头指针不为零的情况*/if(n=1)while(p1!=NULL&p-priorityp1-priority)/*查找插入点*/p2=p1;p1=p1-next;else while(p1!=NULL&p-starttimep1-starttime)/*查找插入点*/p2=p1;p1=p1-next;if(head=p1)/*优先权的值最小作为表头*/p-next=head;p2=head=p;else /*否则的话插入*/p2-next=p;p-next=p1;return(head);void main()char now5;int cho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0;struct PCB*head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3;over=NULL;printf(初始化进程.n);printf(输入总的就绪进程数:);scanf(%d,&num);head=create(num,1);/*建立就绪进程的链表*/printf(输入将会就绪的进程数:);scanf(%d,&num1);/*建立将会进入就绪进程的链表*/later=create(num1,2);printf(cpu 是否开始运行:1 是 2 不是-);scanf(%d,&cho);if(cho=1)/*处理机开始进行调度*/printf(现在的时间是:);scanf(%s,now);printf(显示所有就绪的进程:n);p2=head;printf(进程名t 要求运行时间t 已运行时间t 优先权t 状态(1 就绪 2 运行 3 结束)n);while(p2!=NULL)printf(%st%dtt%dtt%dt%dn,p2-PID,p2-needtime,p2-cputime,p2-priority,p2-state);p2=p2-next;printf(请输入时间片总数:);scanf(%d,&timepiece);printf(请输入时间片的时间:);scanf(%d,&time);printf(运行正式开始!n);head1=head;printf(tt 进程名t 要求运行时间t 已运行时间t 优先权t 状态n);for(i=1;inext;else break;p-next=NULL;while(head1!=NULL)/*就绪进程头指针不为零就循环*/head1-state=2;/*状态:1 就绪 2 运行 3 完成*/for(j=1;jstarttime)/*如果将进入就绪队列的进程时间到达加入就绪队列*/l=later;l1=head;later=later-next;if(head=NULL)head=l;head-next=NULL;else while(l1!=NULL&l1-prioritypriority)l2=l1;l1=l1-next;if(l1=head)l-next=head;head=l;else l2-next=l;l-next=l1;flag=0;printf(n%3d 秒 时间片第%d 秒 ,clock,j);q=head1;if(head1-needtimehead1-cputime)/*以运行时间和优先权都加 1*/head1-cputime+;head1-priority+;while(q)/*运行队列不为零输出其信息*/if(q=head1)printf(%st%dtt%dtt%dt%dn,q-PID,q-needtime,q-cputime,q-priority,q-state);else printf(tt%st%dtt%dtt%dt%dn,q-PID,q-needtime,q-cputime,q-priority,q-state);q=q-next;if(head1-needtime=head1-cputime)/*运行完成将其放入 over 为头指针的链表中*/head1-state=3;head1-overtime=clock;if(over=NULL)over=head1;head1=head1-next;over-next=NULL;else if(over!=NULL&head1!=NULL)p1=head1-next;p0=over;over=head1;over-next=p0;head1=p1;flag=1;if(flag=1)break;if(flag=1)/*有进程结束的情况*/if(head!=NULL)/*就绪队列不为零将优先权最高的放入运行链表中*/q1=head;head=head-next;q2=head1;while(q2!=NULL&q2-prioritypriority)q3=q2;q2=q2-next;if(q2=head1)q1-next=head1;head1=q1;else q3-next=q1;q1-next=q2;else /*无进程结束的情况,寻找优先权最高的运行*/head1-state=1;q1=head1;head1=head1-next;q2=head1;while(q2!=NULL&q2-prioritypriority)q3=q2;q2=q2-next;if(q2=head1)q1-next=head1;head1=q1;else q3-next=q1;q1-next=q2;printf(cpu 结束运行!n);printf(是否输出所有结束的进程:1 是 2 不是-);scanf(%d,&choo);if(choo=1)/*输出所有完成运行的进程*/printf(开始时间:%sn,now);printf(进程名t 要求运行时间t 进入就绪队列的时间t 运行完成的时间n);while(over!=NULL)printf(%st%dtt%dttt%dn,over-PID,over-needtime,over-starttime,over-overtime);over=over-next;八 运行输出结果 初始化进程如右图 显示现在的时间和所有就绪的进程 输入时间片的总数和每个时间片的时间 运行时显示的信息