题目要求
使用说明
按提示输入用户进程需要输出文件的数量pcb[0].count和pcb[1].count,程序就能按要求输出pcb[0].count+pcb[1].count行,每行表示一个文件,以0结尾。
代码第16行outputhelp变量表示是否输出详细过程,默认为false不输出,将其改为true后,程序可以输出调度的细节。
代码第51行定义的Seed变量是随机种子,修改它的初值可以影响随机数的生成,从而影响程序运行结果。
以pcb[0].count=21,pcb[1].count=2为例,运行结果为:
#include <cstdio>
#include <time.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
using namespace std;
#define READY_STATUS 0//就绪状态
#define WAIT_BUFFER_STATUS 1//等待状态1,表示输出井满,请求输出的用户进程等待;
#define WAIT_REQUEST_STATUS 2//等待状态2,表示请求输出井空,SP00LING输出进程等待;
#define WAIT_REQBLOCK_STATUS 3//等待状态3,表示请求输出井满,请求输出的用户进程等待;
#define FINISH_STATUS 4//结束态,进程执行完成。
#define RUN_STATUS 5//运行态,表示正在运行
const bool outputhelp = false;
struct PCB {
int id; //进程标识数
int status; //进程状态
int count; //要输出的文件数
int tmp_x; //进程输出时的临时变量
}pcb[3];
int FINISH_STATUS_PCB_CNT;//处于结束态的进程个数
//请求输出块reqblock
struct Reqblock{
int reqname;//请求进程名
int length; //本次输出信息长度
int addr; //信息在输出井的首地址
}reqblock[10];
int buffer[2][100]; //两个输出井
int EMPTY_BUF_COUNT[2]; //分别表示两个用户进程可使用的输出井的空间
int BUF_BEGIN[2];//buffer[i]的第一个满缓冲指针
int BUF_END[2];//buffer[i]的第一个空缓冲指针
int REQBLOCK_COUNT;//请求块结构也有一个计数器
int ptr_begin,ptr_end;//表示请求输出块使用情况
void user_thread0();//用户进程0
void user_thread1();//用户进程1
void request(int pid);//将用户进程输出送入输出井
void spooling();//将输出井数据输出到显示器
int schedule();//调度进程
double random() {
//生成0~1随机数
static double Seed = 233; //随机种子,在此处可改变初值
Seed = 125.0 * (Seed + 1.0);
Seed = Seed - 8192.0 * (int)(Seed/8192);
return (Seed+0.5)/8192;
}
void init() {
//对各进程的PCB、输出请求快、输出井初始化
for (int i