操作系统实验报告+进程状态转换Word文档格式.doc
- 文档编号:6952083
- 上传时间:2023-05-07
- 格式:DOC
- 页数:9
- 大小:194KB
操作系统实验报告+进程状态转换Word文档格式.doc
《操作系统实验报告+进程状态转换Word文档格式.doc》由会员分享,可在线阅读,更多相关《操作系统实验报告+进程状态转换Word文档格式.doc(9页珍藏版)》请在冰点文库上搜索。
};
其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:
Create_state,Ready_state,Block_state,Run_state,Exit_state。
P_Runtime标示要完成一个进程所需要的时间。
P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。
StructPCB*next用来指向同一队列中的下一个PCB块。
三、程序源代码:
#include"
stdlib.h"
stdio.h"
string.h"
/**********globlestructureandviable******/
//PCB的ID号
structPCB*Create_state;
//创建状态
structPCB*Run_state;
//运行状态
structPCB*Ready_state;
//就绪状态
structPCB*Block_state;
//阻塞状态
structPCB*Exit_state;
//退出状态
intsignal4=0;
//标示进程4的完成状态
intsignal5=0;
//标示进程5的完成状态
voidInsertQueue(structPCB**head,structPCB*node)/*insertnodefunction*/
structPCB*p,*q;
node->
next=NULL;
if(*head==NULL) //如果队列为空
{
*head=node;
}
Else //队列不空
p=*head;
q=p->
next;
while(q!
=NULL) //找到最后的元素位置
{
p=q;
q=q->
}
p->
next=node;
//将节点插入队列
}
}
voidDeleteQueue(structPCB**head,structPCB*node)//撤销进程,从队列中删除元素
structPCB*p,*q;
q=*head;
if(*head==NULL||node==NULL) //如果队列为空,返回
return;
if(*head==node) //如果要删除的元素是队首元素
{
*head=(*head)->
return;
}
Else //如果不是队列的首元素
{
while(q->
next!
=p&
&
q->
=NULL)
q=q->
q=p->
p->
}
voidDisplay_Process(structPCB*node) //打印进程状态的元素函数
printf("
\n\nthisprocessIdis:
%d\n"
node->
P_Id);
thisprocessnameis:
%s\n"
P_Name);
thisprocessstateis:
on%s\n"
P_State);
thisprocessRuntimeis:
P_Runtime);
if(node->
P_Requiry)
thisprocessresourceisready\n"
);
else
thisprocessresourceisnotready!
\n"
voidDispatchToBlock(structPCB*node) ///*dispatchtoblockfunction*/
{ //调度到阻塞状态的函数
//structPCB*p=(structPCB*)malloc(sizeof(structPCB));
if(!
node->
P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态
{
strcpy(node->
P_State,"
block"
InsertQueue(&
Block_state,node);
//插入到阻塞队列
Display_Process(node);
}
voidDispatchToReady(structPCB*node)//dispatchtoreadystate
{ //调度到就绪状态的函数
if(node->
P_Requiry) //如果所需的资源满足,则调度
Ready"
Ready_state,node);
voidDispatchBlockToReady()//dispatchtheprocesstoreadyqueue
{ //从阻塞状态调度到就绪状态函数
structPCB*p,*q;
q=Block_state;
while(q!
=NULL) //如果阻塞状态队列不空
{
p=q;
q=q->
if(signal4&
p->
P_Id==4) //如果所需要的资源满足
{
DeleteQueue(&
Block_state,p);
strcpy(p->
ready"
InsertQueue(&
Ready_state,p);
printf("
process4willbeinthestateofready!
\n"
Display_Process(p);
if(signal5&
P_Id==5)
process5willbeinthestateofready!
}
}
voidCreate_Process() //创建进程函数
inti;
structPCB*p;
charname[10];
strcpy(name,"
process"
for(i=1;
i<
3;
i++) //动态创建2个处于阻塞状态的进程
{
p=(structPCB*)malloc(sizeof(structPCB));
P_Id=i;
name[7]=i+'
0'
;
name[8]='
\0'
strcpy(p->
P_Name,name);
create"
P_Runtime=1;
//所需要的时间片为1
P_Requiry=0;
Display_Process(p);
sleep(4);
printf("
\nprocess%dwillbeinthestateofBlock,waitingtheresourceready\n\n"
i);
DispatchToBlock(p);
//同时调度到阻塞队列
}
for(i=3;
7;
i++) //创建4个就绪状态的队列
p=(structPCB*)malloc(sizeof(structPCB));
p->
P_Requiry=1;
if(i==6) //在这里个进程6所需要的时间片为2
P_Runtime=2;
else
\nprocess%dwillbeinthestateofReady,waitingtorun\n\n"
DispatchToReady(p);
}
voiddisplay(structPCB**head) //打印各个状态队列里进程数目
structPCB*p,*q;
p=*head;
while(p!
{
sleep
(2);
//printf("
\n\n///////////////////////////////////\n"
p->
if(p->
p=p->
voidProcess_Run() //进程运行函数
p=Ready_state;
q=p;
while(p!
=NULL) //就绪队列不空则继续执行
{
if(p->
P_Runtime<
=0)break;
//如果时间片执行完了,则跳出循环
strcpy(p->
running"
Display_Process(p);
P_Runtime=p->
P_Runtime-1;
sleep(4);
if(p->
P_Runtime>
0) //没有完成,则进入就绪队列
{
printf("
thisprocessisnotfinished,willbedispatchtothereadyqueue!
!
DeleteQueue(&
Display_Process(p);
}
Else //执行完成,则跳出,并发送相应的信息
printf("
\n\nProcess%disfinishedandwillbeinthestateofexit!
\n\n"
if(p->
P_Id==4)signal4=1;
P_Id==5)signal5=1;
}
if(signal4||signal5)
DispatchBlockToReady();
//如果资源满足,则将进程调度到就绪队列
q=q->
}
if(q==NULL)
\nthereisnoprocessready!
\nSTOPMachine!
intmain(intargc,char*argv[]) //主函数
{
inti;
charc='
c'
//界面
printf("
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n"
...................................DingHaibo\n"
......Pressstostarttheprocess.......\n"
scanf("
%c"
&
c);
while
(1)
if(c=='
s'
)break;
scanf("
Create_Process();
//调用创建进程函数
\n>
>
DisplaytheReadyqueue>
sleep(5);
display(&
Ready_state);
////////////////显示就绪队列里的进程
DisplaytheBlockqueue>
//显示阻塞队列函数
Block_state);
/////////////////////
\n\n\n"
Nowtheprocessstarttorun>
Process_Run();
//调用进程运行函数
四、运行结果及说明:
运行结果的截图:
下面的运行结果是程序执行的每一步进程调度的显示,从进程的创建到进程的执行,结束,每一步进程调度都有显示。
五.程序使用说明:
1)输入字符’s’启动程序
2)程序将自动执行,自动创建进程,运行进程和结束进程。
3)程序将自动显示每一步进程的执行状态。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 进程 状态 转换