编写一个Spooling程序来模拟假脱机输入输出过程
Process 2 produces a block 3!
Process 2 produces a block 4!
Output block 2: (ID=1)
2 4 5 9 5 9 8 5 4 9 4 8 0
Output block 3: (ID=2)
7 6 2 8 3 0
Process 2 produces a block 5!
Process 2 produces a block 6!
Output block 4: (ID=2)
6 0
Process 1 produces a block 7!
Process 1 produces a block 8!
Output block 5: (ID=2)
6 5 1 9 4 0
Output block 6: (ID=2)
9 4 0
Output block 7: (ID=1)
2 8 7 5 5 4 2 9 2 1 1 1 5 7 0 Process 2 produces a block 9!
Process 2 produces a block 10!
Output block 8: (ID=1)
0
Process 1 produces a block 11!
Output block 9: (ID=2)
5 4 9 1 1 4 4 6 3 2 6 1 2 5 7 0
Output block 10: (ID=2)
3 4 2 4 0
Output block 11: (ID=1)
2 1 8 9 7 8 1 5 4 9 3 4 5 5 8 1 3 1 4 8 6 9 4 6 0
五、系统不足与经验体会
系统的不足包括健壮性尚不够好,界面比较简单,对于模拟
过程,输出信息不够详细,对某些规模的的初始化需要修改程序。
经验体会:注意数据达到上限时的情况,对于进程调度,要
注意避免没有任何一个进程处于等待状态的情况出现。
辣、附录:源代码(带注释)
#include <cstdio>
#include <cstring>
#include <cstdlib> #include <ctime>
struct info_PCB
{
long ID;//进程标识
long status;//状态
long po;//输出指针
long head;//信息块首地址
long count;//输出长度
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;
for (i=1;i<=block[a].len;i++)