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

    xiaoxiao2026-03-01  8

    首先大家祝福平安夜快乐啊,今天要发布的代码是一款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 -------------------------------------------------------------------------------------- 以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。
    转载请注明原文地址: https://ju.6miu.com/read-1307508.html
    最新回复(0)