#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
struct info_PCB
{
long ID;//进程标识
long status;//状态
long po;//输出指针
long head;//信息块首地址
long count;//输出长度
long len;//输出长度
long wait[128];
}block[128];
struct info_wall
{
long num[10000];//输出内容
long open,closed;//队列指针
}wall[3];
long K[3],L1,L2[3]; long n;
void input()//输入函数
{
printf("输入用户1要求输入的文件数(0~9):");
scanf("%ld",&K[1]);
getchar();
printf("输入用户2要求输入的文件数(0~9):");
scanf("%ld",&K[2]);
getchar();
}
void init()//初始化函数
{
L1=10;
L2[1]=L2[2]=100;
memset(block,0,sizeof(block));
block[1].ID=1;
block[2].ID=2;
block[3].ID=3;
block[3].status=2;
memset(wall,0,sizeof(wall)); n=0;
}
void work()//模拟进程调度
{
long r;
long k;
long a,b;
long i;
while (block[1].status!=3 || block[2].status!=3 || block[3].status!=3)
{
r=rand()%100+1;//用随机数模拟进程执行概率
if (r<=45)
{
k=1;
}
else
{
if (r<=90)
k=2;
else
k=3;
}
if (block[k].status!=0)
continue;
switch (k)
{
case 1: case 2:
//输出进程k
a=rand()%10;
++block[k].po;
block[k].wait[block[k].po]=a;
if (a==0)
{
b=wall[k].closed+1;
for (i=1;i<=block[k].po;i++)
{
wall[k].num[++wall[k].closed]=block[k].wait[i];
}
block[k].po=0; block[k].count++;
if (block[k].count==K[k])
//进程执行完毕后应置成"结束状态"。
{
block[k].status=3;
}
if (block[3].status==2)
//要求输出进程在输出信息到输出井并形成信息块后,应将 Spooling 进程置成"可运行状态"。
{
block[3].status=0;
}
if (L2[k]==0 && block[k].status==0)
//如果输出井满,将进程置为"不可运行状态 1"
{
block[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 进程
block[3].po++;
a=block[3].po;
for (i=1;i<=block[a].len;i++)
{
printf("%ld ",wall[block[a].ID].num[i+block[a].head-1]);
}
printf("\n");
if (block[3].po==n)
{
block[3].status=2;
//Spooling 进程在输出井空时应置成"不可运行状态 2"。
{
block[3].status=3;
}
}
break; }
}
}
int main()
{
srand(time(NULL));
input();
init();
work();
return 0;
}