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

📄 spooling.cpp

📁 模拟操作系统假脱机(spooling)技术
💻 CPP
字号:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

struct pcb{             //进程控制块
	int status;         //进程状态
	int length;         //
}*PCB[3];

struct req{             //输出请求块
	int reqname;        //请求进程名
	int length;         //本次输出信息长度
	int addr;           //信息在输出井的首地址
}reqblock[10];

int buffer[2][100];     //输出井
int head = 0, tail = 0;
int t1, t2;            //分别为用户进程1和用户进程2请求输出的文件数

void request(int i);
void spooling(void);

int main(void)
{
	int j, k, l, m, n;
	struct pcb* tmpPcb;

	for(l = 0; l < 2; l++)
		for(j = 0; j < 100; j++)
			buffer[l][j] = 0;

	for(n = 0; n < 3; n++){
		tmpPcb = (struct pcb*)malloc(sizeof(struct pcb));
		tmpPcb->status = 0;
		tmpPcb->length = 0;
		PCB[n] = tmpPcb;
	}

	printf("请输入两个用户进程的请求:\n");
	scanf("%d %d", &t1, &t2);
	srand((unsigned)time(NULL));
	while(1){
		k = rand()%100;
		if(k <= 45){                 //调用用户进程1
			if((0 == PCB[0]->status) && (t1 > 0))
				request(1);
		}
		else if((k <= 90) && (t2 > 0)){ //调用用户进程1
			if(0 == PCB[1]->status)
				request(2);
		}
		else
			spooling();                 //调用spooling服务程序
		if((0 == t1) && (0 == t2) && (head == tail))//即用户请求输入的全部输出了,这时结束
			break;
	}

	for(m = 0; m < 3; m++){        //释放内存
		free(PCB[m]);
		PCB[m] = NULL;
	}
	getchar();
	return 0;
}

void request(int i)
{
	int j, m, s, length = 0;
	int index;
	struct req* run;

	if(1 == i)
		t1--;
	else
		t2--;
	printf("用户%d请求数据:\n", i);
	run = &reqblock[tail%10];
	run->reqname = i;
	run->length = 0;
	if(0 == tail)
		run->addr = 0;
	else{
		index = (tail-1)%10;
		run->addr = reqblock[index].addr + reqblock[index].length;
	}
	for(m = 0; m < 100; m++){
		if(0 == buffer[i-1][m]){
			run->addr = m;
			break;
		}
	}
	s = 0;
	while(1){
		j = rand()%10;             //随机产生用户进程请求输出的数据
		if(0 == j){
			run->length = length;
			break;
		}
		buffer[i-1][(run->addr+length)] = s;
		printf("%d ", s);
		s++;
		length++;
	}
	printf("\n");
	PCB[i-1]->length += length;
	length = 0;
	if(2 == PCB[2]->status)//将处于等待状态的进程唤醒
		PCB[2]->status = 0;
	tail++;
}

void spooling(void)
{
	struct req* run;
	int i, j;

	printf("调用SPOOLING输出服务程序输出数据:\n");
	run = &reqblock[head%10];
	printf("%d:\n", run->reqname);
	for(i = 0; i < run->length; i++)
		printf("%d ", buffer[run->reqname-1][run->addr+i]);
	printf("\n");
	head++;
	for(j = 0; j < 2; j++){    //将处于等待状态的进程唤醒
		if(1 == PCB[j]->status)
			PCB[j]->status = 0;
	}
}

⌨️ 快捷键说明

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