操作系统实验2进程调度源程序

合集下载

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

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

操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。

其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。

实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。

实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。

在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。

实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。

在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。

2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。

在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。

3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。

在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。

实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。

在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。

因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。

结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。

同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。

实验二带优先级的时间片轮换的进程调度算法的实现

实验二带优先级的时间片轮换的进程调度算法的实现


struct pcb *p;

for (i=0;i<MAXPIOR;i++)

{p=array[i];

while (p!=NULL)

{printf("id:%d,state:%d,pior:%d,life:%d\n",p->ident,p->state,p->pior,p->life);

p=p->next;
• {int i=0,ii=0;
• for (i=0;i<7;i++)

if (stricmp(str,command[i])==0)

break;
• switch(i)

{case 0:printf("thank you for using the program!\n");exit(0);

break;
•{

int i=MAXPIOR-1,pior=0,t;

struct pcb *pp,*qq,*pr,*r;

do

{

while (i>=0 && array[i]==NUf (i<0)

{

printf("NO process,please create it! \n");
第1个,再降低其优先级,插入到相应的队列中。 C)ps 查看当前进程状态 D)sleep 命令将进程挂起 E)awake 命令唤醒1个被挂起的进程 F)kill 命令杀死进程 G)quit命令退出 (4)选用面向对象的编程方法。

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

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

操作系统实验报告进程调度操作系统实验报告:进程调度引言操作系统是计算机系统中最核心的软件之一,它负责管理和调度计算机的资源,提供良好的用户体验。

在操作系统中,进程调度是其中一个重要的功能,它决定了进程的执行顺序和时间片分配,对于提高计算机系统的效率和响应能力至关重要。

本篇实验报告将重点介绍进程调度的相关概念、算法和实验结果。

一、进程调度的概念进程调度是操作系统中的一个重要组成部分,它负责决定哪个进程可以使用CPU,并为其分配执行时间。

进程调度的目标是提高系统的吞吐量、响应时间和公平性。

在多道程序设计环境下,进程调度需要考虑多个进程之间的竞争和协作,以实现资源的合理利用。

二、进程调度算法1. 先来先服务调度(FCFS)先来先服务调度算法是最简单的进程调度算法之一,它按照进程到达的顺序进行调度,即先到达的进程先执行。

这种算法的优点是公平性高,缺点是无法适应长作业和短作业混合的情况,容易产生"饥饿"现象。

2. 最短作业优先调度(SJF)最短作业优先调度算法是根据进程的执行时间来进行调度的,即执行时间最短的进程先执行。

这种算法的优点是能够最大程度地减少平均等待时间,缺点是无法适应实时系统和长作业的情况。

3. 时间片轮转调度(RR)时间片轮转调度算法是一种抢占式调度算法,它将CPU的执行时间划分为固定大小的时间片,并按照轮转的方式分配给各个进程。

当一个进程的时间片用完后,它将被挂起,等待下一次调度。

这种算法的优点是能够保证每个进程都能够获得一定的执行时间,缺点是无法适应长作业和短作业混合的情况。

4. 优先级调度(Priority Scheduling)优先级调度算法是根据进程的优先级来进行调度的,优先级高的进程先执行。

这种算法的优点是能够根据进程的重要性和紧急程度进行灵活调度,缺点是可能会导致低优先级的进程长时间等待。

三、实验结果与分析在实验中,我们使用了不同的进程调度算法,并对其进行了性能测试。

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验报告实验二时间片轮转进程调度算法学号:班级:姓名:【实验题目】: 时间片轮转进程调度算法【实验目的】通过这次实验, 加深对进程概念的理解, 进一步掌握进程状态的转变、进程调度的策略与对系统性能的评价方法。

【实验内容】问题描述:设计程序模拟进程的时间片轮转RR 调度过程。

假设有n 个进程分别在T1, … ,Tn 时刻到达系统, 它们需要的服务时间分别为S1, … ,Sn 。

分别利用不同的时间片大小q, 采用时间片轮转RR 进程调度算法进行调度, 计算每个进程的完成时间, 周转时间和带权周转时间, 并且统计n 个进程的平均周转时间和平均带权周转时间。

程序要求如下:1)进程个数n ;每个进程的到达时间T 1, … ,T n 和服务时间S 1, … ,S n ;输入时间片大小q 。

2)要求时间片轮转法RR 调度进程运行, 计算每个进程的周转时间, 带权周转时间, 并且计算所有进程的平均周转时间, 带权平均周转时间;3)输出: 要求模拟整个调度过程, 输出每个时刻的进程运行状态, 如“时刻3: 进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间, 带权周转时间, 所有进程的平均周转时间, 带权平均周转时间。

