操作系统实验1进程

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

操作系统实验报告

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

一、实验目的

自行编制模拟程序,通过形象化的状态显示,深入理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。

二、实验内容及要求

(1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。

(2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。

(3)合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。

(4)设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。

(5)代码书写要规范,要适当地加入注释。

(6)认真进行预习,完成预习报告。

(7)实验完成后,要认真总结,完成实验报告。

三、实验使用的数据结构及说明

在本实验中,主要用到的数据结构是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);

}

}

void DispatchToReady(struct PCB *node) // dispatch to ready state

{ //调度到就绪状态的函数

if(node->P_Requiry) //如果所需的资源满足,则调度

{

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

InsertQueue(&Ready_state,node);

Display_Process(node);

}

}

相关文档
最新文档