实验七 SPOOLING技术

本文介绍了如何通过SPOOLING技术将物理I/O设备虚拟化,让多个用户共享资源,提升设备利用率。实验内容包括数据结构、程序流程和代码实现,展示了用户进程如何请求数据并进行缓存操作以及SPOOLING服务的输出过程。
摘要由CSDN通过智能技术生成

【实验目的】

理解和掌握SPOOLING假脱机技术

【实验内容】

通过SPOOLING技术可将一台物理I/O设备虚拟为多台逻辑I/O设备,同样允许多个用户共享一台物理I/O设备,从而使其成为虚拟设备。该技术广泛应用与各种计算机的I/O,通过采用预输入和缓输出的方法,使用共享设备的一部分空间来模拟独占设备,以提高独占设备的利用率。

【实验步骤】

  1. 数据结构

struct pcb

{

int status;

int length;

}*PCB[3];

struct req

{

int reqname;

int length;

int addr;

}reqblock[10];

  1. 程序流程图

  1. 实验代码

#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;

}

}

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值