设计一个按优先数调度算法实现处理器调度的程序(可以输入进程的数量)

合集下载

一个有N个进程并发执行的进程调度程序

一个有N个进程并发执行的进程调度程序

一个有N个进程并发执行的进程调度程序。

进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

#include "stdio.h"#include <stdlib.h>#include <conio.h>#define getpch(type) (type*)malloc(sizeof(type))#define NULL 0struct pcb { /* 定义进程控制块PCB */char name[10];char state;int super;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;void sort() /* 建立对进程进行优先级排列函数*/{PCB *first, *second;int insert=0;if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/{p->link=ready;ready=p;}else /* 进程比较优先级,插入适当的位置中*/{first=ready;second=first->link;while(second!=NULL){if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/{ /*插入到当前进程前面*/p->link=second;first->link=p;second=NULL;insert=1;}else /*向后移动指针*/{first=first->link;second=second->link;}}/* 插入进程优先数最低,则插入到队尾*/if(insert==0) first->link=p;}}void input() /* 建立进程控制块函数*/{int i,num;printf("\n 请输入进程号?");scanf("%d",&num);for(i=0;i<num;i++){printf("\n 进程号No.%d:\n",i);p=getpch(PCB);printf("\n 输入进程名:");scanf("%s",p->name);printf("\n 输入进程优先数:");scanf("%d",&p->super);printf("\n 输入进程运行时间:");scanf("%d",&p->ntime);printf("\n");p->rtime=0;p->state='w';p->link=NULL;sort(); /* 调用sort函数*/}}int space(){int l=0; PCB* pr=ready;while(pr!=NULL){l++;pr=pr->link;}return(l);}void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ {printf("\n qname \t state \t super \t ndtime \t runtime \n");printf("|%s\t",pr->name);printf("|%c\t",pr->state);printf("|%d\t",pr->super);printf("|%d\t",pr->ntime);printf("|%d\t",pr->rtime);printf("\n");}void check() /* 建立进程查看函数*/{PCB* pr;printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/disp(p);pr=ready;printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/while(pr!=NULL){disp(pr);pr=pr->link;}}void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/{printf("\n 进程[%s] 已完成.\n",p->name);free(p);}void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/{(p->rtime)++;if(p->rtime==p->ntime)destroy(); /* 调用destroy函数*/else{(p->super)--;p->state='w';sort(); /*调用sort函数*/}}void main() /*主函数*/{int len, h=0;char ch;input();len=space();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf("\n The execute number:%d \n",h);p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();printf("\n 按任一键继续......");ch=getchar();}printf("\n\n 进程已经完成.\n");ch=getchar();}。

操作系统原理试题题库含答案 7

操作系统原理试题题库含答案 7

操作系统原理试题题库含答案(7)1、在I/O子系统中,I/O请求的排队时间为10ms,而请求的服务时间为40ms,则I/O请求的总响应时间为()A、 10msB、 50msC、 30msD、 40ms正确答案: B2、下列哪项不是进行存储管理的目的( )。

A、提高存储利用率B、防止用户破坏操作系统C、防止用户相互干扰D、为了使用Spooling正确答案: D3、进程的基本状态转换中,哪一种是不可能发生。

A、就绪态变为阻塞态B、就绪态变为执行态C、阻塞态变为就绪态D、执行态变为阻塞态正确答案: A4、进程的动态、并发等特征是利用____________表现出来的。

A、程序B、数据C、程序和数据D、进程控制块正确答案: D5、要求进程一次性申请所需的全部资源,是破坏了死锁必要条件中的____条件。

A、不可剥夺B、互斥C、请求与保持D、环路等待正确答案: C6、在下面的I/O控制方式中,需要CPU干预最少的方式是()A、程序I/O控制方式B、中断驱动I/O控制方式C、直接存储器访问(DMA)控制方式D、 I/O通道控制方式正确答案: D7、在操作系统中,只能在系统态下运行的指令是()。

A、读时钟指令B、置时钟指令C、取数指令D、寄存器清零指令正确答案: D8、下列选项中,导致创建新进程的操作是()I.用户登录成功 II.设备分配 III.启动程序执行A、仅I和IIB、仅II和IIIC、仅I和IIID、 I、II和III正确答案: B9、某一作业8:00到达系统,估计运行时间为2小时,若11:00开始执行该作业,其响应比是()。

A、 3.5B、 3C、 2.5D、 2正确答案: C10、在外围设备和内存之间开辟直接的数据通道的是()。

A、程序直接控制B、 DMAC、通道控制D、中断正确答案: B11、在请求分页存储管理中,若采用FIFO页面淘汰算法,则当分配的页面数增加时,缺页中断的次数( )。

A、减少B、增加C、无影响D、可能增加也可能减少正确答案: D12、哪个属于抢占式调度___A、时间片轮转法;B、短作业优先调度;C、先来先服务;D、高响应比优先调度;正确答案: A13、在存储管理中,采用地址变换机构的目的是()A、加快进程空间寻址B、提高CPU效率C、进程空间保护和内存共享D、便于有效分配内存正确答案: A14、MS-DOS中的文件物理结构采用_________。

处理机调度实验报告1