实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int ArrivalTime[100];int ServiceTime[100];int PServiceTime[100];int FinishTime[100];int WholeTime[100];double WeightWholeTime[100];double AverageWT,AverageWWT;bool Finished[100];➢2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n, T1, … ,Tn, S1, … ,Sn;时间片大小q;➢按照时间片轮转RR算法进行进程调度, 计算进程的完成时间、周转时间和带权周转时间;➢计算所有进程的平均周转时间和平均带权周转时间;➢按格式输出调度结果。

操作系统实验进程调度

操作系统实验进程调度

实验二进程调度⒈实验内容进程调度模拟实验。

⒉实验目的通过模拟进程调度算法,了解进程调度的过程并比较不同的调度算法的区别。

⒊实验题目设计一段程序来模拟优先级调度算法和时间片轮转算法。

要求可以指定进程的数量、各进程需要CPU的时间和各进程的优先级。

⒋实验提示⑴进程调度算法是指处理机的分配策略。

优先数调度算法是指对每个进程确定一个优先数,进程调度总是让具有最高优先数的进程先使用处理机。

如果进程具有相同的优先数,再按先来先服务的次序分配处理机。

在本实例中采用动态优先数算法。

时间片轮转算法是指就绪进程按就绪的先后次序排成队列,每次总是选择就绪队列中的第一个进程占用处理机,但规定只能使用一个“时间片”。

⑵系统中的进程可以用进程控制块PCB来表示,PCB的结构定义如表5-8所示:表5-8 PCB结构⑶在进程调度时进程会交替的出现在运行、就绪和完成三种状态。

可以定义三个链表来存放三种状态的进程。

当进程运行时就把进程放入到运行链表中;当进程处于就绪状态时就将进程放入到就绪链表中;当进程运行完毕时就将进程放入到完成链表中。

由于同一时刻运行的进程只能有一个,所以运行链表只能有一个结点。

在实例程序中为了使程序更简洁忽略了进程的等待状态,仅运行了优先数调度算法,由于篇幅有限,仅显示部分结果,对于时间片轮转调度算法,请读者自行运行。

⑷主要变量及函数说明如表5-9所示:表5-9 主要变量及函数说明⒌实例代码//进程调度算法proc.c//运行环境Redhad9.0 gcc 4.0#include <stdio.h>#include <string.h>typedef struct pcb //定义PCB结构{char name[20]; /*进程标识符*/int cputime; /*进程占用CPU时间*/int prio; /*进程优先数*/int needtime; /*进程到完成还需要的CPU时间*/struct pcb *next;/*链指针*/}PCB;PCB *RUN,*READY,*RTAIL,*FINSH,*FTAIL;void PRINTLINK(int t)/*输出3个队列*/{PCB *p;printf("CPU运行次数:___%d___\n",t);printf("______________________\n");printf("进程名\t运行状态\t运行次数\t还需要运行次数\n");if(RUN!=NULL){printf("%s\t运行\t%d\t%d\n",RUN->name,RUN->cputime,RUN->needtime);}elseprintf("*运行状态为空\n");p=READY;if(p!=NULL){while(p!=NULL){printf("%s\t就绪\t%d\t%d\n",p->name,p->cputime,p->needtime);p=p->next;}}elseprintf("*就绪队列为空\n");p=FINSH;if (p!=NULL){while(p!=NULL){//printf(" 进程名字为:%s\n",p->name);printf("%s\t完成\t%d\t%d\n",p->name,p->cputime,p->needtime);p=p->next;}}elseprintf("*完成队列为空\n");getchar();}PCB *CPCBLINK()/*建立就绪队列*/{printf("建立就绪队列\n\n");int i,n,nt,pr;PCB *p,*q,*head;n=0;while(1){printf("请输入进程的个数(有效范围1-100):");scanf("%d",&n);printf("\n");if (n>=1&&n<=100)break;elseprintf("输入有误。

