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

2019-07-14 07:12发布

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


--------------------------------------------------------------------------------------
- 版权声明:
- 如在本页面内无特别说明,本文内容均为[李大仁博客]原创,本文版权归[李大仁博客]所有。
- 欢迎转载,转载请务必在文章页面明显位置提供原文链接并注明出处。欢迎您在转载本文时保留本段声明。
- 文章标题:操作系统,模拟进程管理之PCB块管理法,C语言实现
- 独立博客:李大仁博客
- 永久链接:http://www.lidaren.com/archives/261
--------------------------------------------------------------------------------------
以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。