处理机调度实验报告1
实现思想:
设置多个就绪队列,各个队列优先级逐个降低,各个队列时间片逐个增加,优先级越高的队列执行时间片就越短,一般时间片按倍增规则,例如,第二队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍,整合了时间片、FCFS、优先级三种机制。
三.实验过程及内容:(对程序代码进行说明和分析,越详细越好,代码排版要整齐,可读性要高)
time+=pcbdata1[t_ready[0]].time_need;
j=time-pcbdata1[t_ready[0]].time_start;
k=(float)j/pcbdata1[t_ready[0]].time_need;
t_order[0]=0;
printf("完成时间--%d,周转时间--%d,带权周转时间--%.1f\n",time,j,k);
}
}
//**************调度函数
void FCFS()
{
int i,j,temp;
double k;
for(i=0;i<num;i++)
{order[i]=pcbdata[i].time_start;
ready[i]=i;
}
for(i=0;i<num;i++) //按到达时间排序
for(j=i+1;j<num;j++)
t_ready[i]=ready[i];
}
time=order[0];
for(l=0;l<num1;l++){
//判断到达的进程数,用temp_num存放
for(i=0;i<num&&pcbdata1[ready[i]].time_start<=time;i++)

2022年宁夏大学计算机科学与技术专业《操作系统》科目期末试卷A(有答案)

2022年宁夏大学计算机科学与技术专业《操作系统》科目期末试卷A(有答案)

2022年宁夏大学计算机科学与技术专业《操作系统》科目期末试卷A(有答案)一、选择题1、文件系统采用两级索引分配方式。

若每个磁盘块的大小为1KB.每个盘块号占4B,则该系统中单个文件的最大长度是()A.64MBB.128MBC.32MBD.都不对2、下列文件物理结构中,适合随机访问且易于文件扩展的是()。

A.连续结构B.索引结构C.链式结构且磁盘块定长D.链式结构且磁盘块变长3、与单道程序相比,多道程序系统的优点是()I.CPU 利用率高II.系统开销小III.系统吞吐量大IV. I/O设备利用率高A.仅I、IIIB.仅I、IVC. 仅II、IIID.仅I、III,IV4、有若干并发进程均将一个共享变量count的值加1 次,那么有关count中的值说法正确的是()。

1)肯定有不止确的结果2)肯定有止确的结果3)若控制这些并发进程互斥执行count加1操作,count中的值正确A.1)和3)B.2)和3)C.3)D.1)、2)、3)的说法均不正确5、下列关于管程的叙述中,错误的是()。

A.管程只能用于实现进程的互斥B.管程是由编程语言支持的进程同步机制C.任何时候只能有一个进程在管程中执行D.管程中定义的变量只能被管程内的过程访问6、下列关于虚拟存储的叙述中,正确的是()A.虚拟存储只能基于连续分配技术B.虚拟存储只能基于非连续分配技术C.虚拟存储容量只受外存容量的限制D.虚拟存储容量只受内存容量的限制7、总体上说,“按需调页”(Demand-Paging)是个很好的虚拟内存管理策略。

但是,有些程序设计技术并不适合于这种环境,例如()A.堆栈B.线性搜索C.矢量运算D.分法搜索8、假设5个进程P0、P1、P2、P3、P4共享3类资源R1、R2、R3.这些资源总数分别为18、6、22。

T0时刻的资源分配情况(见表),此时存在的一个安全序列是()。

A. P0, P2, P4, P1, P3B. P1, P0, P3, P4, P2C. P2, P1, P0, P3, P4D. P3, P4, P2, P1, P09、下列指令中,不能在用户态执行的是()A.trap指令B.跳转指令C.压栈指令D.关中断指令10、系统管理设备是通过一些数据结构来进行的,下前的()不属于设备管理数据结构。

设计一个按优先数调度算法实现处理器调度的程序

设计一个按优先数调度算法实现处理器调度的程序

设计一个按优先数调度算法实现处理器调度的程序处理器调度是操作系统中重要的任务之一,负责决定在多个可执行任务之间如何分配处理器时间。

在处理器调度中,按优先数调度算法是一种常见的策略。

本文将介绍如何设计一个按优先数调度算法实现处理器调度的程序。

一、定义任务在实现处理器调度之前,首先需要定义可执行的任务。

一个任务可以由多个属性来描述,包括优先级、到达时间、执行时间等。

在按优先数调度算法中,每个任务都有一个优先级,优先级越高表示任务的重要性越高。

同时,每个任务还有一个到达时间,即任务进入调度器的时间点。

最后,每个任务还有一个执行时间,表示任务完成所需要的时间。

二、设计数据结构为了表示任务,我们可以使用一个Task类来封装任务的属性,例如:```class Taskint priority; // 优先级int arrivalTime; // 到达时间int executionTime; // 执行时间};```此外,为了管理所有待调度的任务,需要使用一个队列来存储任务。

我们可以使用优先队列(Priority Queue)来实现这个队列,其中任务按照优先级的顺序排列。

当一个任务到达时,将其插入到优先队列中;当处理器空闲时,从优先队列中选择优先级最高的任务进行调度。

三、实现调度算法接下来,需要实现按优先数调度算法。

按照该算法的步骤,当一个任务到达时,将其插入到优先队列中。

当处理器空闲时,从队列中取出优先级最高的任务,并执行该任务。

如果任务未完成,则将其重新插入队列中。

如果所有任务都已完成,则调度任务结束。

以下是一个示例的按优先数调度算法实现:```PriorityQueue<Task> taskQueue; // 优先队列,按优先级排序任务void schedule(int currentTime)if (taskQueue.isEmpty()System.out.println("Processor is idle.");return;}Task currentTask = taskQueue.poll(; // 取出优先级最高的任务int remainingTime = currentTask.executionTime - (currentTime - currentTask.arrivalTime);if (remainingTime > 0)currentTask.executionTime = remainingTime;taskQueue.add(currentTask); // 将未完成的任务重新插入队列中} else}```四、模拟调度过程最后,我们可以编写一个简单的模拟函数来模拟调度器的执行过程:```void simulatint currentTime = 0; // 当前时间while (!taskQueue.isEmpty()while (!taskQueue.isEmpty( && taskQueue.peek(.arrivalTime <= currentTime)Task newTask = taskQueue.poll(;System.out.println("New task with priority " +newTask.priority + " arrived at " + currentTime + ".");taskQueue.add(newTask); // 插入新到达的任务}schedule(currentTime);currentTime++;}```在模拟函数中,我们不断地增加当前时间,直到所有任务都已完成。

设计一个按优先数调度算法实现处理器调度的进程

