📄 spooling.txt
字号:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
struct info_PCB
{
long ID;//进程标识
long status;//状态
long po;//输出指针
long head;//信息块首地址
long count;//输出长度
long wait[1000];//输出缓冲
}PCB[4];
struct info_block
{
long ID;//要求输出的进程
long len;//输出长度
long head;//输出首地址
}block[128];
struct info_wall
{
long num[10000];//输出内容
long open,closed;//队列指针
}wall[3];
long K[3],L1,L2[3];
long n;
void input()//输入函数
{
printf("Input the times of user1's output file:");
scanf("%ld",&K[1]);
printf("Input the times of user2's output file:");
scanf("%ld",&K[2]);
}
void init()//初始化函数
{
L1=10;
L2[1]=L2[2]=100;
memset(PCB,0,sizeof(PCB));
PCB[1].ID=1;
PCB[2].ID=2;
PCB[3].ID=3;
PCB[3].status=2;
memset(wall,0,sizeof(wall));
n=0;
}
void work()//模拟进程调度
{
long r;
long k;
long a,b;
long i,j;
while (PCB[1].status!=3 || PCB[2].status!=3 || PCB[3].status!=3)
{
r=rand()%100+1;//用随机数模拟进程执行概率
if (r<=45)
{
k=1;
}
else
{
if (r<=90)
k=2;
else
k=3;
}
if (PCB[k].status!=0)
continue;
switch (k)
{
case 1:
case 2:
//输出进程k
a=rand()%10;
++PCB[k].po;
PCB[k].wait[PCB[k].po]=a;
if (a==0)
{
b=wall[k].closed+1;
for (i=1;i<=PCB[k].po;i++)
{
wall[k].num[++wall[k].closed]=PCB[k].wait[i];
}
PCB[k].po=0;
PCB[k].count++;
if (PCB[k].count==K[k])
//进程执行完毕后应置成"结束状态"。
{
PCB[k].status=3;
}
if (PCB[3].status==2)
//要求输出进程在输出信息到输出井并形成信息块后,应将 Spooling 进程
置成"可运行状态"。
{
PCB[3].status=0;
}
if (L2[k]==0 && PCB[k].status==0)
//如果输出井满,将进程置为"不可运行状态 1"
{
PCB[k].status=1;
}
n++;
block[n].ID=k;
block[n].head=b;
block[n].len=wall[k].closed-b+1;
printf("Process %ld produces a block %ld!\n",k,n);
}
break;
case 3:
//Spooling 进程
PCB[3].po++;
a=PCB[3].po;
printf("Output block %ld: (ID=%ld)\n",a,block[a].ID);
for (i=1;i<=block[a].len;i++)
{
printf("%ld ",wall[block[a].ID].num[i+block[a].head-1]);
}
printf("\n");
if (PCB[3].po==n)
{
PCB[3].status=2;
//Spooling 进程在输出井空时应置成"不可运行状态2"。
if (PCB[1].status==3 && PCB[2].status==3)
{
PCB[3].status=3;
}
}
break;
}
}
}
int main()
{
srand(time(NULL));
input();
init();
work();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -