资源简介
设计并实现一个spooling输出的模拟系统
①进程控制块(PCB)
对于输出进程和spooling进程两种不同的进程,采用相同的结构处理,包括进程标识、进程状态、输出缓冲、输出指针、信息块首地址、输出长度等内容。需要支持在不同状态之间的转换,输出缓冲清空等操作。
②输出请求块
包括要求输出的进程标识、输出长度、输出首地址等内容。
③输出井
使用队列结构模拟,需要支持队列重整,取队首元素,删除队首元素,在队尾插入等操作,需要使用两个指针协助操作。
代码片段和文件信息
//>>>>>>>>>>>>>>>>>>>>>头文件<<<<<<<<<<<<<<<<<<<<<<<<<
#include
#include
#include
#include
#include
//>>>>>>>>>>>>>>>>>>>>>数据结构<<<<<<<<<<<<<<<<<<<<<<<<<
struct PCB
{ //进程控制块PCB
long ID; //进程标识
int status; //状态 (0-可运行状态;1-输出井满不可运行状态;2-进程控制块;3-结束状态 )
long po; //输出指针
long head; //信息块首地址
long count; //输出长度
long wait[1000]; //输出缓冲
}PCB[5];
struct ReqBlock
{ long ID; //要求输出的进程
long len; //输出长度
long head; //输出首地址
}ReqBlock[256];
struct well
{ //输出井
long num[10000]; //输出内容
long openclosed; //队列指针
}well[4];
//>>>>>>>>>>>>>>>>>>>>>全局变量<<<<<<<<<<<<<<<<<<<<<<<<<
long K[4]L1L2[4];
long n;
long r; //程序选择环节时用于存放随机生成数
long k; //存放进程标志如pcb[k];
long ab; //a-存储输出块号如ReqBlock[a];
long i; //循坏时用的参数;
//>>>>>>>>>>>>>>>>>>>>>输入函数<<<<<<<<<<<<<<<<<<<<<<<<<
void input()
{ printf(“Input the size of user1‘s output file:(0-85)“); //size<=256/3
scanf(“%ld“&K[1]);
printf(“Input the size of user2‘s output file:(0-85)“);
scanf(“%ld“&K[2]);
printf(“Input the size of user3‘s output file:(0-85)“);
scanf(“%ld“&K[3]);
}
//>>>>>>>>>>>>>>>>>>>>>初始化函数<<<<<<<<<<<<<<<<<<<<<<<<<
void init()
{ L1=10; //空闲块初值10
L2[1]=L2[2]=L2[3]=100;
memset(PCB0sizeof(PCB));
PCB[1].ID=1;
PCB[2].ID=2;
PCB[3].ID=3;
PCB[4].ID=4;
PCB[4].status=2;
memset(well0sizeof(well));
n=0; //输出块计数初始为0;
}
//>>>>>>>>>>>>>>>>>>>>>用户进程<<<<<<<<<<<<<<<<<<<<<<<<<
void UserServer(int kx)
{ a=rand()%10;
++PCB[kx].po;
PCB[kx].wait[PCB[kx].po]=a;
if (a==0)
{ b=well[kx].closed+1;
for (i=1;i<=PCB[kx].po;i++)
well[kx].num[++well[kx].closed]=PCB[kx].wait[i];
PCB[kx].po=0;
PCB[kx].count++;
if (PCB[kx].count==K[kx]) //进程控制块用完
PCB[kx].status=3; //进程执行完毕后应置成“结束状态“
if (PCB[4].status==2) //要求输出进程在输出信息到输出井并形成信息块后,应将Spooling 进程
PCB[4].status=0; //置成“可运行状态“
if (L2[kx]==0 && PCB[kx].status==0)
PCB[kx].status=1; //如果输出井满,将进程置为“不可运行状态 1“
n++;
ReqBlock[n].ID=kx;
ReqBlock[n].head=b;
ReqBlock[n].len=well[kx].closed-b+1;
printf(“Process %ld produces a block %ld!\n“kxn);
}
}
//>>>>>>>>>>>>>>>>>>>>>spooling进程<<<<<<<<<<<<<<<<<<<<<<<<<
void SpoolingServer()
{ PCB[4].po++;
a=PCB[4].po;
printf(“Output block %ld: (ID=%ld)\n“aReqBlock[a].ID);
for (i=1;i<=ReqBlock[a].len;i++)
{ printf(“%ld “well[ReqBlock[a].ID].num[i+ReqBlock[a].head-1]);
}
printf(“\n“);
if (PCB[4].po==n)
{ PCB[4].status=2;
//Spooling 进程在输出井空时应置成“不可运行状态2“。
if (PCB[1].status==3 && PCB[2].status==3 && PCB[3].status==3)
PCB[4].
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4544 2008-12-25 00:42 六.Spooling技术\spooling技术\Spooling.cpp
文件 196734 2008-12-25 00:40 六.Spooling技术\spooling技术\Spooling技术.exe
目录 0 2008-12-25 15:23 六.Spooling技术\spooling技术
文件 71680 2008-12-25 00:46 六.Spooling技术\实验报告:Spooling技术.doc
目录 0 2009-06-05 23:19 六.Spooling技术
----------- --------- ---------- ----- ----
272958 5
- 上一篇:软件测试体系思维导图
- 下一篇:C8051F410官方例程
评论
共有 条评论