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

📄 spooling.cpp

📁 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 + -