-
操作系统实验报告:进程状态转换及其对应的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);
}
}
void DispatchBlockToReady() //dispatch the process to readyqueue
{ //从阻塞状态调度到就绪状态函数
struct PCB*p,*q;
q=Block_state;
while(q!=NULL) //如果阻塞状态队列不空
{
p=q;
q=q->next;
if(signal4&&p->P_Id==4) //如果所需要的资源满足
{
DeleteQueue(&Block_state,p);
strcpy(p->P_State,"ready");
InsertQueue(&Ready_state,p);
printf("process4 will be in the state of ready!\n");
Display_Process(p);
}
if(signal5&&p->P_Id==5)
{
DeleteQueue(&Block_state,p);
strcpy(p->P_State,"ready");
InsertQueue(&Ready_state,p);
printf("process5 will be in the state of ready!\n");
Display_Process(p);
}
}
}
void Create_Process() //创建进程函数
{
int i;
struct PCB *p;
char name[10];
strcpy(name,"process");
for(i=1;i<3;i++) //动态创建2个处于阻塞状态的进程
{
p=(struct PCB *)malloc(sizeof(struct PCB));
p->P_Id=i;
name[7]=i+'0';
name[8]='\0';
strcpy(p->P_Name,name);
strcpy(p->P_State,"create");
p->P_Runtime=1; //所需要的时间片为1
p->P_Requiry=0;
Display_Process(p);
sleep(4);
printf(" \n process%d will be in the state of Block, waiting the resource ready \n\n",i);
DispatchToBlock(p); //同时调度到阻塞队列
}
for(i=3;i<7;i++) //创建4个就绪状态的队列
{
p=(struct PCB *)malloc(sizeof(struct PCB));
p->P_Id=i;
name[7]=i+'0';
name[8]='\0';
strcpy(p->P_Name,name);
strcpy(p->P_State,"create");
p->P_Requiry=1;
if(i==6) //在这里个进程6所需要的时间片为2
p->P_Runtime=2;
else
p->P_Runtime=1;
Display_Process(p);
sleep(4);
printf(" \n process%d will be in the state of Ready, waiting to run \n\n",i);
DispatchToReady(p);
}
}
void display(struct PCB **head) //打印各个状态队列里进程数目
{
struct PCB *p,*q;
p=*head;
while(p!=NULL)
{
sleep(2);
//printf("\n\n///////////////////////////////////\n");
printf("\n\nthis process Id is : %d \n",p->P_Id);
printf("this process name is : %s \n",p->P_Name);
printf("this process state is : on %s \n ",p->P_State);
printf("this process Runtime is : %d \n",p->P_Runtime);
if(p->P_Requiry)
printf("this process resource is ready \n");
else
printf("this process resource is not ready ! \n");
p=p->next;
}
}
void Process_Run() //进程运行函数
{
struct PCB *p,*q;
p=Ready_state;
q=p;
while(p!=NULL) //就绪队列不空则继续执行
{
if(p->P_Runtime<=0) break; //如果时间片执行完了,则跳出循环
strcpy(p->P_State,"running");
Display_Process(p);
p->P_Runtime=p->P_Runtime-1;
sleep(4);
if(p->P_Runtime>0) //没有完成,则进入就绪队列
{
printf("this process is not finished,will be dispatch to the ready queue!!\n");
DeleteQueue(&Ready_state,p);
strcpy(p->P_State,"ready");
InsertQueue(&Ready_state,p);
Display_Process(p);
}
Else //执行完成,则跳出,并发送相应的信息
{
printf("\n\nProcess%d is finished and will be in the state of exit!\n\n",p->P_Id);
if(p->P_Id==4) signal4=1;
if(p->P_Id==5) signal5=1;
}
if(signal4||signal5)
DispatchBlockToReady(); //如果资源满足,则将进程调度到就绪队列
q=q->next;
p=q;
}
if(q==NULL)
printf("\nthere is no process ready!\n STOP Machine!!!\n");
}
int main(int argc,char * argv[]) //主函数
{
int i;
char c='c'; //界面
printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n");
printf("...................................Ding Hai bo\n");
printf("......Press s to start the process.......\n");
scanf("%c",&c);
while(1)
{
if(c=='s')break;
scanf("%c",&c);
}
Create_Process(); //调用创建进程函数
printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf("\n>>>>>>> Display the Ready queue >>>>>>>>>>>>>>>\n");
sleep(5);
display(&Ready_state); ////////////////显示就绪队列里的进程
printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf("\n>>>>>>>> Display the Block queue >>>>>>>>>>>>\n");
sleep(5); //显示阻塞队列函数
display(&Block_state); /////////////////////
printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n\n");
printf("\n>>>>>>>> Now the process start to run >>>>>>>>>>>\n");
sleep(5);
Process_Run(); //调用进程运行函数
}
都有
- 上一篇: 无线充方案测试试报告
- 下一篇: 操作系统上机实验报告 进程状态转换及其PCB的变化