操作系统,模拟进程管理之PCB块管理法,C语言实现
2016-08-16 10:38
477 查看
首先大家祝福平安夜快乐啊,今天要发布的代码是一款C语言编写的模拟操作系统管理进程的程序调试环境TC,使用了PCB进行进程管理控制,建立三个基本的队列:等待、执行、阻塞进行模拟操作系统的进程管理,模拟进程的调度,模拟用户的创建、执行、阻塞、挂起、唤醒等操作
最近要准备准备操作系统考试,所以放一个程序跟大家分享
代码如下:
--------------------------------------------------------------------------------------
- 版权声明:
- 如在本页面内无特别说明,本文内容均为[李大仁博客]原创,本文版权归[李大仁博客]所有。
- 欢迎转载,转载请务必在文章页面明显位置提供原文链接并注明出处。欢迎您在转载本文时保留本段声明。
- 文章标题:操作系统,模拟进程管理之PCB块管理法,C语言实现
- 独立博客:李大仁博客
- 永久链接:http://www.lidaren.com/archives/261
--------------------------------------------------------------------------------------
以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。
最近要准备准备操作系统考试,所以放一个程序跟大家分享
代码如下:
/* *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
--------------------------------------------------------------------------------------
以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。
相关文章推荐
- 操作系统的进程管理(c语言模拟)
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
- 用C语言实现对N个进程的简单时间片轮转法Round Robin的调度模拟
- 【C语言】模拟狭窄停车场管理,使用栈和队列实现
- 操作系统实验之一--进程调度算法的模拟实现
- 学生信息管理系统简单模拟(C语言实现)
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
- java做的操作系统进程管理模拟(操作系统作业)
- 操作系统用C语言模拟进程基于优先级的调度程序
- 操作系统进程调度管理实验【C语言】【源码】【windows版】
- 【操作系统】C语言模拟操作系统实现动态分区分配算法
- 2013-05-19《进程管理模拟的实现》
- 【操作系统】可变分区存储管理,模拟实现
- 操作系统模拟内存管理实验,C语言链表实现,附源码
- 操作系统用C语言模拟基于时间片进程调度程序
- 操作系统进程调度之多级反馈队列算法模拟实现
- 【操作系统】C语言模拟操作系统实现磁盘调度算法——电梯调度算法
- C语言停车场模拟管理程序的设计与实现
- 【操作系统】进程程序替换之模拟实现一个简易的Shell