資源簡介
SPOOLING技術
一、實驗目的
理解和掌握SPOOLING技術。
二、實驗內容
編寫程序實現SPOOLING技術的模擬。
三、實驗要求
1、設計一個實現SPOOLING技術的進程
設計一個SPOOLING輸出進程和兩個請求輸出的用戶進程及一個SPOOLING輸出服務程序。
SPOOLING輸出進程工作時,根據請求塊記錄的各進程要輸出的信息,將其實際輸出到打印機或顯示器。這里,SPOOLING進程與請求輸出的用戶進程可并發運行。
2、設計進程調度算法
進程調度采用隨機算法,這與進程輸出信息的隨機性相一致。兩個請求輸出的用戶進程的調度概率各為45%,SPOOLING輸出進程為10%,這由隨機數發生器產生的隨機數模擬決定。
3、進程狀態
進程基本狀態有3種,分別為可執行、等待和結束??蓤绦袪顟B就是進程正在運行或等待調度的狀態;等待狀態又分為等待狀態1、等待狀態2、等待狀態3。
狀態變化的條件為:
(1)進程執行完成時,置為“結束”狀態。
(2)服務程序在將輸出信息送至輸出井時,如發現輸出井已滿,將調用進程置為“等待狀態1”。
(3)SPOOLING進程在進行輸出時,若輸出井空,則進入“等待狀態2”。
(4)SPOOLING進程輸出一個信息塊后,應立即釋放該信息塊所占的輸出井空間,并將正在等待輸出的進程置為“可執行狀態”。
(5)服務程序在輸出信息到輸出井并形成輸出請求信息塊后,若SPOOLING進程處于等待狀態則將其置為“可執行狀態”。
(6)當用戶進程申請請求輸出塊時,若沒有可用請求塊時,調用進程進入“等待狀態3”。
4、數據結構
1)進程控制塊PCB
struct pcb
{
int status;
int length;
}pcb[3];
其中status表示進程狀態,其取值:
0 表示可執行狀態;
1 表示等待狀態1;
2 表示等待狀態2;
3 表示等待狀態3
2)請求輸出塊reqblock
struct{
int reqname;//請求進程名
int length;// 本次輸出信息長度
int addr;// 信息在輸出井的首地址
}reqblock[10];
3)輸出井BUFFER
SPOOLING系統為每個請求輸出的進程在輸出井中分別開辟一個區。本實驗可設計一個二維數組(int buffer[2][10])作為輸出井。每個進程在輸出井最多可占用10個位置。
5、編程說明
為兩個請求輸出的用戶進程設計兩個輸出井。每個可存放10個信息,即buffer[2][10]。當用戶進程將其所有文件輸出完時,終止運行。
為簡單起見,用戶進程簡單的設計成:每運行一次,隨機輸出數字0~9之間的一個數,當輸入10個數時形成一個請求信息塊,填入請求輸出信息塊reqblock結構中。
代碼片段和文件信息
#include
#include
#include
#include
using?namespace?std;
struct?pcb
{
int?status;?//進程狀態
int?length;//輸出長度
}*PCB[3];
/*
進程狀態status的可能取值:
0:可執行
1:輸出井滿等待
2:輸出井空等待
3:請求輸出塊用完時等待
4:進程結束
*/
struct?req
{
int?reqname;
int?length;
int?addr;
}reqblock[10];
int?buffer[2][100];
int?head=0tail=0;
int?t1=5t2=5;
void?request(int?i);//i=1?表示用戶進程1;i=2?表示用戶進程2
void?spooling();
int?main()
{
for(int?l=0;l<2;l++)
for(int?j=0;j<100;j++)
buffer[l][j]=0;
for(int?n=0;n<3;n++)
{
struct?pcb?*?tmpPcb?=?(struct?pcb*)malloc(sizeof(struct?pcb));
tmpPcb->status?=0;
tmpPcb->length?=?0;
PCB[n]=tmpPcb;
}
// cout<<“兩個用戶進程的請求分別為55“< cout<<“輸入第一個用戶的請求:“;cin>>t1;
cout<<“輸入第二個用戶的請求:“;cin>>t2;
srand((unsigned)time(NULL));
while(1)
{
int?k;
k=rand()%100;
if(k<=45)
{
if((PCB[0]->status==0)&&(t1>0))
{request(1);}
}
else?if((k<=90)&&(t2>0))
{
if(PCB[1]->status==0)
{request(2);}
}
else
{spooling();}
if((t1==0)&&(t2==0)&&(head==tail))
break;
}
for(int?m=0;m<3;m++)
{
- 上一篇:凌陽單片機61板錄音程序
- 下一篇:學生學籍管理系統c語言實現
評論
共有 條評論