• 大小: 72KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-08
  • 语言: 其他
  • 标签:

资源简介

设计并实现一个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


评论

共有 条评论