操作系统实验报告+进程状态转换

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验进程状态转换及其PCB的变化

一、程序流程图:

二、使用的数据结构及说明:

在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下:

struct PCB

{

int P_Id; //PCB的ID号

char P_Name[10]; //PCB的名称

char P_State[10]; //PCB状态

int P_Runtime; //PCB的所需要的运行时间

int P_Requiry; //PCB所需要的资源要求

struct PCB * next ; //PCB块的下一个指针

} ;

其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:

Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry 置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB块。

三、程序源代码:

#include"stdlib.h"

#include"stdio.h"

#include"string.h"

/********** globle structure and viable ******/

struct PCB

{

int P_Id; //PCB的ID号

char P_Name[10]; //PCB的名称

char P_State[10]; //PCB状态

int P_Runtime; //PCB的所需要的运行时间

int P_Requiry; //PCB所需要的资源要求

struct PCB * next ; //PCB块的下一个指针

} ;

struct PCB * Create_state; //创建状态

struct PCB * Run_state; //运行状态

struct PCB * Ready_state; //就绪状态

struct PCB * Block_state; //阻塞状态

struct PCB * Exit_state; //退出状态

int signal4=0; //标示进程4的完成状态

int signal5=0; //标示进程5的完成状态

void InsertQueue(struct PCB **head,struct PCB *node) /* insert node function */

{

struct PCB * p,*q;

node->next=NULL;

if(*head==NULL) //如果队列为空

{

*head=node;

}

Else //队列不空

{

p=*head;

q=p->next;

while(q!=NULL) //找到最后的元素位置

{

p=q;

q=q->next;

}

p->next=node; //将节点插入队列

}

void DeleteQueue(struct PCB **head,struct PCB *node) //撤销进程,从队列中删除元素{

struct PCB *p,*q;

q=*head;

if(*head==NULL||node==NULL) //如果队列为空,返回

return ;

if(*head==node) //如果要删除的元素是队首元素

{

*head=(*head)->next;

return;

}

Else //如果不是队列的首元素

{

while(q->next!=p&&q->next!=NULL)

q=q->next;

q=p->next;

p->next=NULL;

}

}

void Display_Process(struct PCB * node) //打印进程状态的元素函数

{

printf("\n\nthis process Id is : %d \n",node->P_Id);

printf("this process name is : %s \n",node->P_Name);

printf("this process state is : on %s \n ",node->P_State);

printf("this process Runtime is : %d \n",node->P_Runtime);

if(node->P_Requiry)

printf("this process resource is ready \n");

else

printf("this process resource is not ready ! \n");

}

void DispatchToBlock(struct PCB *node) // /* dispatch to block function*/

{ //调度到阻塞状态的函数//struct PCB *p=(struct PCB *)malloc(sizeof(struct PCB));

if(!node->P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态{

strcpy(node->P_State,"block");

InsertQueue(&Block_state,node); //插入到阻塞队列

Display_Process(node);

}

相关文档
最新文档