题目
请编写一个程序,模拟若干进程调度执行的情况。假设进程的状态分为执行和就绪两种。
每个进程以其PCB为代表即可,无需创建真正的进程。
以链表的方式组织PCB,分为三个队列:
freeQueue:一个空白PCB队列
readyQueue:一个就绪队列
runningQueue:一个执行队列
程序开始运行时,用户输入进程数量n,以及每个进程需要运行的时间t0/t1/…/tn。
程序从空白PCB队列中取出PCB创建进程,插入readyQueue。
进程的调度采用随机的方式,即从就绪队列中随机选择一个进程投入运行(就是将该PCB中的状态变量赋值为“运行”)。相应的修改其所在队列,并且原来处于运行态的进程需要转变为“就绪”态,插入readyQueue。
假设时间片是2,进程每次调度运行后,其还需运行的时间应该减少2,直至为0,即表示该进程执行完毕。需要回收PCB到freeQueue。
每次发生调度的时候,需要打印信息示例:
Sched: P0(Running -> Ready), P3(Ready -> Running)
Running: P3
Ready: P1->P2->P0
上述信息表示调度时P0处于运行态,选择P3运行,P0进程的PCB进入就绪队列,并且在队尾。就绪队列是按照队列节点次序输出进程名称。
示例片段代码:
#define free 0
#define ready 1
#define running 2
#define ts 2 /* time slice /
struct PCB {
int pid; / 进程ID /
int pstate; / 进程状态 */
char pname; / 映象名称 /
int ptime; / 剩余运行时间 */
struct PCB pnext; / 下一个PCB */
}
代码
//
// Created by Jintao on 2019/12/14.
//
// 题目:
// 请编写一个程序,模拟若干进程调度执行的情况。假设进程的状态分为执行和就绪两种。
// 每个进程以其PCB为代表即可,无需创建真正的进程。以链表的方式组织PCB,分为三个队列:
// freeQueue:一个空白PCB队列
// readyQueue:一个就绪队列
// runningQueue:一个执行队列
//
// 程序开始运行时,用户输入进程数量n,以及每个进程需要运行的时间t0/t1/…/tn。
// 程序从空白PCB队列中取出PCB创建进程,插入readyQueue。
//
// 进程的调度采用随机的方式,即从就绪队列中随机选择一个进程投入运行(就是将该PCB中的状态变量赋值为“运行”)。
// 相应的修改其所在队列,并且原来处于运行态的进程需要转变为“就绪”态,插入readyQueue。
// 假设时间片是2,进程每次调度运行后,其还需运行的时间应该减少2,直至为0,即表示该进程执行完毕。需要回收PCB到freeQueue。
// 每次发生调度的时候,需要打印信息示例:
//
// Sched: P0(Running -> Ready), P3(Ready -> Running)
// Running: P3
// Ready: P1->P2->P0
//
// 上述信息表示调度时P0处于运行态,选择P3运行,P0进程的PCB进入就绪队列,并且在队尾。就绪队列是按照队列节点次序输出进程名称。
#include <cstring>
#include<cstdio>
#include<cstdlib>
#include<ctime>
const int timeSlice = 2; // 时间片
/// 进程状态 枚举
enum struct PState {
free, ready, running
};
struct PCB {
int pid; // 进程id
PState pstate; // 进程状态
char name[20]; // 进程名称 P0, P1, P2...
int time; // 剩余运行时间
PCB *next; // 下一个PCB
PCB() : next(nullptr) {
}
PCB(int pid, PState pstate, char *name, int time, PCB *next) :
pid(pid), pstate(pstate), time(time), next(next) {
strcpy(this->name, name);
}
};
/// PCB链表
struct PCBList {
PCB *head;
int length;
PCBList() : length(0) {
head = new PCB;
}
~PCBList() {
__freeAllPCB();