实验二--单处理器系统的进程调度

实验二--单处理器系统的进程调度

实验二–单处理器系统的进程调度
简介
在操作系统中,进程调度是非常重要的一项工作。

进程调度负责将CPU分配
给各个进程,使得每个进程都能够有机会占用CPU资源。

在单处理器系统中,CPU只有一个,因此进程调度是非常重要的。

本次实验将会探究单处理器系统的进程调度,了解各种进程调度算法的实现和
比较,利用模拟操作系统的实验平台进行实验。

实验目的
1.了解进程调度的基本概念和实现方法;
2.学习多种进程调度算法,并比较其优缺点;
3.熟悉模拟操作系统的实验环境,学习如何将算法实现到具体的系统中。

实验内容
进程调度的基本概念
进程调度是指将CPU资源分配给各个进程的过程。

在单处理器系统中,当有
多个进程需要使用CPU时,操作系统需要进行进程调度,使得每个进程都能够得
到CPU资源。

在进程调度中,需要考虑各个进程的优先级、进程的状态和进程的等待时间等
因素。

根据不同的调度算法,可以根据这些因素来确定哪个进程应该先占用CPU。

进程调度算法比较
常见的进程调度算法包括:
1.先来先服务算法(FCFS)
2.短作业优先算法(SJF)
3.优先级调度算法
4.时间片轮转算法(RR)
下面将对这些算法进行比较和介绍。

先来先服务算法(FCFS)
先来先服务算法是最简单的一种进程调度算法。

该算法将按照进程的到达时间
的先后顺序进行调度,先到达的进程先得到CPU资源。

这种算法的优点是实现简单,适用于短作业和计算密集型进程。

缺点是无法充分利用CPU资源,导致长作业需要等待较长时间才能被调度,容易产生。

操作系统实验二并发与调度

操作系统实验二并发与调度

实验二并发与调度一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。

通过分析实验程序,了解管理事件对象的API。

了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。

二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional,Visual C++ 6.0专业版或企业版。

三、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。

每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。

创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源(因而也就是共享资源) 。

1、利用互斥体保护共享资源程序参见实验指导书分析程序的运行结果,可以看到线程(加和减线程) 的交替执行(因为Sleep() API允许Windows切换线程) 。

在每次运行之后,数值应该返回初始值(0) ,因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。

1)请描述运行结果(如果运行不成功,则可能的原因是什么?) :2) 根据运行输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述:_____逆向运行__________第二部分线程通过文件对象发送数据Windows 2000提供的线程间通讯类内核对象允许同一进程或跨进程的线程之间互相发送信息,包括文件、文件映射、邮件位和命名管道等,其中最常用的是文件和文件映射。

这类对象允许一个线程很容易地向同一进程或其他进程中的另一线程发送信息。

1、演示线程通过文件对象发送数据程序参见实验指导书运行结果(如果运行不成功,则可能的原因是什么?) :阅读和分析程序,请回答问题:1) 程序中启动了多少个单独的读写线程?__________100__________________________________________________________2) 使用了哪个系统API函数来创建线程例程?_________ CreateThread()________________________________3) 文件的读和写操作分别使用了哪个API函数?_______ ReadFile()______ WriteFile()_____________ 每次运行进程时,都可看到程序中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。

进程调度算法实验报告

进程调度算法实验报告

计算机操作系统实验报告实验二进程调度算法一、实验名称:进程调度算法二、实验内容:编程实现如下算法:1.先来先服务算法;2.短进程优先算法;3.时间片轮转调度算法。

三、问题分析与设计:1.先来先服务调度算法先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。

该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

FCFS算法比较有利于长作业(进程),2.短作业(进程)优先调度算法短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。

