資源簡介
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
評論
共有 條評論