📄 spooling.cpp
字号:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
struct pcb{ //进程控制块
int status; //进程状态
int length; //
}*PCB[3];
struct req{ //输出请求块
int reqname; //请求进程名
int length; //本次输出信息长度
int addr; //信息在输出井的首地址
}reqblock[10];
int buffer[2][100]; //输出井
int head = 0, tail = 0;
int t1, t2; //分别为用户进程1和用户进程2请求输出的文件数
void request(int i);
void spooling(void);
int main(void)
{
int j, k, l, m, n;
struct pcb* tmpPcb;
for(l = 0; l < 2; l++)
for(j = 0; j < 100; j++)
buffer[l][j] = 0;
for(n = 0; n < 3; n++){
tmpPcb = (struct pcb*)malloc(sizeof(struct pcb));
tmpPcb->status = 0;
tmpPcb->length = 0;
PCB[n] = tmpPcb;
}
printf("请输入两个用户进程的请求:\n");
scanf("%d %d", &t1, &t2);
srand((unsigned)time(NULL));
while(1){
k = rand()%100;
if(k <= 45){ //调用用户进程1
if((0 == PCB[0]->status) && (t1 > 0))
request(1);
}
else if((k <= 90) && (t2 > 0)){ //调用用户进程1
if(0 == PCB[1]->status)
request(2);
}
else
spooling(); //调用spooling服务程序
if((0 == t1) && (0 == t2) && (head == tail))//即用户请求输入的全部输出了,这时结束
break;
}
for(m = 0; m < 3; m++){ //释放内存
free(PCB[m]);
PCB[m] = NULL;
}
getchar();
return 0;
}
void request(int i)
{
int j, m, s, length = 0;
int index;
struct req* run;
if(1 == i)
t1--;
else
t2--;
printf("用户%d请求数据:\n", i);
run = &reqblock[tail%10];
run->reqname = i;
run->length = 0;
if(0 == tail)
run->addr = 0;
else{
index = (tail-1)%10;
run->addr = reqblock[index].addr + reqblock[index].length;
}
for(m = 0; m < 100; m++){
if(0 == buffer[i-1][m]){
run->addr = m;
break;
}
}
s = 0;
while(1){
j = rand()%10; //随机产生用户进程请求输出的数据
if(0 == j){
run->length = length;
break;
}
buffer[i-1][(run->addr+length)] = s;
printf("%d ", s);
s++;
length++;
}
printf("\n");
PCB[i-1]->length += length;
length = 0;
if(2 == PCB[2]->status)//将处于等待状态的进程唤醒
PCB[2]->status = 0;
tail++;
}
void spooling(void)
{
struct req* run;
int i, j;
printf("调用SPOOLING输出服务程序输出数据:\n");
run = &reqblock[head%10];
printf("%d:\n", run->reqname);
for(i = 0; i < run->length; i++)
printf("%d ", buffer[run->reqname-1][run->addr+i]);
printf("\n");
head++;
for(j = 0; j < 2; j++){ //将处于等待状态的进程唤醒
if(1 == PCB[j]->status)
PCB[j]->status = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -