资源简介

SPOOLING假脱机输入/输出技术广泛应用于各种计算机的I/O。该技术通过采用预输入和缓输出的方法,使用共享设备的一部分空间来模拟独占设备,以提高独占设备的利用效率。为了理解该技术,设计一个SPOOLING假脱机输出的模拟程序。

资源截图

代码片段和文件信息

#include/*包含随机函数的头文件*/
#include/*包含时间函数的头文件*/
#include/*包含标准输入输出函数的头文件*/
struct pcb{ /*定义进程控制块结构体*/
int status;
int length;
}*PCB[3];
struct req{ /*定义请求输出块结构体*/
int reqname;
int length;
int addr;
}reqblock[10];/*申请10个输出请求块*/
int buffer[2][100];/*定义一个而维数组*/
int head=0tail=0;
int t1=5t2=5;/*t1t2各可以申请数据5次*/
void request(int i);/*定义一个request()函数*/
void spooling();/*定义一个spooling()函数*/


/*在主函数里,初始化而维数组Buffer[l][j]、pcb。对于三个进程,谁先执行,我们用了一个随机函数K,根据K的值和进程的状态来决定谁先执行*/
void main()/*定义一个main()函数*/
{
int ljnkm;
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)); /*为pcb申请空间*/
tmpPcb->status=0;
tmpPcb->length=0;
PCB[n]=tmpPcb; /*初始化pcb*/
}
printf(“两个用户进程的请求分别为5,5\n“);
srand((unsigned)time(NULL)); /* 产生一个随即数*/
while(1)
{
k=rand()%100;
printf(“K=%d\n“k);
if(k<=45)
{
if((PCB[0]->status==0)&&(t1>0))
request(1);/*如果k在0-45执行用户进程1*/
}
else if((k<=90)&&(t2>0))
{
if(PCB[1]->status==0)
request(2);/*如果k在46-90执行用户进程1*/
}
else  /* 90 {
printf(“执行SPLOOING语句!!\n“);
spooling();
}
if((t1==0)&&(t2==0)&&(head==tail))
break;/*进程都结束时返回*/
}
for(m=0;m<3;m++)
{
free(PCB[m]);/*输出#输出信息时删除该信息块所占输出#的空间*/
PCB[m]=NULL;
}
getchar();/*停一下*/
}


/*request()函数里,主要把模拟请求的用户信息输入到二维数组里,t1,t2各请求5次,,每请求完一次,t1t2中就有一个减一,Head加一(意思是指向下一个请求),Tail是统计请求个数,Tail=9时用户请求完毕。至于模拟什么数据,也是由一个随机数J决定的*/
void request(int i)
{
int index;
int jmlength=0;
int s=0;
struct req*run;/*给req定义一个指针run*/
if(i==1)
t1--;/*每执行一次用户1请求的数据,t1都减1*/
else
t2--;/*每执行一次用户2请求的数据,t2都减1*/
printf(“执行请求语句!!、\n用户%d “i);
printf(“请求数据:\n“);
run=&reqblock[tail%10];
run->reqname=i;
run->length=0;
if(tail==0)
run->addr=0;
else
{
printf(“tail=%d\n“tail);
index=(tail-1)%10;
run->addr=reqblock[index].addr+reqblock[index].length;/*输出块的地址变成上一个地址头加上一个块长*/
}
for(m=0;m<100;m++)
{
if(buffer[i-1][m]==0)  /*如果输出块的!!!!!!!!!!!*/
{
run->addr=m;
break;
}
}
srand((unsigned)time(NULL));
while(1)
{
j=rand()%10; /*j=0表示什么??????形成一个请求信息块*/
printf(“j=%d\n“j);
if(j==0)
{
run->length=length;
break;/*j=0时退出模拟请求信息输出*/
}
buffer[i-1][(run->addr+length)]=s;
printf(“buffer[%d][%d]=%d “i-1run->addr+lengths);/*模拟请求数据存入输出#*/
s++;
length++;
}
printf(“\n“);
PCB[i-1]->length=length+1;/*进程长度为length*/
length=0;
if(2==PCB[2]->status)
PCB[2]->status=0;
tail++; /*每一次请求tail加一*/
}


/*spooling()函数里主要用来把处理过的用户信息输出到二维数组里(即输出#)以及进行进程状态的改变*/
void spooling()
{
int ij;
struct req*run;
printf(“调用SPOOLING输出服务程序输出数据:\n“);
run=&reqblock[head%10];/*从第一个请求开始*/
printf(“reqname=%d“run->reqname);
printf(“\n“);
for(i=0;ilength;i++)  /*输出输出井数据*/
{
printf(“buffer[%d][%d]=%d“run->reqnamerun->addr+ibuffer[run->reqname-1][run->addr+i]);
printf(“ “)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3718  2009-12-04 09:21  spooling\spooling.cpp

     文件       3425  2009-12-04 09:21  spooling\spooling.dsp

     文件        524  2009-12-04 09:27  spooling\spooling.dsw

     文件      33792  2009-12-04 09:27  spooling\spooling.ncb

     文件      48640  2009-12-04 09:27  spooling\spooling.opt

     文件        754  2009-12-04 09:22  spooling\spooling.plg

     文件        203  2009-12-04 09:27  spooling\spooling.sln

     目录          0  2009-12-04 09:28  spooling

----------- ---------  ---------- -----  ----

                91056                    8


评论

共有 条评论