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

By [limccn](https://paragraph.com/@limccn) · 2022-07-15

---

首先大家祝福平安夜快乐啊，今天要发布的代码是一款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\*/

* * *

title: "操作系统，模拟进程管理之PCB块管理法，C语言实现" date: "2008-12-24" categories:

*   "algorithms" tags:
    
*   "ccplusplus"
    
*   "os"
    

* * *

---

*Originally published on [limccn](https://paragraph.com/@limccn/pcb-c)*
