Home > 算法研究 > 操作系统,模拟进程管理之PCB块管理法,C语言实现

操作系统,模拟进程管理之PCB块管理法,C语言实现

首先大家祝福平安夜快乐啊,今天要发布的代码是一款C语言编写的模拟操作系统管理进程的程序调试环境TC,使用了PCB进行进程管理控制,建立三个基本的队列:等待、执行、阻塞进行模拟操作系统的进程管理,模拟进程的调度,模拟用户的创建、执行、阻塞、挂起、唤醒等操作

最近要准备准备操作系统考试,所以放一个程序跟大家分享


代码如下:

/*
*yctc cg
*/
#include "stdio.h"
#include "dos.h"
#include "stdlib.h"
#include "conio.h"
#define SEC 3
#define NULL 0
/*定义结构体*/
typedef struct PCB
{
  int PID;
  int UID;
  struct PCB * next;
}PCB;
PCB *really , *excute , *wait;
/*create queue header */
/*queue operation 入队*/
int enqueue(PCB *head , PCB *node)
{
   PCB *p;
   p = head;
   if(p -> next == NULL)
  {
    head -> next = node;
    return 1;
  }
   while(p)
   {
   if(p -> next == NULL)
  {
    p -> next = node;
    return 1;
  }
  else p = p -> next;
   }
}/*enquue*/
/*dequeue 出队列 */
PCB * dequeue(PCB *head)
{
  PCB *p;
  p = head;
  if(p -> next == NULL)
    {
    return NULL;
    }
  else
  {
    p = p -> next;
    head -> next = p -> next;
    p -> next = NULL;
    return p;
  }
    /*head to next*/
}/*dequeue*/
 
/*PCB operate*/
/*新建进程*/
int create()
{
    PCB *p;
    p = (PCB*)malloc(sizeof(PCB));
    p -> next = NULL;
    printf("input PID and UID to a new processn");
    scanf("%d %d",&p -> PID,&p -> UID);
    if(enqueue(really , p))
  printf("create a process: PID = %d UID = %dn", p -> PID , p -> UID);
    else
  printf("create Failedn");
}/*create*/
 
/*执行 fexcute*/
int fexcute()
{
   PCB *p = dequeue(really);
   if(p == NULL)
  {
    printf("NO process in queue n");
    return 0;
  }
   else
  {
    enqueue(excute , p);
    printf("add a process into excute queue process: PID = %d UID= %d n" ,p->PID , p->UID);
    return 1;
  }
}/*excute*/
 
int suspend()
{
  PCB *p = dequeue(excute);
   if(p == NULL)
  {
    printf("NO process in queue n");
    return 0;
  }
   else
  {
    enqueue(really , p);
    printf("add a process into really queue process: PID = %d UID= %d n" ,p->PID , p->UID);
    return 1;
  }
}
 
int wake()
{
  PCB *p = dequeue(wait);
   if(p == NULL)
  {
    printf("NO process in queue n");
    return 0;
  }
   else
  {
    enqueue(really , p);
    printf("add a process into wait really process: PID = %d UID= %d n" ,p->PID , p->UID);
    return 1;
  }
}
 
