⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spooling.txt

📁 模拟实现spooling技术 一个用C做的假脱机SPOOLING输入程序
💻 TXT
字号:
#include <cstdio> 
#include <cstring> 
#include <cstdlib>
#include <ctime> 

struct info_PCB 
{ 
long ID;//进程标识 
long status;//状态 
long po;//输出指针 
long head;//信息块首地址 
long count;//输出长度 
long wait[1000];//输出缓冲 
}PCB[4]; 
struct info_block 
{ 
long ID;//要求输出的进程 
long len;//输出长度 
long head;//输出首地址 
}block[128]; 
struct info_wall 
{ 
long num[10000];//输出内容 
long open,closed;//队列指针 
}wall[3]; 
long K[3],L1,L2[3]; 
long n; 

void input()//输入函数 
{ 
printf("Input the times of user1's output file:"); 
scanf("%ld",&K[1]); 

printf("Input the times of user2's output file:"); 
scanf("%ld",&K[2]); 
} 

void init()//初始化函数 
{ 
L1=10; 
L2[1]=L2[2]=100; 
memset(PCB,0,sizeof(PCB)); 
PCB[1].ID=1; 
PCB[2].ID=2; 
PCB[3].ID=3; 
PCB[3].status=2; 
memset(wall,0,sizeof(wall));
n=0; 
} 

void work()//模拟进程调度 
{ 
long r; 
long k; 
long a,b; 
long i,j; 

while (PCB[1].status!=3 || PCB[2].status!=3 || PCB[3].status!=3) 
{ 
r=rand()%100+1;//用随机数模拟进程执行概率 
if (r<=45) 
{ 
k=1; 
} 
else 
{ 
if (r<=90) 
k=2; 
else 
k=3; 
} 

if (PCB[k].status!=0) 
continue; 

switch (k) 
{ 
case 1: 
case 2: 
//输出进程k 
a=rand()%10; 
++PCB[k].po; 
PCB[k].wait[PCB[k].po]=a; 
if (a==0) 
{ 
b=wall[k].closed+1; 
for (i=1;i<=PCB[k].po;i++) 
{ 
wall[k].num[++wall[k].closed]=PCB[k].wait[i]; 
} 
PCB[k].po=0; 
PCB[k].count++; 
if (PCB[k].count==K[k]) 
//进程执行完毕后应置成"结束状态"。 
{ 
PCB[k].status=3; 
} 
if (PCB[3].status==2) 
//要求输出进程在输出信息到输出井并形成信息块后,应将 Spooling 进程 
置成"可运行状态"。 
{ 
PCB[3].status=0; 
} 
if (L2[k]==0 && PCB[k].status==0) 
//如果输出井满,将进程置为"不可运行状态 1" 
{ 
PCB[k].status=1; 
} 
n++; 
block[n].ID=k; 
block[n].head=b; 
block[n].len=wall[k].closed-b+1; 
printf("Process %ld produces a block %ld!\n",k,n); 
} 
break; 
case 3: 
//Spooling 进程 
PCB[3].po++; 
a=PCB[3].po; 
printf("Output block %ld: (ID=%ld)\n",a,block[a].ID); 
for (i=1;i<=block[a].len;i++) 
{ 
printf("%ld ",wall[block[a].ID].num[i+block[a].head-1]); 
} 
printf("\n"); 
if (PCB[3].po==n) 
{ 
PCB[3].status=2; 
//Spooling 进程在输出井空时应置成"不可运行状态2"。 
if (PCB[1].status==3 && PCB[2].status==3) 
{ 
PCB[3].status=3; 
} 
} 
break; 
} 
} 
} 

int main() 
{ 
srand(time(NULL)); 
input(); 
init(); 
work(); 

return 0; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -