資源簡介
SPOOLING假脫機(jī)輸入/輸出技術(shù)廣泛應(yīng)用于各種計(jì)算機(jī)的I/O。該技術(shù)通過采用預(yù)輸入和緩輸出的方法,使用共享設(shè)備的一部分空間來模擬獨(dú)占設(shè)備,以提高獨(dú)占設(shè)備的利用效率。為了理解該技術(shù),設(shè)計(jì)一個(gè)SPOOLING假脫機(jī)輸出的模擬程序。

代碼片段和文件信息
#include/*包含隨機(jī)函數(shù)的頭文件*/
#include/*包含時(shí)間函數(shù)的頭文件*/
#include/*包含標(biāo)準(zhǔn)輸入輸出函數(shù)的頭文件*/
struct?pcb{ /*定義進(jìn)程控制塊結(jié)構(gòu)體*/
int?status;
int?length;
}*PCB[3];
struct?req{ /*定義請求輸出塊結(jié)構(gòu)體*/
int?reqname;
int?length;
int?addr;
}reqblock[10];/*申請10個(gè)輸出請求塊*/
int?buffer[2][100];/*定義一個(gè)而維數(shù)組*/
int?head=0tail=0;
int?t1=5t2=5;/*t1t2各可以申請數(shù)據(jù)5次*/
void?request(int?i);/*定義一個(gè)request()函數(shù)*/
void?spooling();/*定義一個(gè)spooling()函數(shù)*/
/*在主函數(shù)里,初始化而維數(shù)組Buffer[l][j]、pcb。對于三個(gè)進(jìn)程,誰先執(zhí)行,我們用了一個(gè)隨機(jī)函數(shù)K,根據(jù)K的值和進(jìn)程的狀態(tài)來決定誰先執(zhí)行*/
void?main()/*定義一個(gè)main()函數(shù)*/
{
int?ljnkm;
for(l=0;l<2;l++)
for(j=0;j<100;j++)
buffer[l][j]=0;
for(n=0;n<3;n++)/*有三個(gè)進(jìn)程控制塊*/
{
struct?pcb?*tmpPcb=(struct?pcb*)malloc(sizeof(struct?pcb));?/*為pcb申請空間*/
tmpPcb->status=0;
tmpPcb->length=0;
PCB[n]=tmpPcb; /*初始化pcb*/
}
printf(“兩個(gè)用戶進(jìn)程的請求分別為5,5\n“);
srand((unsigned)time(NULL)); /* 產(chǎn)生一個(gè)隨即數(shù)*/
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執(zhí)行用戶進(jìn)程1*/
}
else?if((k<=90)&&(t2>0))
{
if(PCB[1]->status==0)
request(2);/*如果k在46-90執(zhí)行用戶進(jìn)程1*/
}
else??/*?90 {
printf(“執(zhí)行SPLOOING語句!!\n“);
spooling();
}
if((t1==0)&&(t2==0)&&(head==tail))
break;/*進(jìn)程都結(jié)束時(shí)返回*/
}
for(m=0;m<3;m++)
{
free(PCB[m]);/*輸出#輸出信息時(shí)刪除該信息塊所占輸出#的空間*/
PCB[m]=NULL;
}
getchar();/*停一下*/
}
/*request()函數(shù)里,主要把模擬請求的用戶信息輸入到二維數(shù)組里,t1,t2各請求5次,,每請求完一次,t1t2中就有一個(gè)減一,Head加一(意思是指向下一個(gè)請求),Tail是統(tǒng)計(jì)請求個(gè)數(shù),Tail=9時(shí)用戶請求完畢。至于模擬什么數(shù)據(jù),也是由一個(gè)隨機(jī)數(shù)J決定的*/
void?request(int?i)
{
int?index;
int?jmlength=0;
int?s=0;
struct?req*run;/*給req定義一個(gè)指針run*/
if(i==1)
t1--;/*每執(zhí)行一次用戶1請求的數(shù)據(jù),t1都減1*/
else
t2--;/*每執(zhí)行一次用戶2請求的數(shù)據(jù),t2都減1*/
printf(“執(zhí)行請求語句!!、\n用戶%d?“i);
printf(“請求數(shù)據(jù):\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;/*輸出塊的地址變成上一個(gè)地址頭加上一個(gè)塊長*/
}
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表示什么??????形成一個(gè)請求信息塊*/
printf(“j=%d\n“j);
if(j==0)
{
run->length=length;
break;/*j=0時(shí)退出模擬請求信息輸出*/
}
buffer[i-1][(run->addr+length)]=s;
printf(“buffer[%d][%d]=%d?“i-1run->addr+lengths);/*模擬請求數(shù)據(jù)存入輸出#*/
s++;
length++;
}
printf(“\n“);
PCB[i-1]->length=length+1;/*進(jìn)程長度為length*/
length=0;
if(2==PCB[2]->status)
PCB[2]->status=0;
tail++; /*每一次請求tail加一*/
}
/*spooling()函數(shù)里主要用來把處理過的用戶信息輸出到二維數(shù)組里(即輸出#)以及進(jìn)行進(jìn)程狀態(tài)的改變*/
void?spooling()
{
int?ij;
struct?req*run;
printf(“調(diào)用SPOOLING輸出服務(wù)程序輸出數(shù)據(jù):\n“);
run=&reqblock[head%10];/*從第一個(gè)請求開始*/
printf(“reqname=%d“run->reqname);
printf(“\n“);
for(i=0;ilength;i++)??/*輸出輸出井?dāng)?shù)據(jù)*/
{
printf(“buffer[%d][%d]=%d“run->reqnamerun->addr+ibuffer[run->reqname-1][run->addr+i]);
printf(“ “)
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????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
評論
共有 條評論