int block()
{
  PCB *p = dequeue(excute);
   if(p == NULL)
  {
    printf("NO process in queue n");
    return 0;
  }
   else
  {
    enqueue(wait , p);
    printf("add a process into wait queue process: PID = %d UID= %d n" ,p->PID , p->UID);
    return 1;
  }
}/*block*/
/*输出队列 outputqueue*/
int outputqueue(PCB *head)
{
   PCB *p;
   if(head -> next == NULL)
    {/*队列为空*/
  printf("queue is null n");
  return 1;
    }
   p = head -> next; /*node pointer*/
   while(p)
    {/*打印process id UID*/
  printf("PID = %d UID = %d n" , p -> PID , p -> UID);
  p = p -> next;
    }
    return 0;
}
/*output输出*/
int output()
{
  printf("REALLLY QUEUE:n");
  outputqueue(really);
  printf("EXCUTE QUEUE: n");
  outputqueue(excute);
  printf("WAIT QUEUE: n");
  outputqueue(wait);
}/*output*/
/*init 初始化*/
int init()
{
  PCB *p;
  clrscr();
  really = (PCB*)malloc(sizeof(PCB));
  really -> next=NULL;
  excute = (PCB*)malloc(sizeof(PCB));
  excute -> next=NULL;
  wait = (PCB*)malloc(sizeof(PCB));
  wait -> next = NULL;
  printf("____________PROCESS SECHUDLE__________n");
  printf("now initing.....................n");
  printf("input PID and UID as integer , 0 0 as overn");
  while(1)
  {
    p = (PCB*)malloc(sizeof(PCB));
    p -> next = NULL;
    scanf("%d %d",&p -> PID , &p -> UID);
    if(p -> PID == 0 && p -> UID == 0)
        break;
    else
      {
        if(enqueue(really , p))
          {
        printf("new process PID = %d UID = %d added!n",p -> PID , p -> UID);
          }
        else return 0;
        }
  }
  return 1;
}/*init*/
/*运行一个process*/
int run()
{
  PCB *p = excute;
  int s = SEC;
  if(excute -> next == NULL)
  {
   printf("no process in excute queue n");
   return 0;
  }
  else
  {
    p = excute -> next;
    printf("system will sleep %ds as process runningn",s);
    sleep(3);/*sleep as process runing time*/
    printf("process: PID = %d UID= %d excute successed..n" , p -> PID , p -> UID );
    excute -> next = p -> next;
    free(p);
  }
}/*run*/
/*离开*/
int leave()
{
  PCB *p,*t;
  while(really->next || excute->next || wait->next)
  {
    p = really -> next;
    while(p)
    {
      t = p -> next;
      free(p);
      p = t;
    }
    really -> next = NULL;
    p = wait -> next;
    while(p)
    {
      t = p -> next;
      free(p);
      p = t;
    }
    wait -> next = NULL;
    p = excute -> next;
    while(p)
    {
      t = p -> next;
      free(p);
      p = t;
    }
    excute -> next = NULL;
  }
  exit(0);
}/*leace*/
 
int help()
{
  printf("_____________________HELP MENU_____________________n");
  printf("t-h HELP show help optionn");
  printf("t-c CREATE create a new process , and put to really queuen");
  printf("t-b BLOCK block a process in excute queuen");
  printf("t-w WAKE wake a process in wait queuen");
  printf("t-e EXCUTE excute a process in really queuen");
  printf("t-s SUSPEND suspend a process in excute queuen");
  printf("t-o OUTPUT output all processes in queuesn");
  printf("t-r RUN excute a process in excute queuen");
  printf("t-x EXIT exit this programn");
  printf("___________________________________________________n");
  printf("t type 'H' will show this menun");
}/*help*/
 
int main()
{
  char COMMAND = NULL;
  if( init() != 1)
    {
      printf("init falied ! n ");
      getch();
      exit(0);
    }
  else
    {
      printf("init...OKn");
      output();
      help();
    }
  while(1)
  {
    /*当三队列都不空 执行调度 */
    printf(">");
    scanf("%c",&COMMAND);
    switch(COMMAND)
    {
      case 'n': break;
      case 'H':
      case 'h': help(); break;
      case 'C':
      case 'c': create(); break;
      case 'B':
      case 'b': block(); break;
      case 'W':
      case 'w': wake(); break;
      case 'S':
      case 's': suspend(); break;
      case 'E':
      case 'e': fexcute(); break;
      case 'O':
      case 'o': output(); break;
      case 'X':
      case 'x': leave(); break;
      case 'R':
      case 'r': run(); break;
    }
 }
}/*main*/
Categories: 算法研究 Tags: ,
  1. xq445566
    April 22nd, 2009 at 19:58 | #1

    very good

  2. April 22nd, 2009 at 22:03 | #2

    谢谢

  1. No trackbacks yet.
You must be logged in to post a comment.