它们可以分别用于作业调度和进程调度。

短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。

而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。

SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。

该算法对长作业不利,完全未考虑作业的紧迫程度。

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

当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。

换言之,系统能在给定的时间内响应所有用户的请求。

实验二 进程调度 实验报告

实验二 进程调度 实验报告
2.程序实现步骤
(1)输入进程数、进程名、要求运行时间、已运行时间以及进程状态,初
始状态都为“就绪”,用“R”表示。当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)把所有进程按顺序排成循环队列,用指针进行连接。
(3)运行队列中的队首进程,执行一个时间片,同时将该进程的“已运行
时间”+1,同时判断“要求运行时间”和“已运行时间”是否相等,如果相等,则将该进程状态修改为“E”,并退出循环队列,指针指向下一个进程;若不相等,则指针直接指向下一个进程,执行下一个时间片。
3.流程图
五、实验结果和分析(运行结果截图)
问题一
问题二
2.问题二
本题采用的是动态改变响应比的办法。首先根据公式
计算每个进程的响应比即优先数,根据响应比的大小降序排列,响应比大
的进程优先得到服务,每次执行一个时间片。由于本实验是模拟操作系统调
度进程的过程,被选中的进程并不实际的启动运行,而是执行: 要求运行
时间-1、等待时间为0,其它进程等待时间+1。进入下一轮运行时进程重
实验目的如下:
1.利用高级语言模拟进程的时间片轮转调度算法,并熟练掌握。
2.利用高级语言模拟进程的响应比高者优先调度算法,并熟练掌握。
二、实验原理
1.问题一
针对系统的所有进程,首先确定所有进程的要求运行时间(已运行时间初始值为0);将所有进程按顺序排成循环队列,用指针指出队列连接情况,同时另用一个标志单元记录轮到运行的进程,此时以轮转法进行调度;先将CPU分配给队首进程,并令其执行一个时间片,当它运行完毕后,将CPU分配给就绪队列中新的队首进程,让其执行一个时间片,进程每被调度一次,该进程已运行时间+1,同时,判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行,若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”,并退出队列。此时,把该进程的进程控制块中的指针值送到前面一个进程的指针位置,直到所有的进程都成为“结束”状态。

Linux操作系统实验2-进程调度的操作

Linux操作系统实验2-进程调度的操作

1.查看并创建用户的计划任务列表crontab文件;
1)查看crontab命令的帮助信息;
在终端下键入info crontab, 进入crontab帮助手册:
2)查看用户的计划任务列表;
查看特定用户的计划任务列表:
在终端下键入crontab -l -u duke 列出duke用户的所有定时任务,如下:
终端提示no crontab for duke,说明用户duke目前没有计划任务。

查看当前用户的计划任务列表:
在终端下键入crontab -l 列出当前用户的所有定时任务,如下:
终端提示no crontab for duke,说明用户duke目前没有计划任务。

2.通过crontab文件对调度进程的计划任务进行编排操作。

1)建立crontab文件;
在终端下键入crontab -e ,提示当前无crontab文件,选择编辑器并新建如下:进入VI编辑器,编辑当前crontab文件,可以看到提供了一些注解作说明。

在crontab中输入0 3 * * 1 ls /etc 并保存,实现在每周一早上三点执行ls /etc 命令。

再次查看crontab文件,可以看到已经保存。

2)使用crontab命令安装crontab文件,安排计划任务;
对于位于/home下的crontab文件,使用crontab <filename>载入crontab计划任务中,如图:
3)查看计划任务表,确认计划任务是否已被安排;
键入crontab -l,查看计划任务安排情况,如图:
4)删除计划任务列表。

在终端下键入crontab -r ,删除当前用户的crontab文件,如下:。

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

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

学生实验报告姓名:年级专业班级学号成绩
【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意
1.三种进程调度算法的执行结果如下。

(1)FCFS算法
(2)高优先权优先调度算法
(3)时间片轮转调度算法
2.以上三个程序能较好地实现进程的三种调度算法。

(1)用数组元素的顺序输入输出能实现进程的FCFS算法。