设计一个按优先数调度算法实现处理器调度的进程

设计一个按优先数调度算法实现处理器调度的进程
一.处理器调度的简介
处理器调度是指在若干作业并发处理时,对处理器分配工作的动态过程。

它是操作系统中的一种重要技术,其主要功能是控制并发作业的执行,使他们得到公平的分配,正确的完成执行,以达到有效利用处理机资源,
提高系统的工作效率。

处理器调度技术包括:处理机调度算法、处理机调
度技术等。

处理机调度算法就是基于计算机系统的工作机制,根据不同的作业在
处理机上的执行情况,系统在不同的阶段,根据量的不同,采用不同的算法,按优先级、分时等原则进行处理机调度,使作业在不同的阶段得到公
平的分配,以达到有效利用处理机资源,提高系统工作效率的目的。

按优先数调度算法( Priority Scheduling Algorithm )是指根据作
业的优先级先后来分配处理机资源,使作业能够按照优先级依次被处理,
使得系统性能有所提高。

1.处理器调度的算法流程
按优先数调度算法的处理器调度的过程,如下:
首先,从队列中取出一个作业,检查是否具有最高优先级,如果是,
则将其分配给处理机,否则,该作业放回队列,继续下一步判断;
其次,在没有作业可以处理时,处理机将停止运转。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书一、实验说明1、实验目的实验是操作系统原理课程中不可缺少的重要教学环节,实验目的是使学生理论联系实际,使学生在实践探索中去发现问题、去解决问题,提高了学生获取知识和应用技术的能力,培养了学生分析和解决问题的能力。

《操作系统原理》要求理论与实践相结合,本门实验课程是对《操作系统原理》课堂教学的一个重要补充,与理论学习起着相辅相成的作用,是实施《操作系统原理》教学的一个重要组成部分。

通过本实验课的实践学习,可以增强本专业的学生对系统实现的认识。

对加深理解和掌握操作系统相关原理有重要帮助。

2、实验要求进一步了解和掌握操作系统原理,提高系统设计的能力。

对每一实验题目,应独立完成,并要求:·上机前,学生必须做好充分的实验准备工作,掌握与实验相关的背景知识,用任一种高级语言编写程序。

·上机时,认真调试,并观察、记录程序运行过程中出现的现象和问题。

·上机后,分析实验结果并写出实验报告。

3、实验报告要求每个实验(包括选做的)均应编写实验报告,学生实验后要写出严谨的、实事求是的、文字通顺的、字迹公整的实验报告。

实验报告应包括以下内容:(1)实验题目(2)实验目的(3)实验内容●程序中使用的数据结构及符号说明●流程图●源程序清单并附上注释(4)实验结果及分析●运行结果(必须是上面程序清单所对应输出的结果)●对运行情况所作的分析以及本次调试程序所取得的经验。

如果程序未能通过,应分析其原因。

二、实验内容实验一熟悉使用计算机系统一、实验名称:熟悉使用计算机系统二、实验目的与要求通过对Windows操作系统的使用,熟悉Windows操作系统中的基本概念,如单用户、多任务、进程和文件等,熟悉Windows中命令行方式下常用命令的使用方法;进一步熟悉TC语言与开发环境,为以后的实验打好基础。

三、实验内容1.开机后,熟悉Windows的界面(桌面、任务栏、开始按钮<点击后出现“开始”菜单>、我的电脑图标、回收站、我的文档)。

进程调度先来先服务时间片轮转法优先服务调

进程调度先来先服务时间片轮转法优先服务调

