【实验目的】
理解和掌握SPOOLING假脱机技术
【实验内容】
通过SPOOLING技术可将一台物理I/O设备虚拟为多台逻辑I/O设备,同样允许多个用户共享一台物理I/O设备,从而使其成为虚拟设备。该技术广泛应用与各种计算机的I/O,通过采用预输入和缓输出的方法,使用共享设备的一部分空间来模拟独占设备,以提高独占设备的利用率。
【实验步骤】
- 数据结构
struct pcb
{
int status;
int length;
}*PCB[3];
struct req
{
int reqname;
int length;
int addr;
}reqblock[10];
- 程序流程图
- 实验代码
#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 = 0,t2 = 0;
void request(int i);//i=1表示用户进程1;i=2表示用户进程2
void spooling();
int main()
{
int l,j,n,m;
for(l = 0;l < 2;l++)
for(j = 0;j < 100;j++)
buffer[l][j]=0;
for(n = 0;n < 3;n++)
{
struct pcb* tmppcb=(struct pcb*)malloc(sizeof(struct pcb));
tmppcb -> status = 0;
tmppcb -> length = 0;
PCB[n] = tmppcb;
}
printf("用户1的请求次数为:");
scanf("%d",&t1);
printf("\n用户2的请求次数为:");
scanf("%d",&t2);
printf("\n");
srand((unsigned)time(NULL));
while(1)
{
int k = 0;
k=rand() % 100;
printf("*****************************************************************\n");
printf("当前k的值为:%d\n",k);
if((k <= 45)&&(t1 > 0))
{
if((0 == PCB[0]->status))
request(1);
}
else if((k <= 90)&&(t2 > 0))
{
if(0 == PCB[1]->status)
request(2);
}
else
spooling();
if((0 == t1) && (0 == t2) && (head == tail))
break;
}
for(m = 0;m < 3;m++)
{
free(PCB[m]);
PCB[m]=NULL;
}
getchar();
}
void request(int i)
{
int j,m,length=0;
struct req* run;
if(1==i)
t1--;
else
t2--;
printf("*****************************************************************\n");
printf("用户%d请求数据:\n",i);
run = &reqblock[tail % 10];
run -> reqname = i;
run -> length = 0;
if(0==tail)
run->addr=0;
else
{
int 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;
}
}
int s = 0;
while(1)
{
j = rand() % 10;
if(0 == j)
{
run->length = length;
break;
}
buffer[i-1][(run->addr+length)] = j;
printf("此时请求打印数据为:%d\t\n",j);
length++;
}
printf("\n");
PCB[i-1]->length += length;
printf("此时PCB[%d]中length的值为:%d\n",i-1,PCB[i-1]->length);
printf("*****************************************************************\n");
length = 0;
if(2 == PCB[2]->status)
PCB[2]->status=0;
tail++;
}
void spooling()
{
int i,j;
struct req* run;
printf("*****************************************************************\n");
printf("调用SPOOLING输出服务程序输出数据:\n");
run = &reqblock[head % 10];
printf("打印用户%d请求的数据为:\n",run->reqname);
for(i = 0;i < run->length;i++)
printf("%3d",buffer[run->reqname-1][run->addr+i]);
printf("\n");
head++;
for(j = 0;j < 2;j++)
{
if(1 == PCB[j] -> status)//若没有可用请求块时,调用进程进入"等待状态3
PCB[j]->status = 0;
}
}