*** 作系统——进程与PCB

 *** 作系统——进程与PCB,第1张

os利用“进程实体”控制程序执行就产生了“进程”。

定义:进程是实体的运行过程,是系统进行资源分配和调度的一个独立单位。

特征:动态性、并发性、独立性、异步性

进程的基本状态:(进程执行的间断性决定了其具有多种状态。把握各进程所属的状态对进程控制至关重要。与进程执行相关的各种共享资源有:cpu、存储器、i/o设备、时间片) 所以进程的三种基本状态有:就绪状态、运行状态、阻塞状态。

除此之外还有挂起状态

pcb:process control block    存放进程的管理和控制信息的数据结构称为进程控制块

os对进程进行控制和管理围绕pcb进行

重要性:进程控制快是进程存在的唯一标志、是进程管理和控制的最重要的数据结构

进程控制快中的信息:

1、进程标示符信息:每个进程都必须有一个唯一的标识符

2、处理机状态信息:主要由处理机的各种寄存器中的内容组成,被中断时这些信息要存放到pcb。

3、进程调度信息

4、进程控制信息

pcb信息的存放:系统运行中有若干个pcb,他们常驻内存的pcb区。采用的数据结构:pcb架构体。pcb链表或队列

#include#include#include/*********************以下是全局数据结构和变量***********************//*PCB结构*/structPCB{intpnameintpriintruntimeintwaittimestructPCB*next}pcb[7]/*运行指针*/structPCB*running/*高优先级就绪队列头指针*/structPCB*Hready/*低优先级队列头指针*/structPCB*Lready/*等待队列头指针*/structPCB*waitintsig=0/**************************以下是函数说明****************************//*利用循环实现延迟*/voiddelay()/*模拟进程3-9*/voidproc(structPCB*running)/*将node插入到head所指示的队列的尾部*/voidInsertIntoQueueTail(structPCB**head,structPCB*node)/*进程调度函数*/intproc_switch()/*进程等待函数*/voidproc_wait()/*进程唤醒函数*/intproc_wakeup()/************************以下是函数定义及注释************************//*主函数*/main(){inti/*初始化,创建进程3-9,置低优先级,等待时间为0,依次插入低优先级队列*/for(i=0ipname)/*当前进程执行running->runtime个时间片*/for(i=running->runtimei>0i--){/*显示剩余的时间片*/printf("%dtimeslice(s)left\n",i)/*延迟*/delay()proc_wakeup()/*产生一个1到1000的随机数,若该随机数小余100,当前进程等待,*/if((rand()%1000+1)pname)sig=1return}}/*显示时间片耗尽,进程转为低优先级就绪状态*/printf("Timeslicesforprocess%dexhausted.\n",running->pname)InsertIntoQueueTail(&Hready,running)sig=0return}/*功能:将一个节点插入队列尾部*//*入口参数:队列头指针地址head,待插入结点node*//*出口参数:无*/voidInsertIntoQueueTail(structPCB**head,structPCB*node){structPCB*pnode->next=NULL/*被插入队列为空*/if(*head==NULL){*head=nodereturn}/*被插入队列不为空*/else{p=*head/*找到队列的最后一个结点*/while(p->next!=NULL)p=p->nextp->next=node}}/*功能:进程调度*//*入口参数:无*//*出口参数:若调度成功,返回1,否则返回0*/intproc_switch(){/*若高优先级就绪队列和低优先级就绪队列均为空,则循环执行进程唤醒*/while(Hready==NULL&&Lready==NULL)if(!proc_wakeup())return0/*若高优先级就绪队列非空,则执行其第一个进程,分配2个时间片*/if(Hready!=NULL){running=HreadyHready=Hready->nextrunning->runtime=2}/*若高优先级就绪队列为空,则执行低优先级就绪队列的第一个进程,分配5个时间片*/else{running=LreadyLready=Lready->nextrunning->runtime=5}/*别调度进程的id赋给sig*/sig=running->pnamereturn1}/*功能:进程等待。将当前运行进程置高优先级,等待时间为20,插入等待队列尾部*//*入口参数:无*//*出口参数:无*/voidproc_wait(){structPCB*prunning->pri=1running->waittime=20InsertIntoQueueTail(&wait,running)sig=0return}/*功能:进程唤醒*//*入口参数:无*//*出口参数:若等待队列为空,则返回0,否则返回1*/intproc_wakeup(){structPCB*p,*last,*MoveToReadyp=wait/*等待队列为空,返回0*/if(p==NULL)return0/*延迟*/delay()/*等待队列中每个进程的等待时间减1*/while(p!=NULL){p->waittime-=1p=p->next}p=wait/*从等待队列中摘除等待时间为0的进程,插入到高优先级就绪队列的尾部*/while(p!=NULL){if(p->waittime==0){MoveToReady=pif(p==wait)wait=p->nextelselast->next=p->nextp=p->nextInsertIntoQueueTail(&Hready,MoveToReady)}else{p=p->next}}sig=0return1}

实验三 进程调度

一、实验目的

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理机数时,就必须依照某种策略来决定那些进程优先占用处理机。本实验模拟在单处理机情况下的处理机调度,帮助学生加深了解处理机调度的工作。

二、实验内容

设计一个时间片轮转调度算法实现处理机调度的程序。

三、实验指导

1.实验中使用的数据结构:

1)PCB进程控制块

其中包括参数①进程名name;②要求运行时间runtime;③优先数prior;④状态state;⑤已运行时间runedtime。

2)为简单起见,只设运行队列,就绪链表两种数据结构,进程的调度在这两个队列中切换,如图3.1所示。

图3.1PCB链表

2.运行结果,包括各个进程的运行顺序,每次占用处理机的运行时间

3.每个进程运行时间随机产生,为1~20之间的整数。

4.时间片的大小由实验者自己定义,可为3或5。

四、实验要求

1.在上机前写出全部源程序;

2.能在机器上正确运行程序。

五、程序清单

六、运行结果

七、调试分析及实验心得

我的回答和这位老兄的差不多


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12067398.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存