资源简介
本实验用内存来模拟spooling的输出过程,该模拟系统中包括3个请求spooling输出的用户进程、一个Spooling输出进程模块spoolout和一个spooling输出请求服务程序spoolserver,spoolserver负责接收并处理用户进程的输出请求;spoolout完成实际的输出。本实验进程调度采用随机调度法,3个用户进程的调度概率各为30%,Spoolout进程为10%,这由产生的随机数来模拟。用户进程在各自的输出缓冲区中形成输出信息序列,而后调用服务程序spoolserver请求输出。Spoolserver接受输出请求,从相应输出缓冲区中取出信息序列送输出井,并构造一个well,提交spoolout进程使用,然后返回用户进程继续执行。Spoolout进程执行时,根据取出的某reqblock的内容将输出井中的相应输出文件送实际输出设备,并释放井区。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LEN sizeof(struct files)
using namespace std;
struct files{
char filename[10];
int filelen;
struct files *next;
};
struct block{
char filename[10];
char username[10];
int filelen;
int flag;
};
struct process{
char id[10];//进程标识
char status[10];//进程运行状态
int bufflag;//输出缓冲区空闲标志
int files;//输出的文件记数
struct block outbuff;//输出缓冲
struct files *head;
}proce[4];
struct reqdlock{
char reqid[10];//请求进程的标识
int size;//输出文件的长度
int addr;//输出文件在输出井中的首地址
};
ofstream fout;
char outputFileName[20];
int outbuffer=100;//输出缓冲区
//struct block outbuff[3];
int wellsize=500;//输出井大小
struct block well[5];//输出井最多可以放5个文件并且每个文件长度小于100kb
int wellbuffer=100;//井被划分为100为单位的物理块
//初始化系统信息
void input(struct process &tempint num)
{
if(num==1)
strcpy(temp.id“user1“);
if(num==2)
strcpy(temp.id“user2“);
if(num==3)
strcpy(temp.id“user3“);
strcpy(temp.status“E“);
temp.bufflag=0;//将进程的输出缓冲标志置为空闲
struct files *p*q;
cout<<“请输入用户“< cin>>temp.files;
if(temp.files<0)
temp.files=0;
if(temp.files>0)
{
for(int i=0;i {
p=(struct files*)malloc(LEN);
cout<<“用户“< cin>>p->filename;
cout<<“用户“< cin>>p->filelen;
if(p->filelen>100) p->filelen=100;
if(i==0) temp.head=p;
else q->next=p;
q=p;
}
if(temp.files!=0)
strcpy(temp.status“R“);//有文件为可执行
q->next=NULL;
}
}
void init()
{
for(int i=1;i<=3;i++)
{
input(proce[i]i);
}
//输出井的初始化
for(i=0;i<5;i++)
{
well[i].flag=0;
}
}
void dis_user(struct process &tempofstream &fout)
{
struct process p;
struct files *q;
p=temp;
//输出进程信息
cout<<“------------------------------------------------------------------“< fout<<“------------------------------------------------------------------“< cout<<“进程标识 输出的文件记数 运行状态 输出缓冲区空闲标志“< fout<<“进程标识 输出的文件记数 运行状态 输出缓冲区空闲标志“< cout< fout<<“ “< cout<<“------------------------------------------------------------------“< fout<<“------------------------------------------------------------------“< q=temp.head;
//输出文件信息
cout<<“用户进程“< fout<<“用户进程“< while(q!=NULL)
{
cout<<“文件“<filename<<“ “<filelen<<“KB“< fout<<“文件“<filename<<“ “<filelen<<“KB“< q=q->next;
}
cout<<“------------------------------------------------------------------“< if(temp.bufflag==1)
{cout<<
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 272226 2008-01-04 17:59 spooling\Debug\spooling.obj
文件 323646 2008-01-04 17:59 spooling\Debug\spooling1.exe
文件 1123328 2008-01-04 17:59 spooling\Debug\spooling1.pdb
文件 126976 2008-01-04 17:59 spooling\Debug\vc60.pdb
文件 7457 2008-01-04 17:59 spooling\spooling.cpp
文件 14062 2008-01-04 17:34 spooling\spooling.txt
文件 4319 2008-01-01 21:27 spooling\spooling1.dsp
文件 541 2008-01-01 19:48 spooling\spooling1.dsw
文件 50176 2008-01-04 18:00 spooling\spooling1.ncb
文件 53760 2008-01-04 17:59 spooling\spooling1.opt
文件 976 2008-01-04 17:59 spooling\spooling1.plg
文件 120105 2008-01-04 17:55 spooling\spooling1.txt
目录 0 2008-01-08 13:42 spooling\Debug
目录 0 2008-01-08 13:42 spooling
----------- --------- ---------- ----- ----
2097572 14
评论
共有 条评论