进程调度先来先服务时间片轮转法优先服务调度处理器调度免费下载C或C++/*标题:设计一:进程调度设计目的:进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。

在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。

设计题目:设计一个按先来先服务,算法时间片轮转法,优先数调度算法实现处理器调度的程序。

*//*亲爱的同学们,大家好。

欢迎访问我的百度空间,在此我向大家提供免费的资料,这是我们实习要做的。

主要是因为我看到很多下载都要金币,而我自己没有金币,不爽。

现在我提供免费下载,做个好人。

复制到VC++时可能有些格式问题,稍微修改一下就OK了,程序本身不存在问题的。

大三第一个学期实习的哦*//*先来先服务:是一种最简单的调度算法,每次调度都从后备作业或者进程当中选择一个或者多个最先进入该队列的作业或进程,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

当调用FCFS算法时,系统为它们分配处理机,让它们运行。

该算法的优点是比较利于长作业(进程),而缺点是不利于短作业(进程)。

算法时间片轮转法:系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

当执行完时间片时,计时器就会发出中断请求,调度程序就会停止该进程的执行,并把它送往就绪队列的末尾;然后再把处理机分配给就绪队列中新的队首进程,同时也分配时间片给它。

这样保证就绪队列中的所有进程在一个给定的时间片当中都能够获得一个时间片的处理机执行时间。

而时间片的大小最好取适中的,即略大于一次典型的交互所需时间。

优先数调度算法:该方法又分成两种算法分支,分别是非抢占式优先权算法和抢占式优先权调度算法。

计算机专业基础综合操作系统(进程管理)-试卷2

计算机专业基础综合操作系统(进程管理)-试卷2

计算机专业基础综合操作系统(进程管理)-试卷2(总分:68.00,做题时间:90分钟)一、单项选择题(总题数:22,分数:44.00)1.单项选择题1-40小题。

下列每题给出的四个选项中,只有一个选项是最符合题目要求的。

__________________________________________________________________________________________2.计算机系统中判别是否有中断事件发生应是在( )。

A.进程切换时B.执行完一条指令后√C.执行P操作后D.由用户态转入核心态时系统中,只有当执行完一条指令后,才判别是否有中断发生。

3.若当前进程因时间片用完而让出处理机时,该进程应转变为( )状态。

A.就绪√B.等待C.运行D.完成当时间片用光后,进程变为就绪状态。

4.一种既有利于短小作业又兼顾到长作业的作业调度算法是( )。

A.先来先服务B.轮转C.最高响应比优先√D.均衡调度5.作业调度程序是从处于( )状态的作业中选取一个作业并把它装入主存。

A.输入B.收容√C.执行D.完成在作业调度中,选取的是正在收容的作业装入内存。

6.进程处于下列( )等待状态时,它是处于非阻塞状态。

A.等待从键盘输入数据B.等待协作进程的一个信号C.等待操作系统分配CPU时间√D.等待网络数据进入内存等待操作系统分配CPU时间属于就绪状态,其他三种均属于阻塞状态。

7.若系统中有五个并发进程涉及某个相同的变量A,则变量A的相关临界区是由( )临界区构成。

A.2个B.3个C.4个D.5个√8.在多进程的并发系统中,肯定不会因竞争( )而产生死锁。

A.打印机B.磁带机C.磁盘D.CPU √9.通常不采用( )方法来解除死锁。

A.终止一个死锁进程B.终止所有死锁进程C.从死锁进程处抢夺资源D.从非死锁进程处抢夺资源√解除死锁的主要方法有:①终止一个或多个死锁进程:②剥夺死锁进程的资源。

操作系统实验

操作系统实验

《操作系统》实验指导书德州学院计算机系实验一理解和认识操作系统的三种接口1.目的和要求MS-DOS和Windows是市场上普及率很高的操作系统,本实验的目的是让读者从操作系统理论的观点加深对现代操作操作系统的接口设计的理解。

2.实验内容①熟悉DOS的基本命令,包括md,cd,copy,move,del,deltree,type 等的使用a、当前目录下建立子目录MYTEMP和MYTEMP2,将当前目录设定为MYTEMP;b、在当前目录下创建新文件B.BAT,其内容为:清除屏幕内容,显示当前DOS版本;c、使用type命令显示B.BAT的内容,检查正确后,执行它;d、拷贝B.BAT到路径MYTEMP中;e、删除MYTEMP2中的文件B.BAT,删除目录MYTEMP2;f、使用deltree命令删除MYTEMP②理解WINDOWS下的编程接口原理,了解WINAPI,利用WINAPI实现WINDOWS 下的打印。

a、登录进入Windowsb、在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”-“MicrosoftVisual C++ 6.0”命令,进入Visual C++ 窗口。

c、在File菜单单击New Workspace...命令,创建PrintApp.dsw项目文件。

d、在File菜单单击New C++ Soure file命令,创建新的原文件。

e、输入如实验运行结果中所示的源代码,调试、编译并运行。

f、观察执行结果,理解各个函数的功能。

3.实验环境Windows操作系统和Visual C++6.0专业版或企业版实验二复习用C语言编制程序一、实验内容选择一个计算机系统,熟悉该系统的操作命令,且掌握该计算机系统的使用方法。

二、实验目的配合操作系统课程的学习,模拟实现操作系统的功能,有助于对操作系统的理解。

操作系统功能的模拟实现可以在计算机系统的终端上进行,也可以在一台微型计算机上进行。

实验报告二 进程调度算法

实验报告二 进程调度算法

实验报告二——进程调度算法的设计姓名: xxxx 学号: xxxxx班级: xxxx一、实习内容•实现短进程优先调度算法(SPF)•实现时间片轮转调度算法(RR)二、实习目的•通过对进程调度算法的设计, 深入理解进程调度的原理。

进程是程序在一个数据集合上运行的过程, 它是系统进行资源分配和调度的一个独立单位。

进程调度分配处理机, 是控制协调进程对CPU的竞争, 即按一定的调度算法从就绪队列中选中一个进程, 把CPU的使用权交给被选中的进程。

三、实习题目• 1.先来先服务(FCFS)调度算法原理: 每次调度是从就绪队列中, 选择一个最先进入就绪队列的进程, 把处理器分配给该进程, 使之得到执行。

该进程一旦占有了处理器, 它就一直运行下去, 直到该进程完成或因发生事件而阻塞, 才退出处理器。

将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列, 并按照先来先服务的方式进行调度处理, 是一种最普遍和最简单的方法。

它优先考虑在系统中等待时间最长的作业, 而不管要求运行时间的长短。

按照就绪进程进入就绪队列的先后次序进行调度, 简单易实现, 利于长进程, CPU繁忙型作业, 不利于短进程, 排队时间相对过长。

• 2.时间片轮转调度算法RR原理: 时间片轮转法主要用于进程调度。

采用此算法的系统, 其程序就绪队列往往按进程到达的时间来排序。

进程调度按一定时间片(q)轮番运行各个进程.进程按到达时间在就绪队列中排队, 调度程序每次把CPU分配给就绪队列首进程使用一个时间片, 运行完一个时间片释放CPU, 排到就绪队列末尾参加下一轮调度, CPU分配给就绪队列的首进程。

固定时间片轮转法:1 所有就绪进程按FCFS 规则排队。

2 处理机总是分配给就绪队列的队首进程。

3 如果运行的进程用完时间片, 则系统就把该进程送回就绪队列的队尾, 重新排队。

4 因等待某事件而阻塞的进程送到阻塞队列。

5 系统把被唤醒的进程送到就绪队列的队尾。

实验 短作业优先进程调度算法模拟

实验   短作业优先进程调度算法模拟
实验报告书写
1.写出你对给出的程序的理解,可以包括学到了那些程序设计的语法或方法,以及算法的设计思想。
2.写出实验指导中要求部分是如何实现的,
3.上述部分不能只是抄写代码,要有说明。
附录: 先来先服务进程调度模拟程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
printf("----------------------------------------------------------------------------------------------\n");
for(int i=0;i<N;i++)
{
printf(" %s %d %d %d %d \n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time);
#include <conio.h>
#define N 5
struct PCB
{
char name[8];
int arrive_time;
int run_time;
int finish_time;
int zhouzhuan_time;
};
int total=0;
struct PCB pcb[N],temp;
output();
//运行第一个到达的进程得到它的完成时间、周转时间等,并设置为已访问
pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time;

优先级调度算法实验报告

优先级调度算法实验报告

优先级调度算法实验报告院系:****************学院班级:***********姓名:***学号:************一、实验题目:优先级调度算法二、实验目的进程调度是处理机管理的核心内容。

本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先级算法的具体实施办法。

三、实验内容1.设计进程控制块PCB的结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、当前队列指针等。

2.编写优先级调度算法程序3.按要求输出结果。

四、实验要求每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。

(一)进程控制块结构如下:NAME——进程标示符PRIO/ROUND——进程优先数NEEDTIME——进程到完成还需要的时间片数STATE——进程状态NEXT——链指针注:1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;2.各进程的优先数或,以及进程运行时间片数的初值,均由用户在程序运行时给定。

(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:RUN——当前运行进程指针READY——就需队列头指针TAIL——就需队列尾指针FINISH——完成队列头指针五、实验结果:六、实验总结:首先这次实验的难度不小,它必须在熟悉掌握数据结构的链表和队列的前提下才能完成,这次实验中用了三个队列,就绪队列,执行队列和完成队列,就绪队列中的优先级数是有序插入的,当进行进程调度的时候,需要先把就绪队列的队首节点(优先级数最大的节点)移入执行队列中,当执行进程结束后,判断该进程是否已经完成,如果已经完成则移入完成队列,如果没有完成,重新有序插入就绪队列中,这就是这次实验算法的思想。

附录(算法代码):#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{char name[20]; /*进程的名字*/int prio; /*进程的优先级*///int cputime; /*CPU执行时间*/int needtime; /*进程执行所需要的时间*/char state; /*进程的状态,W--就绪态,R--执行态,F--完成态*/struct node *next; /*链表指针*/}PCB;PCB *ready=NULL,*run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完成队列*/int num;void GetFirst(); /*从就绪队列取得第一个节点*/void Output(); /*输出队列信息*/void InsertPrio(PCB *in); /*创建优先级队列,规定优先数越小,优先级越高*/ void InsertTime(PCB *in); /*时间片队列*/void InsertFinish(PCB *in); /*时间片队列*/void PrioCreate(); /*优先级输入函数*///void TimeCreate(); /*时间片输入函数*/void Priority(); /*按照优先级调度*///void RoundRun(); /*时间片轮转调度*/void main(){printf("优先数调度算法\n");printf("请输入要创建的进程数目:");scanf("%d",&num);PrioCreate();Priority();Output();}void GetFirst() /*取得第一个就绪队列节点*/{run = ready;if(ready!=NULL){run ->state = 'R';ready = ready ->next;run ->next = NULL;}}void Output() /*输出队列信息*/{PCB *p;p = ready;printf("进程名\t优先级\t需要时间\t进程状态\n");while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\n",p->name,p->prio,p->needtime,p->state);p = p->next;}p = finish;while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\n",p->name,p->prio,p->needtime,p->state);p = p->next;}p = run;while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\n",p->name,p->prio,p->needtime,p->state);p = p->next;}}void InsertPrio(PCB *in) /*创建优先级队列,规定优先数越小,优先级越低*/ {PCB *fst,*nxt;fst = nxt = ready;if(ready == NULL) /*如果队列为空,则为第一个元素*/{in->next = ready;ready = in;}else /*查到合适的位置进行插入*/{if(in ->prio >= fst ->prio) /*比第一个还要大,则插入到队头*/{in->next = ready;ready = in;}else{while(fst->next != NULL) /*移动指针查找第一个别它小的元素的位置进行插入*/{nxt = fst;fst = fst->next;}if(fst ->next == NULL) /*已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/{in ->next = fst ->next;fst ->next = in;}else /*插入到队列中*/{nxt = in;in ->next = fst;}}}}void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/{PCB *fst;fst = finish;if(finish == NULL){in->next = finish;finish = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void PrioCreate() /*优先级调度输入函数*/{PCB *tmp;int i;printf("输入进程名字,进程所需时间和优先级数:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s",tmp->name);getchar(); /*吸收回车符号*/scanf("%d",&(tmp->needtime));getchar();scanf("%d",&(tmp->prio));// tmp ->cputime = 0;tmp ->state ='W';//tmp ->prio = 20 - tmp->needtime; /*设置其优先级,需要的时间越多,优先级越低*/InsertPrio(tmp); /*按照优先级从高到低,插入到就绪队列*/}}void Priority() /*按照优先级调度,每次执行一个时间片*/{int flag = 1;GetFirst();while(run != NULL) /*当就绪队列不为空时,则调度进程如执行队列执行*/ {Output(); /*输出每次调度过程中各个节点的状态*/while(flag){run->prio -= 3; /*优先级减去三*///run->cputime++; /*CPU时间片加一*/run->needtime--;/*进程执行完成的剩余时间减一*/if(run->needtime == 0)/*如果进程执行完毕,将进程状态置为F,将其插入到完成队列*/{run ->state = 'F';// run->count++; /*进程执行的次数加一*/InsertFinish(run);flag = 0;}else /*将进程状态置为W,入就绪队列*/{run->state = 'W';//run->count++; /*进程执行的次数加一*///InsertTime(run);//再次插入就绪队列尾部InsertPrio(run);flag = 0;}}flag = 1;GetFirst(); /*继续取就绪队列队头进程进入执行队列*/ }。