(2)用优先权的变化规律描述和冒泡法排序能模拟实现优先权调度算法。

(3)通过数组的运算和利用中间数组能实现时间片轮转调度算法。

3. 虽然以上三个程序能较直观的体现进程基本的三种调度算法,但还是存在一些不足。

(1)如在高优先权调度算中,当同时出现多个进程优先权相同的情况时,程序可能对这些不能选择正确的执行顺序。

改进的方法为添加一个判断,当多个进程的优先权相同时,按FCFS算法执行。

即在程序中表现为按数组元素下标的增大顺序排序。

(2)在时间片轮转算法中,不能一次性的输出进程的调度程度,而要通过多次的输入时间片。

改进的方法为把时间片设置为全局变量,在每次循环时都执行一次。

指导教师签名:
20 年月日
【备注。

《操作系统》实验二

《操作系统》实验二

《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。

通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。

二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。

b.设计一个简单的进程调度算法,如轮转法或优先级调度法。

c.实现进程间的通信机制,如共享内存或消息队列。

2、线程调度a.实现线程的创建、撤销和调度。

b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。

3、内存管理a.设计一个简单的分页内存管理系统。

b.实现内存的分配和回收。

c.实现一个简单的内存保护机制。

4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。

b.实现文件的存储和检索。

c.实现文件的备份和恢复。

三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。

b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。

可以使用模拟的方法,不需要真实的硬件环境。

c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。

2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。

b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。

同样可以使用模拟的方法。

3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。

b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。

可以使用模拟的方法。

4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。

b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。

操作系统实验2进程调度 实验报告

操作系统实验2进程调度 实验报告
(1)掌握时间片轮换的进程调度算法;
(2)掌握带优先级的进程调度算法;
(3)选用面向对象的编程方法。
二、实验内容;
(1)用C语言(或其它语言,如Java)实现对N个进程采用动态优先调度算法的调度。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
4.可动态添加、删除进程;
5.完成所有进程操作。
五、程序源代码及注释
六、实验结果分析
1、运行结果如下:
2、结果分析
首先,每次从就绪队列中选择最高优先权的进程时,需要计算出最高优先权和次高优先权之间的STARTBLOCK。即最高优先权进程运行多少个时间片后就会进入阻塞队列。每调度一次,就需要更新所有进程的信息,并判断CPUTIME是否等于ALLTIME,如果相等,则进程完成操作,需从就绪队列中删除。如果阻塞队列中进程的BLOCKTIME为0时,还需要将其转移到就绪队列中。
(5)用户可以干预进程的运行状态,程序应该设置可以让用户中断的入口,并可以通过以下命令查看,修改,终止进程。
A)create随机创建进程,进程的优先级与所需要的时间片随机决定;
B)ps查看当前进程状态
C)sleep命令将进程挂起
D)kill命令杀死进程
E)quit命令退出
(5)分析程序运行的结果,谈一下自己的认识。
三、实验原理;
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
根据进程的五个特征:(1)动态性;(2)并发性;(3)异步性;(4)独立性;(5)结构性及三种基本状态的转换,了解各进程对资源的共享和竞争。进程并发执行时,由于资源共享,带来各进程之间的相互制约。为了反映这些制约关系和资源共享关系,在创建一个进程时,应首先创建其PCB,然后才能根据PCB中信息对进程实施有效的管理和控制。当一个进程完成其功能之后,系统则最后释放PCB,进程也随之消亡。

进程调度实验报告源码

进程调度实验报告源码

一、实验目的本次实验旨在通过模拟进程调度过程,加深对进程调度算法的理解,并掌握进程调度程序的设计与实现方法。

实验内容主要包括:创建进程、进程调度、进程执行、进程结束等。

二、实验环境操作系统:Linux编程语言:C/C++三、实验内容1. 进程调度算法本实验采用三种进程调度算法:FIFO(先进先出)、时间片轮转法、多级反馈队列调度算法。

2. 进程调度程序设计进程调度程序主要由以下部分组成:(1)进程控制块(PCB)PCB用于描述进程的基本信息,包括进程名、到达时间、需要运行时间、已运行时间、进程状态等。

