📄 spooling.cpp
字号:
/****************************************/
//模拟Spooling技术输出文件
//davenathan bio.hit
//2006-11-15
/****************************************/
#include<iostream>
#include<cstdlib>
#define N 100
using namespace std;
//定义相关资源
struct PCB
{
int ID; //进程标识数
int* output; //输出指针
int num; //所占用输出井标号
int first_output; //信息块首地址
}out1,out2;
int output[10][N]; //输出井
int output_finish[10]={0}; //输出井满或输出到输出井完成时的标志
int number1=0,number2=0; //两个进程分别要输出的文件数
int free_process[10]={0}; //空闲输出请示链
int out_number=0; //实际输出的文件个数
//初始化
void Init();
//Spooling进程调度
void Spooling();
//进程调度
void Schedule();
//输出进程
void OutProcess1();
void OutProcess2();
void main(void)
{
Init();
while(1)
{
Schedule();
}
}
void Init()
{
//初始化PCB
out1.ID=1;
out1.num=0;
out1.output=output[out1.num];
out1.first_output=0;
out2.ID=2;
out2.num=1;
out2.output=output[out2.num];
out2.first_output=0;
//输出井中0和1两个位置已经使用
free_process[0]=1;
free_process[1]=1;
//初始化输出井及输出次数
for(int i=0; i<10; i++)
for(int j=0; j<N; j++)
output[i][j]=' ';
cout<<"Input the times of user1's output file(1-5)";
cin>>number1;
cout<<"Input the times of user1's output file(1-5)";
cin>>number2;
out_number=number1+number2;
}
void Schedule()
{
int rand_number;
// cout<<"请输入0-99的任意数,以决定将要运行的进程";
// cin>>rand_number;
rand_number=rand()%100;
if(rand_number<46)
{
cout<<"运行输出进程1 "<<endl;
OutProcess1();
}
else if(rand_number<91)
{
cout<<"运行输出进程2 "<<endl;
OutProcess2();
}
else
{
cout<<"运行Spooling进程 ";
Spooling();
}
}
void OutProcess1()
{
if(number1==0)
{
cout<<"进程1所要输出的内容已全部输出到输出井中"<<endl;
return;
}
int outnumber;
// cout<<"请输入要向输出井中输出的数字(0-9),0为文件结尾标志";
// cin>>outnumber;
outnumber=rand()%10;
//防止输出井溢出
if(out1.first_output==N-1)
outnumber=0; //强制结束
out1.output=output[out1.num];
*(out1.output+out1.first_output)=outnumber; //将结果输出到输出井中
out1.first_output++;
if(outnumber==0) //要输出结束标志
{
number1--; //已向输出井输出完成一个文件
output_finish[out1.num]=1; //标记输出井接受全部文件标志
if(number1!=0) //还有文件要输出
for(int i=0; i<10; i++) //寻找空闲的输出井
if(free_process[i]==0)
{
out1.num=i;
free_process[i]=1;
break;
}
}
}
void OutProcess2()
{
if(number2==0)
{
cout<<"进程2所要输出的内容已全部输出到输出井中"<<endl;
return;
}
int outnumber;
// cout<<"请输入要向输出井中输出的数字(0-9),0为文件结尾标志";
// cin>>outnumber;
outnumber=rand()%10;
//防止输出井溢出
if(out1.first_output==N-1)
outnumber=0; //强制结束
out2.output=output[out2.num];
*(out2.output+out2.first_output)=outnumber; //将结果输出到输出井中
out2.first_output++;
if(outnumber==0) //要输出结束标志
{
number2--; //已向输出井输出完成一个文件
output_finish[out2.num]=1; //标记输出井接受全部文件标志
if(number2!=0) //还有文件要输出
for(int i=0; i<10; i++) //寻找空闲的输出井
if(free_process[i]==0)
{
out2.num=i;
free_process[i]=1;
break;
}
}
}
void Spooling()
{
int kong=0;
for(int i=0; i<10; i++)
{
if(output_finish[i]==0)
kong++;
else
{
//将已经输出完成的输出井中信息输出
for(int j=0; j<N; j++)
{
if(output[i][j]!=' ')
{
cout<<output[i][j];
output[i][j]=' ';
}
}
output_finish[i]=0;
free_process[i]=0;
out_number--;
cout<<endl;
if(out_number==0)
{
cout<<"两个进程所要输出内容全部完成"<<endl;
exit(0);
}
return;
}
}
if(kong==10)
{
cout<<endl<<"输出井无完整输出信息,无法向I/O设备输出."<<endl;
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -