• 大小: 193KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-08
  • 语言: C/C++
  • 标签: C++实现  

资源简介

SPOOLing算法模拟 C++实现 SPOOLing算法模拟 C++实现 SPOOLing算法模拟 C++实现 SPOOLing算法模拟 C++实现

资源截图

代码片段和文件信息

#include 
#include 
#include  
struct pcb
{
int id; /* 进程标识数*/
int status; /* 进程状态*/
int firstaddr; /*信息块首地址*/
int length; /* 本次输出信息长度*/
int outbufword; /*输出缓冲字*/
}*PCB[3];
/*进程状态status的可能取值
* 0为可执行状态;
* 1为等待状态1,即输出井满等待
* 2为等待状态2,即输出井空等待
* 3为等待状态3,即请求块用完时等待
* 4为结束状态
*/
FILE *f;
struct req /*请求输出块*/
{
int reqname; /* 请求进程名*/
int length; /* 本次输出信息长度*/
int addr; /* 信息在输出井的首地址*/
}reqblock[10];
int buffer[2][100] C3=10; /*buffer为输出井*/
int l1=1 l2=1;
int head=0 tail=0; /*输出井的头尾指针*/
int t1 t2;
void request(int i) /*i为请求输出的进程标识1或2*/
{
int jlength=0 m;
struct req *run;
if(i==1)
{
t1--;
}
else
{
t2--;
}
run=&reqblock[tail%10];
run->reqname=i;
run->length=0;
if(tail==0)
{
run->addr=0;
}
else
{
int 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;
}
}
while(1)
{
j=rand()%10;
if(j==0)
{
run->length=length;
break;
}
buffer[i-1][(run->addr+length)]=j;
length++;
}
PCB[i-1]->length+=length;
length=0;
if(PCB[2]->status==2)
{
PCB[2]->status=0;
}
tail++;
}
void spooling()
{
int ij;
struct req *run;
run=&reqblock[head%10];
printf(“%d “run->reqname);
fprintf(f“%d “run->reqname);
for(i=0; ilength; i++)
{
printf(“%d “buffer[run->reqname-1][run->addr+i]);
fprintf(f“%d “buffer[run->reqname-1][run->addr+i]);
}
printf(“\n“);
fprintf(f“\n“);
head++;
for(j=0; j<2; j++)
{
if(PCB[j]->status==1)
{
PCB[j]->status=0;
}
}
}
int main()
{
int i n;
f=fopen(“result.txt““w“);
for(i=0; i<2; i++)
for(n=0; n<100; n++)
buffer[i][n]=0;
for(i=0; i<3; i++)
{
struct pcb *tmpPcb=(struct pcb *)malloc(sizeof(struct pcb));
tmpPcb->id=i;
tmpPcb->status=0;
tmpPcb->firstaddr=0;
tmpPcb->length=0;
tmpPcb->outbufword=1;
PCB[i]=tmpPcb;
}
printf(“How many work do p1 want to do?“);
fprintf(f“How many work do p1 want to do?“);
scanf(“%d“&t1);
fprintf(f“%d\n“t1);
printf(“How many work do p2 want to do?“);
fprintf(f“How many work do p2 want to do?“);
scanf(“%d“&t2);
fprintf(f“%d\n“t2);
srand((unsigned)time(NULL));
while(1)
{
i=rand()%100;
if(i<=45)
{
if((PCB[0]->status==0)&&(t1>0))
{
request(1);
}
}
else if ((i<=90)&&(t2>0))
{
if(PCB[1]->status==0)
{
request(2);
}
}
else
{
spooling();
}
if((t1==0)&&(t2==0)&&(head==tail))
break;
}
for(i=0; i<3; i++)
{
free(PCB[i]);
PCB[i]=NULL;
}
fclose(f);
return 0;
}



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

     文件        541  2008-12-30 09:15  SPOOLing\SPOOLing.dsw

     文件      33792  2008-12-30 09:16  SPOOLing\SPOOLing.ncb

     文件      33792  2008-12-30 09:16  SPOOLing\Debug\vc60.idb

     文件      45056  2008-12-30 09:16  SPOOLing\Debug\vc60.pdb

     文件     223536  2008-12-30 09:16  SPOOLing\Debug\SPOOLing.pch

     文件       8568  2008-12-30 09:16  SPOOLing\Debug\SPOOLing.obj

     文件     212472  2008-12-30 09:16  SPOOLing\Debug\SPOOLing.ilk

     文件     200792  2008-12-30 09:16  SPOOLing\Debug\SPOOLing.exe

     文件     427008  2008-12-30 09:16  SPOOLing\Debug\SPOOLing.pdb

     文件       2912  2008-12-30 09:16  SPOOLing\SPOOLing.cpp

     文件        892  2008-12-30 09:16  SPOOLing\SPOOLing.plg

     文件        210  2008-12-30 09:16  SPOOLing\result.txt

     文件      48640  2008-12-30 09:16  SPOOLing\SPOOLing.opt

     文件       4308  2008-12-30 09:16  SPOOLing\SPOOLing.dsp

     目录          0  2008-12-30 09:15  SPOOLing\Debug

     目录          0  2008-12-30 09:15  SPOOLing

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

              1242519                    16


评论

共有 条评论