2022年皖西学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年皖西学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年皖西学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)一、选择题1、若某文件系统索引节点(inode)中有直接地址项和间接地址项,则下列选项中,与单个文件长度无关的因素是().A.索引节点的总数B.间接地址索引的级数C.地址项的个数D.文件块大小2、如果当前读写磁头正在53号柱面上执行操作,依次有4个等待访问的请求,柱面号,依次为98,37,124,65,当采用()算法时,下一次磁头才可能到达37号柱面。

A.先来先服务B.最短寻道时间优先C.电梯调度(初始磁头移动方向向着小磁道方向)D.循环扫描(磁头移动方向向着大磁道方向)3、下列选项中,满足短任务优先且不会发生“饥饿”现象的调度算法是()。

A.先来先服务B.高响应比优先C.时间片轮转D.非抢占式短任务优先4、若系统S1采用死锁避免方法,S2采用死锁检测方法。

下列叙述中,正确的是()。

I.S1会限制用户申请资源的顺序,而S2不会II.S1需要进程运行所需资源总最信息,而S2不需要III.SI不会给可能导致死锁的进程分配资源,而S2会A.仅I、IIB.仅II、IIIC. 仅I、IID. I、II、III5、在多进程的系统中,为了保证公共变量的完整性,各进程应互斥进入临界区。

