进程的id,到达时间,运行时间都是随机生成的
需要注意的是:在时间片轮转法中,假设n时刻就绪队列为 头->:‘C’ ‘N’ <-尾,n时刻就绪队列首部的进程C运行一个时间片且C未运行完,下一时刻进程A到达就绪队列,则就绪队列的排序应该是:N A C。也就是说,当前时刻到达的进程应该排在上一时刻没有运行完重新回到就绪队列排队的进程的前面
没有使用标准模板库queue容器(老师不给),sum一开始设置为9,后面改成了5
一、课程设计题目及内容
设计一个按照时间片轮转法实现处理机调度的程序
时间片轮转法实现处理机调度的程序设计提示如下:
(1)假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。
进程控制块格式 |
---|
进程名 |
链接指针 |
到达时间 |
估计运行时间 |
进程状态 |
(2)按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3)执行处理机调度时,首先选择队首的第一个进程运行。
(4)由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:
1)估计运行时间减1;
2)输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0,若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。
(6)若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
(7)在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
二、实验源代码
代码如下:
#include<iostream>
#include<time.h>
#include<iomanip>
using namespace std;
typedef struct PCB
{
int name;//进程名(id)
struct PCB* next;//指针
int ta;//到达时间
int tw;//工作时间
int state;//完成状态(完成为1,未完成为0)
}PCB, * PCBptr;
typedef struct
{
PCBptr front;
PCBptr rear;
}LinkQueue;
void print(LinkQueue& Q)
{
auto p = Q.front->next;
cout << "name" << setw(6) << "ta" << setw(6) << "tw" << endl;
while (p != NULL)
{
cout << p->name << setw(8) << p->ta << setw(8) << p->tw << endl;
p = p->next;
}
}
void InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = new PCB;
Q.front->next = NULL;
}
int DeQueue(LinkQueue& Q)
{
if (Q.front == Q.rear)return 0;
auto p = Q.front->next;
Q.front->next = p->next;
if (Q.rear == p)Q.rear = Q.front;
delete p;
return 1;
}
void EnQueue(LinkQueue& Q, PCB e)
{
PCBptr p;
p = new PCB;
p->name