(2)就绪队列就绪队列用于存储处于就绪状态的进程,按照进程的优先级或到达时间进行排序。

(3)进程调度函数进程调度函数负责从就绪队列中选择一个进程进行执行,并将CPU分配给该进程。

(4)进程执行函数进程执行函数负责模拟进程的执行过程,包括进程的创建、执行、结束等。

四、实验源码```c#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX_PROCESSES 10typedef struct PCB {int pid;int arrival_time;int need_time;int used_time;int priority;int state; // 0: 等待 1: 运行 2: 完成} PCB;PCB processes[MAX_PROCESSES];int process_count = 0;typedef struct Queue {PCB queue;int front;int rear;int size;} Queue;Queue ready_queue;void init_queue(Queue q) {q->queue = (PCB )malloc(sizeof(PCB) MAX_PROCESSES); q->front = q->rear = 0;q->size = 0;}void enqueue(Queue q, PCB p) {if (q->size == MAX_PROCESSES) {printf("Queue is full.\n");return;}q->queue[q->rear] = p;q->rear = (q->rear + 1) % MAX_PROCESSES; q->size++;}PCB dequeue(Queue q) {if (q->size == 0) {printf("Queue is empty.\n");return NULL;}PCB p = &q->queue[q->front];q->front = (q->front + 1) % MAX_PROCESSES; q->size--;return p;}int is_empty(Queue q) {return q->size == 0;}void print_queue(Queue q) {printf("Queue: ");for (int i = 0; i < q->size; i++) {PCB p = &q->queue[(q->front + i) % MAX_PROCESSES];printf("PID: %d, Arrival Time: %d, Need Time: %d, Used Time: %d, Priority: %d, State: %d\n",p->pid, p->arrival_time, p->need_time, p->used_time, p->priority, p->state);}}void init_processes() {for (int i = 0; i < MAX_PROCESSES; i++) {processes[i].pid = i;processes[i].arrival_time = rand() % 10;processes[i].need_time = rand() % 10 + 1;processes[i].used_time = 0;processes[i].priority = rand() % 3;processes[i].state = 0;}}void schedule() {int time = 0;while (process_count > 0) {for (int i = 0; i < process_count; i++) {PCB p = &processes[i];if (p->arrival_time == time) {enqueue(&ready_queue, p);p->state = 1;}}if (!is_empty(&ready_queue)) {PCB p = dequeue(&ready_queue);p->used_time++;printf("Process %d is running.\n", p->pid);if (p->used_time == p->need_time) {p->state = 2;printf("Process %d is finished.\n", p->pid); }}time++;}}int main() {srand(time(NULL));init_queue(&ready_queue);init_processes();process_count = rand() % MAX_PROCESSES + 1;schedule();print_queue(&ready_queue);return 0;}```五、实验结果与分析1. FIFO调度算法实验结果表明,FIFO调度算法按照进程的到达时间进行调度,可能导致短作业等待时间长,效率较低。

操作系统 实验二进程调度

操作系统 实验二进程调度

实验二、进程调度实验【实验目的及要求】用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

要求选做实验内容中的一题。

【实验环境】编程环境:Visual C++操作系统软件:windows XP【预习要求】按照实验指导书要求事先编好程序;准备好需要输入的中间数据;估计可能出现的问题;预计可能得到的运行结果。

【实验内容】1、设计一个有N个进程共行的进程调度程序。

2、编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。

【算法描述及实验步骤】实验1算法描述:进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

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

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

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

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

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

每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

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

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

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

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

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

实验2算法描述:“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。

静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。

动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。

实验进程调度源代码

实验进程调度源代码

实验进程调度源代码实验2 进程调度(一)目的和要求进程调度是处理机管理的核心内容。

本实验要求用高级语言编写和调试一个简单的进程调度程序。

通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施方法。

(二)实验内容(1)设计进程控制块PCB结构,分别适用于优先数调度算法和循环轮转调度算法。

PCB结构包括以下信息:进程标识符,进程优先数(或轮转时间片),进程所占用的CPU时间、进程状态,当前队列指针等。