所谓临界区是指()。

A.一个缓冲区B.一段数据区C.同步机制D.一段程序6、()存储管理方式提供一维地址结构。

A.分段B.分页C.分段和段页式D.以上都不对7、在页式虚拟存储管理系统中,采用某些页面置换算法,会出现Belady异常现象,即进程的缺页次数会随着分配给该进程的页框个数的增加而增加。

下列算,法中,可能出现Belady异常现象的是()。

I.LRU算法 II.FIFO算法 III.OPT 算法A. 仅IB.仅IIC.仅I、IIID. 仅I、III8、下列观点中,不是描述操作系统的典型观点的是()。

A.操作系统是众多软件的集合B.操作系统是用户和计算机之间的接口C.操作系统是资源的管理者D.操作系统是虚拟机9、在单处理器系统中,可并行的是()I.进程与进程II.处理器与设备III.处理器与通道IV.设备与设备A.I、II和IIIB.I、II和IVC.I、III和IVD.II、III和IV10、虚拟设备是通过()技术实现的。

2022年东北石油大学软件工程专业《操作系统》科目期末试卷B(有答案)

2022年东北石油大学软件工程专业《操作系统》科目期末试卷B(有答案)

2022年东北石油大学软件工程专业《操作系统》科目期末试卷B(有答案)一、选择题1、若I/O所花费的时间比CPU的处理时间短很多,则缓冲区()A.最有效B.几乎无效C.均衡D.以上都不是2、下列天于管道(Pipe)通信的叙述中,正确的是()A.一个管道可实现双向数据传输B.管道的容量仅受磁盘容量大小限制C.进程对管道进行读操作和写操作都可能被阻塞D.一个管道只能有一个读进程或一个写进程对其操作3、在空白表中,空白区按其长度由小到大进行查找的算法称为()算法。

A.最佳适应B.最差适应C.最先适应D.先进先出4、作业在执行中发生缺页中断,经操作系统处理后应让其执行()指令。

A.被中断的前一条B.被中断的那一条C.被中断的后·条D.启动时的第一条5、某基于动态分区存储管理的计算机,其主存容量为55MB(初始为空),采用最佳适配(Best Fit)算法,分配和释放的顺序为:分配15MB,分配30MB,释放15MB.分配8MB.分配6MB,此时主存中最大空闲分区的大小是()。

A.7MBB.9MBC.10MBD.15MB6、操作系统提供了多种界面供用户使用,其中()是专门供应用程序使用的一种界面。

A.终端命令B.图形用户窗C.系统调用D.作业控制语言7、所谓(),是指将一个以上的作业放入内存,并且同时处于运行状态。

这些作业,共享处理器的时间和外设及其他资源。

A.多重处理B.多道程序设计C.实时处理D.并行执行8、下面关于目录检索的论述中,正确的是()。

A.由于散列法具有较快的检索速度,因此现代操作系统中都用它来替代传统的顺序检索方法B.在利用顺序检索法时,对树形目录应采用文件的路径名,应从根目录开始逐级检索C.在利用顺序检索法时,只要路径名的一个分量名未找到,便应停止查找D.在顺序检索法的查找完成后,即可得到文件的物理地址,9、用户在删除某文件的过程中,操作系统不可能执行的操作是A.删除此文件所在的目录B.删除与此文件关联的目录项C.删除与此文件对应的文件控制块D.释放与此文件关联的内存缓冲区10、下列有关时间片的进程调度的描述中,错误的是()A.时间片越短,进程切换的次数越多,系统开销也越大,B.当前进程的时间片用完后,该进程状态由执行态变为阻塞态C.时钟中断发生后,系统会修改当前的进程在时间片内的剩余时间D.影响时间片大小的主要因素包括响应时间、系统开销和进程数量等11、为多道程序提供的共享资源不足时,可能会产生死锁。

设计一个按优先数调度算法实现处理器调度的程序可以输入进程的数量

设计一个按优先数调度算法实现处理器调度的程序可以输入进程的数量

题目:设计一个按优先数调度算法实现处理器调度的程序(可以自己定义进程的数量)提示:(1)假定系统有5个进程,每个进程用一个PCB来代表。

PCB的格式为:进程名、指针、要求运行时间、优先数、状态。

进程名——P1~P5。

指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。

要求运行时间——假设进程需要运行的单位时间数。

优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。

状态——假设两种状态,就绪,用R表示,和结束,用E表示。

初始状态都为就绪状态。

(2) 每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

(3) 处理器总是选队首进程运行。

采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。

(4) 进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。

(5) 若就绪队列为空,结束,否则,重复(3)。

