SPOOLING技术

来源:互联网 发布:大鱼端口查看器 编辑:程序博客网 时间:2024/05/17 22:41

#include <stdio.h> 

#include <string.h> 

#include <stdlib.h> 

#include <time.h> 

 

struct info_PCB 

 long ID;//进程标识 

 long status;//状态 

 long po;//输出指针 

 long head;//信息块首地址 

 long count;//输出长度 

 long len;//输出长度 

 long wait[128];

}block[128]; 

struct info_wall 

 long num[10000];//输出内容 

 long open,closed;//队列指针 

}wall[3]; 

long K[3],L1,L2[3]; long n; 

 

void input()//输入函数 

  printf("输入用户1要求输入的文件数(0~9):"); 

 scanf("%ld",&K[1]); 

 getchar();

  

  printf("输入用户2要求输入的文件数(0~9):"); 

 scanf("%ld",&K[2]); 

 getchar();

 

void init()//初始化函数 

 L1=10; 

 L2[1]=L2[2]=100; 

 memset(block,0,sizeof(block)); 

 block[1].ID=1; 

 block[2].ID=2; 

 block[3].ID=3; 

 block[3].status=2; 

 memset(wall,0,sizeof(wall)); n=0; 

 

void work()//模拟进程调度 

 long r; 

 long k; 

 long a,b; 

 long i; 

  

  while (block[1].status!=3 || block[2].status!=3 || block[3].status!=3) 

 { 

  r=rand()%100+1;//用随机数模拟进程执行概率 

  if (r<=45) 

  { 

   k=1; 

  } 

  else 

  { 

   if (r<=90) 

    k=2; 

   else 

    k=3; 

  } 

   

  if (block[k].status!=0) 

   continue; 

   

  switch (k) 

  { 

  case 1: case 2: 

   //输出进程k 

   a=rand()%10; 

   ++block[k].po; 

   block[k].wait[block[k].po]=a; 

   if (a==0) 

   { 

    b=wall[k].closed+1; 

    for (i=1;i<=block[k].po;i++) 

    { 

     wall[k].num[++wall[k].closed]=block[k].wait[i]; 

    } 

    block[k].po=0; block[k].count++; 

    if (block[k].count==K[k]) 

    //进程执行完毕后应置成"结束状态"。 

    { 

     block[k].status=3; 

    } 

    if (block[3].status==2) 

    //要求输出进程在输出信息到输出井并形成信息块后,应将 Spooling 进程置成"可运行状态"。 

    { 

     block[3].status=0; 

    }  

    if (L2[k]==0 && block[k].status==0) 

    //如果输出井满,将进程置为"不可运行状态 1" 

    { 

     block[k].status=1; 

    } 

    n++; 

    block[n].ID=k; 

    block[n].head=b; 

    block[n].len=wall[k].closed-b+1; 

        printf("Process %ld produces a block %ld!\n",k,n); 

   } 

   break; 

  case 3: 

   //Spooling 进程 

   block[3].po++; 

   a=block[3].po; 

   for (i=1;i<=block[a].len;i++)

   { 

    printf("%ld ",wall[block[a].ID].num[i+block[a].head-1]); 

   } 

   printf("\n"); 

   if (block[3].po==n) 

   { 

    block[3].status=2; 

    //Spooling 进程在输出井空时应置成"不可运行状态 2"。 

     { 

     block[3].status=3; 

    } 

   } 

   break; } 

 } 

 

int main() 

 srand(time(NULL)); 

 input(); 

 init(); 

 work();   

 return 0; 

}

原创粉丝点击