根据调度算法不同,PCB结构的内容可适当做增删。

(2)建立进程就绪队列。

对两种不同算法编制入链子程序。

(3)编制两种进程调度算法:1)优先数调度;2)循环轮转调度。

(三)实验环境用BORLAND C语言(四)范例说明采用C语言编写程序,选用优先数法或简单轮转法对五个进程进行调度,每个进程处于运行(RUN),就绪(READY)和完成(FINISH)三种状态之一,并假定起始状态为就绪状态。

1.数据结构PCB结构如下:NAME 进程标识符PRIO / ROUND 优先数/ 时间片CPUTIME 进程已占用的CPU时间NEEDTIME 进程到完成还需要的CPU时间NEXT 处于同一状态的下一进程的地址STATUS 进程所处的状态“R”进程处于运行状态“W”进程处于就绪状态“F”进程处于完成状态2.程序说明(1)在优先数算法中,进程每执行一次,优先数减3,CPU时间片加1,进程还需要的时间片数减1。

在轮转法中,采用固定时间片,时间片数为2,进程每执行一次,CPU时间片数加2,进程还需要的时间片数减2,并排在就绪队列的队尾。

(2)程序结构说明如下:①INSERT1:把未完成且优先数小于别的进程的进程PCB按进程优先数的顺序插入到就绪队列中。

②INSERT2:轮转法中使用的过程,将执行一个单位时间片数(为2)且还未完成的进程的PCB插入到就绪队列队尾。

③FIRSTIN:将就绪队列中的第一个进程投入运行。

操作系统实验二进程调度

操作系统实验二进程调度

操作系统实验二进程调度摘要:进程调度是操作系统中重要的功能之一,可以决定进程的优先级和执行顺序。

本实验主要介绍了进程调度的概念、不同的调度算法以及如何实现进程调度。

一、概念介绍进程调度是操作系统中的一项重要功能,用于决定哪个进程能够在处理器上运行。

在操作系统中存在多个进程需要同时运行,而处理器资源有限,因此需要通过进程调度来合理地安排进程的执行顺序,提高系统的效率。

进程调度的目标是使系统的吞吐量最大化、响应时间最短、资源利用率最高等。

常见的调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转、优先级调度等。

二、调度算法介绍1.先来先服务(FCFS)先来先服务(FCFS)是最简单的调度算法,按照进程到达的顺序进行调度,先到达的进程先执行。

FCFS算法不考虑进程的优先级和执行时间,容易导致平均等待时间长。

2.最短作业优先(SJF)最短作业优先(SJF)调度算法按照进程所需的CPU时间进行排序,优先调度所需时间最短的进程。

SJF算法可以减少平均等待时间,但可能会导致长作业等待时间过长。

3.时间片轮转时间片轮转是一种抢占式调度策略,将处理器的使用权分割为若干个时间片,每个进程在一个时间片内运行,如果时间片用完仍未运行完,则将该进程放到队列的末尾,并让下一个进程运行。

时间片轮转算法保证了公平性和响应时间,但可能会导致上下文切换次数过多。

4.优先级调度优先级调度是根据进程的优先级进行调度,优先级高的进程先执行。

优先级可以根据进程类型、实时性等因素确定,不同的操作系统可能有不同的优先级范围和策略。

三、实验步骤1.定义进程结构:定义进程结构体,包含进程ID、进程状态、优先级、执行时间等信息。

2.初始化进程队列:将所有进程按照到达的先后顺序加入到进程队列中。

3.实现调度算法:根据不同的调度算法,实现相应的进程调度算法代码。

可以使用循环遍历进程队列,并根据不同的调度策略决定下一个要执行的进程。