2.流程图:(1)主程序流程图:始开调用初始化子程序调用运行子程序束结init()流程图:(2)子程序始开i定i=0i<num输出操作提ID,pri,runtime输stategetchar()i=i+1结束流程图:max_pri_process()子程序(3)开始i,key,max=100定i=0i<numpcblist[i].state=return -1max<pcblist[i].pri&&cblist[i].state=='R'key=imax=pcblist[i].prii=i+1pcblist[key].state=='F' keyreturnreturn -1结流程图:show()子程序(4).开i定输出提i=0i<numpcblist[iID,pri,runtime,state 提示按键继i=i+1结(5)子程序run()流程图:开始i,j,t定j=0j<numt+=pcblist[j].runtimej=j+1输出提(shogetchar()j=0j<tmax_pri_process()!=-1pcblist[max_pri_process()].state='r'i=0i<numpcblist[i].state=='pcblist[i].runtime-- pcblist[i].pri-=1pcblist[i].runtime==0pcblist[i].state='pcblist[i].state='getchar()show()i=i+1j=j+13.源程序清单///按优先数调度算法实现处理器调度的程序#include stdio.h#include string.hint num;struct PCB{char name;//进程名int runtime;//要求运行时间int pri;//优先数char state;//状态,R-就绪,F-结束};struct PCB pcblist[100];//定义进程控制块数组void init()//PCB初始化子程序{int i;for(i=0;i<num;i++){printf(PCB[%d]:进程名优先级运行时间\n,i+1);//为每个进程任意指定pri和runtime scanf(%s%d%d, &pcblist[i].name, &pcblist[i].pri, &pcblist[i].runtime);pcblist[i].state='R';//进程初始状态均为就绪getchar();//接收回车符}}int max_pri_process()//确定最大优先级进程子程序{int max=-100;//max为最大优先数,初始化为-100int i;int key;for(i=0;i<num;i++){if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行return -1;//返回-1elseif(max<pcblist[i].pri&&pcblist[i].state=='R')//从就绪进程中选取优先数最大的进程{max=pcblist[i].pri;//max存放每次循环中的最大优先数key=i;//将进程号赋给key}}具有最大优先数的进程若已运行完毕if(pcblist[key].state=='E')//return -1;//则返回-1elsereturn key;//将key作为返回值返回}void show()//显示子程序{int i;printf(\***进程名优先级运行时间状态***\n);printf(-------------------------------------------------\n);for(i=0;i<num;i++)//依次显示每个进程的名、优先数、要求运行时间和状态{printf(*** %s m ? %s***\n, &pcblist[i].name, pcblist[i].pri,pcblist[i].runtime, &pcblist[i].state);}牰湩晴尨按任意键继续...\n);}void run()//进程运行子程序{int i,j;int f;int h;int g;int t=0;//t为运行次数for(j=0;j<num;j++){t+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和printf(\处理之前的状态:\n);show(); //调用show()子程序显示运行前PCB的情况getchar();//等待输入回车符f=t;g=t;for(j=0;j<t;j++){while(max_pri_process()!=-1)//具有最大优先数的进程没有运行完,让其运行{pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行}for(i=0;i<num;i++){if(pcblist[i].state=='r'){ if(pcblist[i].pri>=1) pcblist[i].pri-=1;//将当前运行进程的优先数减1 pcblist[i].runtime--;{if(pcblist[i].runtime==0)pcblist[i].state='E';//运行完则将该进程状态置为结束elsepcblist[i].state='R';//未运行完将其状态置为就绪}h=f-(--g);,h);运行%d这是第牰湩晴尨show();//显示每次运行后各PCB的情况getchar();//等待回车进入下一次运行}}}}void main()//按动态优先数调度主程序{ 牰湩晴尨请输入要运行进程的数目:);scanf(%d,&num);//输入进程数init();//初始化各个进程PCBrun(); //进程调度模拟}。

实验报告操作系统实验一进程调度.doc

实验报告操作系统实验一进程调度.doc

计算机电子信息工程学院实验报告成绩________ 课程名称操作系统指导教师杨秀华实验日期 2011年9月15、22、29,10月12院(系)计算机学院专业班级09计算机应用实验地点 B-4009学生姓名学号实验项目名称实验一模拟设计进程调度一、实验目的和要求用C或C++语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.二、实验原理进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

每个进程有一个进程控制块( PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪 W(Wait)、运行R(Run)状态之一。

就绪进程获得 CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止。

三、主要仪器设备或材料PC机,C++环境四、实验方法与步骤(可加附页)1、主要数据结构:struct pcb { /* 定义进程控制块PCB */char name[10]; //进程名字char state; //进程状态int super; //进程的优先级int ntime; //进程需要运行的时间int rtime; //进程已经运行的时间struct pcb* link; }2、调度算法的流程图如上图 :五、实验数据记录、处理及结果分析六、讨论、心得计算机电子信息工程学院实验报告(附页)程序参考代码:参考代码:#include "stdio.h"#include <stdlib.h>#include <conio.h>#define getpch(type) (type*)malloc(sizeof(type))#define NULL 0struct pcb{ /* 定义进程控制块PCB */char name[10];char state;int super;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;void sort() /* 建立对进程进行优先级排列函数*/{PCB *first, *second;int insert=0;if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/{p->link=ready;ready=p;}else /* 进程比较优先级,插入适当的位置中*/{first=ready;second=first->link;while(second!=NULL){if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/{ /*插入到当前进程前面*/p->link=second;first->link=p;second=NULL;insert=1;}else /* 插入进程优先数最低,则插入到队尾*/{first=first->link;second=second->link;}}if(insert==0) first->link=p;}}void input() /* 建立进程控制块函数*/{int i,num;printf("\n 请输入进程号?");scanf("%d",&num);for(i=0;i<num;i++){printf("\n 进程号No.%d:\n",i);p=getpch(PCB);printf("\n 输入进程名:");scanf("%s",p->name);printf("\n 输入进程优先数:");scanf("%d",&p->super);printf("\n 输入进程运行时间:");scanf("%d",&p->ntime);printf("\n");p->rtime=0;p->state='w';p->link=NULL;sort(); /* 调用sort函数*/}}int space(){int l=0; PCB* pr=ready;while(pr!=NULL){l++;pr=pr->link;}return(l);}Void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/{printf("\n qname \t state \t super \t ndtime \t runtime \n");printf("|%s\t",pr->name);printf("|%c\t",pr->state);printf("|%d\t",pr->super);printf("|%d\t",pr->ntime);printf("|%d\t",pr->rtime);printf("\n");}Void check() /* 建立进程查看函数 */{PCB* pr;printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/ disp(p);pr=ready;printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/while(pr!=NULL){disp(pr);pr=pr->link;}}Void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/{3 / 4printf("\n 进程 [%s] 已完成.\n",p->name);free(p);}Void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ {(p->rtime)++;if(p->rtime==p->ntime)destroy(); /* 调用destroy函数*/else{(p->super)--;p->state='w';sort(); /*调用sort函数*/}}Void main() /*主函数*/{int len,h=0;char ch;input();len=space();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf("\n The execute number:%d \n",h);p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();printf("\n 按任一键继续......");ch=getchar();}printf("\n\n 进程已经完成.\n");ch=getchar();}知识改变命运。

实验一___处理器调度(设计一个按时间片轮转法实现处理器调度的程序)介绍

实验一___处理器调度(设计一个按时间片轮转法实现处理器调度的程序)介绍

实验一处理器调度一、实验内容选择一个调度算法,实现处理器调度。

二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。

三、实验题目第二题:设计一个按时间片轮转法实现处理器调度的程序。

[提示]:(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。

进程控制块的格式为:其中,Q1,Q2,Q3,Q4,Q5。

指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址最后一个进程的指针指出第一个进程的进程控制块首地址。

要求运行时间——假设进程需要运行的单位时间数。

已运行时间——假设进程已经运行的单位时间数,初始值为“0”。

状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。

当一个进程运行结束后,它的状态为“结束”,用“E”表示。

(2) 每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。

(3) 把五个进程按顺序排成循环队列,用指针指出队列连接情况。

另用一标志单元记录轮到运行的进程。

例如,当前轮到P2执行,则有:标志单元K1K2K3K4K5PCB1 PCB2 PCB3 PCB4 PCB5(4)处理器调度总是选择标志单元指示的进程运行。

由于本实习是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。

请同学注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。

在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。

(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
for(i=0;i<num;i++)
{if(pcblist[i].state=='r')
{ if(pcblist[i].pri>=1) pcblist[i].pri-=1;//将当前运行进程的优先数减1
pcblist[i].runtime--;
{
if(pcblist[i].runtime==0)
pcblist[i].state='E';//运行完则将该进程状态置为结束
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——假设两种状态,就绪,用R表示,和结束,用E表示。初始状态都为就绪状态。
(2)每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3)处理器总是选队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。
printf("-------------------------------------------------\n");
for(i=0;i<num;i++)//依次显示每个进程的名、优先数、要求运行时间和状态
{
printf("*** %s %6d %8d %s***\n", &pcblist[i].name, pcblist[i].pri, pcblist[i].runtime, &pcblist[i].state);
show(); //调用show()子程序显示运行前PCB的情况
getchar();//等待输入回车符
f=t;g=t;
for(j=0;j<t;j++)
{while(max_pri_process()!=-1)//具有最大优先数的进程没有运行完,让其运行
{
pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行
scanf("%d",&num);//输入进程数
init();//初始化各个进程PCB
run(); //进程调度模拟
}
(4)进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。
(5)若就绪队列为空,结束,否则,重复(3)。
2.流程图:
(1)主程序流程图:
(2)子程序init()流程图:
(3)子程序max_pri_process()流程图:
(4)子程序show()流程图:
(5)子程序run()流程图:
}
printf("按任意运行子程序
{int i,j;int f;int h;int g;
int t=0;//t为运行次数
for(j=0;j<num;j++)
{t+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和
printf("\n处理之前的状态:\n");
{if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行
return -1;//返回-1
else
if(max<pcblist[i].pri&&pcblist[i].state=='R')//从就绪进程中选取优先数最大的进程
{
max=pcblist[i].pri;//max存放每次循环中的最大优先数
key=i;//将进程号赋给key
}
}
if(pcblist[key].state=='E')//具有最大优先数的进程若已运行完毕
return -1;//则返回-1
else
return key;//将key作为返回值返回
}
void show()//显示子程序
{int i;
printf("\n***进程名优先级运行时间状态***\n");
pcblist[i].state='R';//进程初始状态均为就绪
getchar();//接收回车符
}
}
int max_pri_process()//确定最大优先级进程子程序
{
int max=-100;//max为最大优先数,初始化为-100
int i;
int key;
for(i=0;i<num;i++)
题目:设计一个按优先数调度算法实现处理器调度的程序(可以自己定义进程的数量)
提示:
(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的格式为:
进程名、指针、要求运行时间、优先数、状态。
进程名——P1~P5。
指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。
要求运行时间——假设进程需要运行的单位时间数。
3.源程序清单
///按优先数调度算法实现处理器调度的程序
#include "stdio.h"
#include "string.h"
int num;
struct PCB
{
char name;//进程名
int runtime;//要求运行时间
int pri;//优先数
char state;//状态,R-就绪,F-结束
else
pcblist[i].state='R';//未运行完将其状态置为就绪
}
h=f-(--g);
printf("这是第%d运行",h);
show();//显示每次运行后各PCB的情况
getchar();//等待回车进入下一次运行
}
}
}
}
void main()//按动态优先数调度主程序
{ printf("请输入要运行进程的数目:");
};
struct PCB pcblist[100];//定义进程控制块数组
void init()//PCB初始化子程序
{int i;
for(i=0;i<num;i++)
{
printf("PCB[%d]:进程名优先级运行时间\n",i+1);//为每个进程任意指定pri和runtime
scanf("%s%d%d", &pcblist[i].name, &pcblist[i].pri, &pcblist[i].runtime);
相关文档
最新文档