操作系统实验二进程调度(代码+结果)
操作系统实验报告进程调度

五邑大学实验报告操作系统课程2016~2017年度第1学期实验题目:进程调度院系:计算机学院班级: 140801学号: 3114002472姓名:黄凯鑫任课教师:白明成绩评定:实验二题目:进程调度完成日期:2016年12 月11 日1、实验目的(1)设计一个有n个进程工行的进程调度程序。
每个进程由一个进程控制块(PCB)表示。
进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。
(2)调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。
(3)系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程2、实验内容(1)编制和调试示例给出的进程调度程序,并使其投入运行。
(2)自行设计或改写一个进程调度程序,在相应机器上调试和运行该程序,其功能应该不亚于示例。
(3)直观地评测各种调度算法的性能。
3、算法设计算法:(1) 优先数法。
进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。
每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。
接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。
原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。
(2) 简单轮转法。
进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。
每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。
操作系统实验-进程调度2

//状态宏
#defineWAIT 0x01
#defineRUN 0x02
#defineFINISH 0x03
#defineID_ERROR 0x10
#defineMIN_PRIOR 0xFF
#defineMAX_PRIOR 0x00
//自定义数据类型
{
if(g_queue[i].s_state!=FINISH)
{
temp_prior = g_queue[i].s_dynamic_prior * 100 + g_queue[i].s_static_prior;
if(temp_prior <= prior)
{
id = i;
prior = temp_prior;
{
Work_Process(id);
}
}
Uint32 Get_PriProceபைடு நூலகம்s()
{
Uint32 id = ID_ERROR;
inti,prev_id = ID_ERROR;
Uint32 prior = MIN_PRIOR * 2, temp_prior;
for(i=0;i<PRO_NUM;++i)
{
inti =0;
Uint32 id = ID_ERROR;
for(i = 0;i<PRO_NUM;++i)
{
if(g_queue[i].s_state==FINISH)
{
id = g_queue[i].s_id;
g_queue[i].s_dynamic_prior = 0;
g_queue[i].s_need_time =needtime;
操作系统实验报告(进程调度)

华中师范大学计算机科学系《操作系统》实验报告实验题目:进程调度学生姓名:日期:2011-12-9实验2进程调度进程完成,撤消该进程就绪队列首进程投入运行 时间片到,运行进程已占用CPU 时间+1 运行进程已占用CPU 时间已达到所需的运行时间 把运行进程插入到下一个队列的队尾插入新的进程开始 初始化PCB,输入进程信息 所有队列都为空 各进程按FCFS 原则排队等待调度 【实验目的】(1)通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。
(2)了解Windows2000/XP 中进程(线程)的调度机制。
(3)学习使用Windows2000/XP 中进程(线程)调度算法,掌握相应的与调度有关的Win32 API 函数。
【实验内容】在Windows XP 、Windows 2000等操作系统下,使用的VC 、VB 、java 或C 等编程语言,利用相应的WIN32 API 函数,编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法。
【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)1、进程调度算法:采用多级反馈队列调度算法。
其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS 原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS 原则等待调度执行,以此类推。
2、实验步骤:(1)按先来先服务算法将进程排成就绪队列。
(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。
(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。
(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。
(5)重复步骤(2)、(3)、(4),直到就绪队列为空。
操作系统实验报告进程调度

操作系统实验报告进程调度操作系统实验报告:进程调度引言操作系统是计算机系统中最核心的软件之一,它负责管理和调度计算机的资源,提供良好的用户体验。
在操作系统中,进程调度是其中一个重要的功能,它决定了进程的执行顺序和时间片分配,对于提高计算机系统的效率和响应能力至关重要。
本篇实验报告将重点介绍进程调度的相关概念、算法和实验结果。
一、进程调度的概念进程调度是操作系统中的一个重要组成部分,它负责决定哪个进程可以使用CPU,并为其分配执行时间。
进程调度的目标是提高系统的吞吐量、响应时间和公平性。
在多道程序设计环境下,进程调度需要考虑多个进程之间的竞争和协作,以实现资源的合理利用。
二、进程调度算法1. 先来先服务调度(FCFS)先来先服务调度算法是最简单的进程调度算法之一,它按照进程到达的顺序进行调度,即先到达的进程先执行。
这种算法的优点是公平性高,缺点是无法适应长作业和短作业混合的情况,容易产生"饥饿"现象。
2. 最短作业优先调度(SJF)最短作业优先调度算法是根据进程的执行时间来进行调度的,即执行时间最短的进程先执行。
这种算法的优点是能够最大程度地减少平均等待时间,缺点是无法适应实时系统和长作业的情况。
3. 时间片轮转调度(RR)时间片轮转调度算法是一种抢占式调度算法,它将CPU的执行时间划分为固定大小的时间片,并按照轮转的方式分配给各个进程。
当一个进程的时间片用完后,它将被挂起,等待下一次调度。
这种算法的优点是能够保证每个进程都能够获得一定的执行时间,缺点是无法适应长作业和短作业混合的情况。
4. 优先级调度(Priority Scheduling)优先级调度算法是根据进程的优先级来进行调度的,优先级高的进程先执行。
这种算法的优点是能够根据进程的重要性和紧急程度进行灵活调度,缺点是可能会导致低优先级的进程长时间等待。
三、实验结果与分析在实验中,我们使用了不同的进程调度算法,并对其进行了性能测试。
操作系统实验二报告-时间片轮转进程调度算法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("输入有误。
操作系统实验报告

实验二进程调度1.目的和要求通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。
2.实验内容阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。
编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。
假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。
采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。
程序要求如下:1)输出系统中进程的调度次序;2)计算CPU利用率。
3.实验环境Windows操作系统、VC++6.0C语言4设计思想:(1)程序中进程可用PCB表示,其类型描述如下:struct PCB_type{int pid ; //进程名int state ; //进程状态2——表示“执行”状态1——表示“就绪”状态0——表示“阻塞”状态int cpu_time ; //运行需要的CPU时间(需运行的时间片个数)}用PCB来模拟进程;(2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。
队列类型描述如下:struct QueueNode{struct PCB_type PCB;Struct QueueNode *next;}并设全程量:struct QueueNode *ready_head=NULL,//ready队列队首指针*ready_tail=NULL , //ready队列队尾指针*blocked_head=NULL,//blocked队列队首指针*blocked_tail=NULL; //blocked队列队尾指针(3)设计子程序:start_state();读入假设的数据,设置系统初始状态,即初始化就绪队列和阻塞队列。
实验二--单处理器系统的进程调度

实验二–单处理器系统的进程调度
简介
在操作系统中,进程调度是非常重要的一项工作。
进程调度负责将CPU分配
给各个进程,使得每个进程都能够有机会占用CPU资源。
在单处理器系统中,CPU只有一个,因此进程调度是非常重要的。
本次实验将会探究单处理器系统的进程调度,了解各种进程调度算法的实现和
比较,利用模拟操作系统的实验平台进行实验。
实验目的
1.了解进程调度的基本概念和实现方法;
2.学习多种进程调度算法,并比较其优缺点;
3.熟悉模拟操作系统的实验环境,学习如何将算法实现到具体的系统中。
实验内容
进程调度的基本概念
进程调度是指将CPU资源分配给各个进程的过程。
在单处理器系统中,当有
多个进程需要使用CPU时,操作系统需要进行进程调度,使得每个进程都能够得
到CPU资源。
在进程调度中,需要考虑各个进程的优先级、进程的状态和进程的等待时间等
因素。
根据不同的调度算法,可以根据这些因素来确定哪个进程应该先占用CPU。
进程调度算法比较
常见的进程调度算法包括:
1.先来先服务算法(FCFS)
2.短作业优先算法(SJF)
3.优先级调度算法
4.时间片轮转算法(RR)
下面将对这些算法进行比较和介绍。
先来先服务算法(FCFS)
先来先服务算法是最简单的一种进程调度算法。
该算法将按照进程的到达时间
的先后顺序进行调度,先到达的进程先得到CPU资源。
这种算法的优点是实现简单,适用于短作业和计算密集型进程。
缺点是无法充分利用CPU资源,导致长作业需要等待较长时间才能被调度,容易产生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(j=1;j<counter;j++) { if((tasks[j].come_time<=temp_time)&& (!tasks[j].run_flag)) { respond_rate=(temp_timetasks[j].come_time)/tasks[j].run_time; if (respond_rate>max_respond_rate) { max_respond_rate=respond_rate; number_schedul=j; } } } /*找响应比高的进程*/ tasks[number_schedul].run_begin_time=temp_time;
int order; /*运行次序*/ int run_flag; /*调度标志*/ }tasks[MAX]; int counter; /*实际进程个数*/ int fcfs(); /*先来先服务*/ int ps(); /*优先级调度*/ int sjf(); /*短作业优先*/ int hrrn(); /*响应比高优先*/ int pinput(); /*进程参数输入*/ int poutput(); /*调度结果输出*/ void main() { int option; pinput(); printf("请选择调度算法(0~4):\n"); printf("1.先来先服务\n"); printf("2.优先级调度\n"); printf(" 3.短作业优先\n"); printf(" 4.响应比高优先\n"); printf(" 0.退出\n"); scanf("%d",&option); switch (option) { case 0: printf("运行结束。\n"); break; case 1: printf("对进程按先来先服务调度:\n\n"); fcfs(); poutput(); break; case 2: printf("对进程按优先级调度:\n\n"); ps(); poutput(); break; case 3:
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+t temp_time=tasks[number_schedul].run_end_time; tasks[number_schedul].run_flag=1; temp_counter+=1; tasks[number_schedul].order=temp_counter; } return 0; } int pinput() /*进程参数输入*/ { int i; printf("please input the process counter:\n"); scanf("%d",&counter); for(i=0;i<counter;i++) { printf("******************************************\n"); printf("please input the process of %d th :\n",i+1); printf("please input the name:\n"); scanf("%s",tasks[i].name); printf("please input the number:\n"); scanf("%d",&tasks[i].number); printf("please input the come_time:\n"); scanf("%f",&tasks[i].come_time);
(!tasks[j].run_flag)) { run_time=tasks[j].run_time;number_schedul=j;break;} } for(j=0;j<counter;j++) { if((tasks[j].come_time<=temp_time)&& (!tasks[j].run_flag)) if(tasks[j].run_time<run_time) {run_time=tasks[j].run_time; number_schedul=j; } } /*查找下一个被调度的进程*/ /*对找到的下一个被调度的进程求相应的参数*/ tasks[number_schedul].run_begin_time=temp_time;
四、程序代码: #include<iostream> using namespace std; #define MAX 10 struct task_struct { char name[10]; /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运行时间*/ float run_time; /*运行时间*/ float run_end_time; /*运行结束时间*/ int priority; /*优先级*/
printf("对进程按短作业优先调度:\n\n"); sjf(); poutput(); break; case 4: printf("对进程按响应比高优先调度:\n\n"); hrrn(); poutput(); break; } } int fcfs() /*先来先服务*/ { float time_temp=0; int i; int number_schedul; time_temp=tasks[0].come_time; for(i=0;i<counter;i++) { tasks[i].run_begin_time=time_temp; tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time; tasks[i].run_flag=1; time_temp=tasks[i].run_end_time; number_schedul=i; tasks[number_schedul].order=i+1; } return 0; } int ps() /*优先级调度*/ { float temp_time=0; int i=0,j; int number_schedul,temp_counter; int max_priority; max_priority=tasks[i].priority;
temp_counter++; tasks[number_schedul].order=temp_counter; }return 0; }
int sjf() /*短作业优先*/ { float temp_time=0; int i=0,j; int number_schedul,temp_counter; float run_time; run_time=tasks[i].run_time; j=1; while ((j<counter)&& (tasks[i].come_time==tasks[j].come_time)) { if (tasks[j].run_time<tasks[i].run_time) { run_time=tasks[j].run_time; i=j; } j++; } /*查找第一个被调度的进程*/ /*对第一个被调度的进程求相应的参数*/ number_schedul=i; tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time; tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_ti tasks[number_schedul].run_flag=1; temp_time=tasks[number_schedul].run_end_time; tasks[number_schedul].order=1; temp_counter=1; while (temp_counter<counter) { for(j=0;j<counter;j++) { if((tasks[j].come_time<=temp_time)&&
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+t tasks[number_schedul].run_flag=1; temp_time=tasks[number_schedul].run_end_time; temp_counter++; tasks[number_schedul].order=temp_counter; }return 0; } int hrrn() /*响应比高优先*/ { int j,number_schedul,temp_counter; float temp_time,respond_rate,max_respond_rate; /*第一个进程被调度*/ tasks[0].run_begin_time=tasks[0].come_time; tasks[0].run_end_time=tasks[0].run_begin_time+tasks[0].run_time; temp_time=tasks[0].run_end_time; tasks[0].run_flag=1; tasks[0].order=1; temp_counter=1; /*调度其他进程*/ while(temp_counter<counter) { max_respond_rate=0;