4.执行进程调度:在每个时间片结束后,根据调度算法选取下一个要执行的进程,并更新进程的状态和执行时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(p){
cout<<p->name;
cout<<" &#utime;
cout<<" ";
cout<<p->needtime;
cout<<" ";
cout<<p->priority;
cout<<" ";
switch(p->process){
case ready:cout<<"ready"<<endl;break;
switch(k){
case 1:priority_cal();break;
case 2:round_cal();break;
case 3:break;
display_menu();
scanf("%d",&k);
}
}
t=head;
while(t->next!=k&&t->process==finish){
t=t->next;
}
}
return t;
}//获取下一个进程
void set_state(pcb*p){
while(p){
if(p->needtime==0){
p->process=finish;//如果所需执行时间为0,则设置运行状态为结束
state process;//进程状态
pcb*next;
};//定义进程pcb
pcb*get_process(){
pcb*q;
pcb*t;
pcb*p;
int i=0;
cout<<"input name and time"<<endl;
while(i<P_NUM){
q=(struct pcb*)malloc(sizeof(pcb));
}
i++;
}//while循环
return p;
}//输入模拟测试的进程名和执行所需时间,初始设置可模拟5个进程的调度
void display(pcb*p){
cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"shate"<<endl;
pcb*p;
pcb*r;
system("cls");
//clrscr();
p=get_process_round();
int cpu=0;
system("cls");
//clrscr();
r=p;
while(!process_finish(p)){
cpu+=2;
cpu_round(r);
r=get_next(r,p);
#include<stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream.h>
#include<windows.h>
#define P_NUM 5
#define P_TIME 50
enum state{
ready,
}
if(t->needtime!=0){
t->priority-=3;
t->needtime--;
t->process=execute;
t->cputime++;
}
}//选择某一进程,给它分配CPU
//计算进程优先级
void priority_cal(){
pcb*p;
system("cls");
//clrscr();
while(q){
if(q->process!=finish){
q->process=ready;
if(q->needtime==0){
q->process=finish;
}
}
if(tp<q->priority&&q->process!=finish){
tp=q->priority;
t=q;
}
q=q->next;
case ready:cout<<"ready"<<endl;break;
case execute:cout<<"execute"<<endl;break;
case finish:cout<<"finish"<<endl;break;
}
p=p->next;
}
}//时间片轮转调度算法输出调度信息
void round_cal(){
case execute:cout<<"execute"<<endl;break;
case block:cout<<"block"<<endl;break;
case finish:cout<<"finish"<<endl;break;
}
p=p->next;
}//显示模拟结果,包含进程名、CPU时间、运行所需时间以及优先级
cout<<"2 ROUNDROBIN"<<endl;
cout<<"3 EXIT"<<endl;
}//显示调度算法菜单,可供用户选择优先权调度算法和时间片轮转调度算法
pcb*get_process_round(){
pcb*q;
pcb*t;
pcb*p;
int i=0;
cout<<"input name and time"<<endl;
while(i<P_NUM){
q=(struct pcb*)malloc(sizeof(pcb));
cin>>q->name;
cin>>q->needtime;
q->cputime=0;
q->round=0;
q->count=0;
q->process=ready;
q->next=NULL;
if(i==0){
}
q->count++;
q->round++;
q->process=execute;
}//采用时间片轮转调度算法执行某一进程
pcb*get_next(pcb*k,pcb*head){
pcb*t;
t=k;
do{
t=t->next;
}
while(t&&t->process==finish);
if(t==NULL){
}
if(p->process==execute){
p->process=ready;//如果为执行状态则设置为就绪
}
p=p->next;
}
}//设置队列中进程执行状态
void display_round(pcb*p){
cout<<"NAME"<<" "<<"CPUTIME"<<" "<<"NEEDTIME"<<" "<<"COUNT"<<" "<<"ROUND"<<" "<<"STATE"<<endl;
p=q;
t=q;
}
else{
t->next=q;
t=q;
}
i++;
}//while
return p;
}//时间片轮转调度算法创建就绪进程队列
void cpu_round(pcb*q){
q->cputime+=2;
q->needtime-=2;
if(q->needtime<0){
q->needtime=0;
}
int process_finish(pcb*q){
int bl=1;
while(bl&&q){
bl=bl&&q->needtime==0;
q=q->next;
}
return bl;
}//结束进程,即将各队列中各进程的所需时间设置为0
void cpuexe(pcb*q){
pcb*t=q;
int tp=0;
execute,
block,
finish
};//定义进程的状态
struct pcb{
相关文档
最新文档