操作系统课程设计:设计一个按照时间片轮转法实现处理机调度的程序
一:时间片轮转法实现处理机调度的程序设计提示如下:
(1)
假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。
(2)按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3)执行处理机调度时,首先选择队首的第一个进程运行。
(4)由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:1)估计运行时间减1;
2)输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0,若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。
(6)若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
(7)在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
二:程序中使用的数据结构以及主要符号说明;
(1)程序中时间片轮转的实现采取了链式队列的数据结构。需要分别创建一个节点结
构 QueueNode 以及一个队列结构Queue。QueueNode中有数据以及指针(题目
中的链接指针).队列中包括队头head以及队尾指针tail。
(2)一个进程结构 process 结构里有:进程名字:processname、到达时间:arrivetime
运行时间:runtime、进程状态:status,将所有的进程放入一个节点结构数组中
(sturct process a[])
(3)程序中的主要符号说明:
n:进程个数 num:运行的次数 m:队列中的实时进程数量
三:程序流程图和带有注释的源程序
源程序:
#include <iostream>
#include<time.h>
#include<stdlib.h>
#define N 100
using namespace std;
typedef string datatype;//进程的名字类型
typedef int intt;
typedef struct process//进程结构
{
datatype processname;//进程名字
intt arrivetime;//到达时间
intt runtime;//运行时间
datatype status;//进程状态
};
typedef struct QueueNode//定义一个节点
{
process data;
QueueNode* next;
}QueueNode;
typedef struct Queue//定义队列
{
QueueNode* head;//队头
QueueNode* tail;//队尾
size_t size;//记录当前队列里的元素个数
}Queue;
void QueueInit(Queue *&q)//队列初始化
{
q = (Queue *)malloc(sizeof(Queue));
q->head = NULL;
q->tail = NULL;
q->size = 0;
}
void QueuePush(Queue *&q, process data)//入队
{
QueueNode* newnode = new QueueNode;//创建新的节点
newnode->data= data;//节点数据等于要入队的数据
newnode->next = NULL;//节点的链接指针设为空
if (q->size == 0)//将节点送入队列
{
q->head = newnode;
q->tail = newnode;
q->size++;
}
else
{
q->tail->next = newnode;
q-