首页 > 编程知识 正文

短进程优先调度算法,脉冲幅度调制pam及系统实验报告

时间:2023-05-03 12:49:13 阅读:163230 作者:4911

实验内容:

设计用分优先级调度算法实现处理器调度的程序。

)1)假设系统中有5个进程,各进程用进程控制块PCB表示,进程控制块的形式如下。

在进程名指针请求执行时间优先数的状态下,将进程名——作为进程的识别符,将5个进程的进程名分别设为P1、P2、P3、P4、P5。

指针——按照优先级的大小将5个过程连接到队列中,用指针指示下一个过程的过程控制块的起始地址,最后一个过程的指针为“0”。

执行时间设想——进程必须执行的单位时间数。

优先级——给进程赋予优先级,在调度时总是选择优先级高的进程并先执行。

可以假设状态——有两种状态:“就绪8080”状态和“已完成”状态。 五个进程的初始状态都是“就绪”,用“r”表示,一个进程的执行结束后,其状态为“结束”,用“e”表示。

)2)每次运行您设计的处理器调度程序时,每个进程都可以任意确定其“优先级”和“请求执行时间”。 本实验为了检查的方便,优先数和工作时间采用了下表的值。

)3)为了便于调度,按照给定的优先顺序从大到小排列5个进程。 一个单元表示队列的前端进程,指针表示队列的连接情况。

)4)处理器的调度总是选择第一个进程运行。 通过动态更改优先级,每次运行进程时,优先级将减少“1”。 由于本实验是模拟处理器的调度,所以并不是实际启动并执行被选择的进程,而是执行以下操作。

优先级-1

需要运行时-1

模拟进程的执行。

注:在实际系统中,如果选择运行进程,则必须恢复进程以占用处理器的运行空间,直到出现等待事件或运行结束。 这里省略了这些工作。

)5)进程运行一次后,需要运行时间时!=0时,添加到队列中(以优先顺序的大小插入,设置开头标志); 如果请求执行时间=0,则将该状态变更为“结束”(e ),然后退出队列。

(6)如果处于“就绪”状态的进程队列不为空,则在所有进程进入“已完成”状态之前,重复上述步骤)和)。

(7)在设计的程序中,必须能够显示或打印语句,每次都能够显示或打印被选择的进程的进程名和执行一次后的进程队列的变化。

创建思路:单链表作为准备队列将进程插入单链表中,每次插入时按照从高到低的顺序维护链表中进程的优先级,从单链表中取出首节点,进行仿真如果=0,则将进程重新插入单链表。 否则,执行状态为e (结束)在打印过程执行后,直到准备队列空闲为止(3) )3) )4) )5)

代码:

# include iostream # includestringusingnamespacestd; typedef struct PCB{string pname; //进程名称struct PCB* next; //指针int time; //请求运行时int priority优先级char status; //运行状态}*my_queue,PCB; //队列voidinit_queue(my_queueh ) {h=new PCB; h-next=NULL; 插入//voidinsert(my_queueh,PCB* element ) {PCB* tmp=h; 下一个进程的优先级高于当前插入的tmp=tmp-next-priority element-priority (while ) {//tmp; }element-next=tmp-next; tmp-next=element; //打印准备队列voidprint_queue(my_queueh ) {PCB* tmp=h; cout '进程名称' 't下一个进程名称' 't ' '请求运行时t ' '优先级t ' '状态' endl; while(tmp-next ) {tmp=tmp-next; cout tmp-pname 't '; if(tmp-next ) cout tmp-next-pname 'tt '; 无else cout ' 'tt '; cout tmp-time 'tt ' tmp-priority 't ' tmp-status endl; }PCB*get_queue(my_queueh ) /从就绪队列开始具有最高优先级的进程PCB* res=h-next; h-next=h-next-next; 返回结果; }intmain(void ) {my_queue L=NULL; init_queue(L; //初始化准备队列int num; //进程数cout '进程数: '; cin num; //进程数while(num----) {string pname; int time,priority; char status; 请输入cout '进程名称、运行时间、优先级和状态。 请用()空格分隔。 ); cin pname time priority status; PCB* element=new PCB; element-pname=pname; element-time=time; 元素-优先级=优先级; element-status=status; 插入(l,element ); //print_queue(L; //打印准备队列while(L-next )//准备队列不空闲的PCB* h=get_queue(L ) l; //进程//执行进程cout '当前正在运行的进程名称为' h-pname endl; h-priority -=1; h-time -=1; if(h-time=0) h-status='E '; ELSEinsert(L,h ); //打印当前进程运行后的就绪队列状态cout '当前进程运行后的就绪队列状态:“endl; print_queue(L; cout endl; cout endl; }return 0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。