C语言实现的进程管理代码示例

2星 需积分: 47 12 下载量 199 浏览量 更新于2024-10-29 1 收藏 3KB TXT 举报
"该资源是一个C语言编写的进程管理源代码,适用于操作系统实验,涉及到进程状态、优先级、信号量等概念。" 这段代码实现了一个简单的进程管理模型,包括进程的初始化、查找可运行进程、进程阻塞和唤醒等功能。在操作系统中,进程管理是核心部分,它涉及到进程的创建、撤销、状态转换(如就绪、运行、阻塞)以及同步和通信等概念。 1. **进程控制块 (PCB, Process Control Block)**:在`pcb`结构体中定义了进程的基本信息,如进程ID(`id`)、等待状态(`waiter1`)、优先级(`priority`)、状态(`status`)和栈(`stack`)。进程的状态可能包括'运行'(r)、'就绪'(r)和'阻塞'(w)。 2. **信号量机制 (Semaphore)**:`sem`结构体表示信号量,包含当前值(`value`)和等待队列中的下一个进程ID(`waiter2`)。信号量用于进程间的同步和互斥,防止资源竞争。 3. **初始化函数 `init()`**:此函数负责初始化所有进程和信号量的状态。所有的进程初始状态都是就绪('r'),没有进程在等待,信号量的初始值为0。 4. **查找可运行进程函数 `find()`**:该函数遍历进程控制块数组,寻找状态为'就绪'的进程,返回其ID。如果所有进程都未处于就绪状态,函数返回0。 5. **进程阻塞函数 `p(int se, int p, char ad)`**:当进程尝试访问一个资源但资源不可用时,调用此函数进行阻塞。函数会减少指定信号量`se`的值,如果信号量值小于0,进程将被阻塞,并将其插入到信号量的等待队列中。同时,进程的状态更改为'阻塞'。 6. **进程唤醒函数 `v(int se, int p, char ad)`**:当一个资源变得可用时,调用此函数唤醒等待的进程。函数增加信号量的值,如果值仍小于0,则说明还有其他进程在等待,唤醒等待队列头部的进程,将其状态恢复为'就绪'。 这个简单的模型展示了操作系统如何管理和调度进程的基本逻辑,但实际操作系统中的进程管理远比这复杂,涉及到更多的调度算法、内存管理、上下文切换等内容。此外,代码中没有处理进程调度的部分,实际操作系统会有一个调度器根据某种策略决定下一个运行的进程。
2014-04-08 上传
#include #include "dos.h" #include "stdlib.h" #include "conio.h" //PCB结构体 struct pcb{ int id; //进程序号 int ra; //所需资源A的数量 int rb; //所需资源B的数量 int rc; //所需资源C的数量 int ntime; //所需的时间片个数 int rtime; //已经运行的时间片个数 char state; //进程状态 struct pcb *next; } *hready=NULL,*hblock=NULL,*p; //hready,hblock分别为指向就绪和阻塞队列 typedef struct pcb PCB; int m,n,r,a,b,c,h=0,i=1,time1Inteval; //m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //建立一个PCB结构体型的空链表 PCB *increat(void) { PCB *head=NULL; //head=NULL; return(head); } //从链表起始地址开始输出该链表的内容 void disp(PCB *head) {PCB *p1; p1=head; AnsiString str2; if(head!=NULL) //链表非空 { do { str2+=" "; str2+=IntToStr(p1->id);str2+=" "; str2+=(p1->state);str2+=" "; str2+=IntToStr(p1->ra);str2+=" "; str2+=IntToStr(p1->rb);str2+=" "; str2+=IntToStr(p1->rc);str2+=" "; str2+=IntToStr(p1->ntime);str2+=" "; str2+=IntToStr(p1->rtime);str2+="\r\n"; p1=p1->next; }while(p1!=NULL); //不断输出进程的信息,直到链尾! } //if else { str2+="\t\t该 队 列 中 没 有 进 程!\r\n" ;} Form1->Memo1->Lines->Add(str2); } //将进程插入到链尾(包括就绪队列和阻塞队列) PCB *insert(PCB *head,PCB*pcb) //带两个指针形参:队列指针和当前进程PCB { PCB *pi,*p1; p1=head; pi=pcb; if (head==NULL) { head=pi; pi->next=NULL; } else { while(p1->next!=NULL) {p1=p1->next;} p1->next=pi; pi->next=NULL; } return(head); } //对进程进行初始化,建立就绪队阻塞队列。 void input() { AnsiString str1; m=StrToInt (Form1->Edit1->Text); //读取要模拟的进程总数给m n=StrToInt (Form1->Edit2->Text); //读取需初