操作系统处理机调度实验报告
计算机操作系统-处理机调度实验报告(精品)
中南大学实验名称:处理机调度课程名称:计算机操作系统学生姓名盛希玲学号 ********** 学院信息科学与工程学院专业班级电子信息工程0602 完成时间 2008年10月12日目录一实验内容 (2)二实验目的 (2)三实验题目 (2)四基本思想 (2)五算法分析 (2)六流程图 (3)七算法描述 (4)八运行输出结果 (9)一实验内容选择一个调度算法,实现处理机调度。
二实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。
本实验模拟实现处理机调度,以加深了解处理机调度的工作。
三实验题目设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。
四基本思想先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。
每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。
如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。
在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。
五算法分析定义一个结构体,此包含了PCB的信息:struct PCB{char PID[5]; /*进程名*/int needtime; /*要求运行的时间*/int cputime; /*已运行时间*/int priority; /*优先权(越小越高)*/int starttime; /*进入就绪队列的时间*/int overtime; /*运行完成的时间*/int state; /*状态:1就绪2运行3完成*/struct PCB *next;};子函数struct PCB *create(int num,int n)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。
main()函数中用一while循环输出进入时间片的进程状态。
六流程图七算法描述#define NULL 0#define LEN sizeof(struct PCB)#include"stdio.h"#include"stdlib.h"struct PCB{char PID[5]; /*进程名*/int needtime; /*要求运行的时间*/int cputime; /*已运行时间*/int priority; /*优先权(越小越高)*/int starttime; /*进入就绪队列的时间*/int overtime; /*运行完成的时间*/int state; /*状态:1就绪2运行3完成*/struct PCB *next;};struct PCB *create(int num,int n)/*创建进程,并将进程按优先级顺序插入队列中*/ {struct PCB *head,*p,*p1,*p2;int i;head=NULL; /*头指针指零*/for(i=1;i<=num;i++) /*循环建立所有进程*/{printf("请输入第%d个进程的信息\n",i);p=(struct PCB *)malloc(LEN); /*开辟一个空间*/printf("进程名:"); /*输入进程名*/scanf("%s",p->PID);printf("要求运行的时间:"); /*输入要运行的时间*/scanf("%d",&p->needtime);p->cputime=0; /*占用处理机的时间赋为零*/printf("优先权:"); /*输入优先权*/scanf("%d",&p->priority);if(n==1)p->starttime=0; /*进入就绪队列的时间赋为零*/else{printf("进入就绪队列时间:"); /*输入进入就绪队列的时间*/scanf("%d",&p->starttime);}p->overtime=-1; /*运行没有结束所以运行完成的时间赋为-1*/p->state=1; /*状态赋为就绪状态*/p1=head; /*p1指针指向头指针*/if(head==NULL) /*如果头指针为零将头指针指向新建立的进程*/ {head=p;head->next=NULL;}else /*头指针不为零的情况*/{if(n==1)while(p1!=NULL&&p->priority>p1->priority) /*查找插入点*/{p2=p1;p1=p1->next;}elsewhile(p1!=NULL&&p->starttime>p1->starttime) /*查找插入点*/{p2=p1;p1=p1->next;}if(head==p1) /*优先权的值最小作为表头*/{p->next=head;p2=head=p;}else /*否则的话插入*/{p2->next=p;p->next=p1;}}}return(head);}void main(){char now[5];int cho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0;struct PCB*head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3;over=NULL;printf("初始化进程...\n");printf("输入总的就绪进程数:");scanf("%d",&num);head=create(num,1); /*建立就绪进程的链表*/printf("输入将会就绪的进程数:");scanf("%d",&num1); /*建立将会进入就绪进程的链表*/later=create(num1,2);printf("cpu是否开始运行:1是 2不是--");scanf("%d",&cho);if(cho==1) /*处理机开始进行调度*/{printf("现在的时间是:");scanf("%s",now);printf("显示所有就绪的进程:\n");p2=head;printf("进程名\t要求运行时间\t已运行时间\t优先权\t状态(1就绪2运行3结束)\n");while(p2!=NULL){printf("%s\t%d\t\t%d\t\t%d\t%d\n",p2->PID,p2->needtime,p2->cputime ,p2->priority,p2->state);p2=p2->next;}printf("请输入时间片总数:");scanf("%d",&timepiece);printf("请输入时间片的时间:");scanf("%d",&time);printf("运行正式开始!\n");head1=head;printf("\t\t进程名\t要求运行时间\t已运行时间\t优先权\t状态\n"); for(i=1;i<=timepiece;i++) /*将进入时间片运行的进程用头指针head1指示,并改变就绪进程头指针head的指向*/{if(head!=NULL){p=head;head=head->next;}else break;}p->next=NULL;while(head1!=NULL) /*就绪进程头指针不为零就循环*/{head1->state=2; /*状态:1就绪2运行3完成*/for(j=1;j<=time;j++) /*每个时间片所需时间的循环*/{clock++; /*定时器每秒加1*/if(later!=NULL&&clock==later->starttime)/*如果将进入就绪队列的进程时间到达加入就绪队列*/ {l=later;l1=head;later=later->next;if(head==NULL){head=l;head->next=NULL;}else{while(l1!=NULL&&l1->priority<=l->priority){l2=l1;l1=l1->next;}if(l1==head){l->next=head;head=l;}else{l2->next=l;l->next=l1;}}}flag=0;printf("\n%3d秒时间片第%d秒 ",clock,j);q=head1;if(head1->needtime>head1->cputime) /*以运行时间和优先权都加1*/ {head1->cputime++;head1->priority++;while(q) /*运行队列不为零输出其信息*/ {if(q==head1)printf("%s\t%d\t\t%d\t\t%d\t%d\n",q->PID,q->needtime,q->cputime,q->pr iority,q->state);elseprintf("\t\t %s\t%d\t\t%d\t\t%d\t%d\n",q->PID,q->needtime,q->cputim e,q->priority,q->state);q=q->next;}}if(head1->needtime==head1->cputime)/*运行完成将其放入over为头指针的链表中*/ {head1->state=3;head1->overtime=clock;if(over==NULL){over=head1;head1=head1->next;over->next=NULL;}elseif(over!=NULL&&head1!=NULL){p1=head1->next;p0=over;over=head1;over->next=p0;head1=p1;}flag=1;}if(flag==1) break;}if(flag==1) /*有进程结束的情况*/{if(head!=NULL) /*就绪队列不为零将优先权最高的放入运行链表中*/ {q1=head;head=head->next;q2=head1;while(q2!=NULL&&q2->priority<=q1->priority){q3=q2;q2=q2->next;}if(q2==head1){q1->next=head1;head1=q1;}else{q3->next=q1;q1->next=q2;}}}else /*无进程结束的情况,寻找优先权最高的运行*/{head1->state=1;q1=head1;head1=head1->next;q2=head1;while(q2!=NULL&&q2->priority<=q1->priority){q3=q2;q2=q2->next;}if(q2==head1){q1->next=head1;head1=q1;}else{q3->next=q1;q1->next=q2;}}}}printf("cpu结束运行!\n");printf("是否输出所有结束的进程:1是2不是--");scanf("%d",&choo);if(choo==1) /*输出所有完成运行的进程*/{printf("开始时间:%s\n",now);printf("进程名\t要求运行时间\t进入就绪队列的时间\t运行完成的时间\n");while(over!=NULL){printf("%s\t%d\t\t%d\t\t\t%d\n",over->PID,over->needtime,over->startt ime,over->overtime);over=over->next;}}}八运行输出结果初始化进程如右图显示现在的时间和所有就绪的进程输入时间片的总数和每个时间片的时间运行时显示的信息。
计算机操作系统进程调度实验报告
计算机操作系统进程调度实验报告实验报告:计算机操作系统进程调度1.实验背景与目的计算机操作系统是一种负责管理和协调计算机硬件和软件资源的系统。
进程调度作为操作系统的重要功能之一,主要负责决定哪些进程可以运行、何时运行以及运行多长时间等问题。
本实验旨在通过实践学习进程调度的原理和实现细节,加深对操作系统的理解。
2.实验原理与步骤(1)实验原理:进程调度的目标是充分利用计算机资源,提高系统的吞吐率和响应时间。
常用的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)等。
在本实验中,我们将实现时间片轮转调度算法,并对比不同算法的性能差异。
(2)实验步骤:1)设计进程数据结构:创建进程控制块(PCB)结构体,包含进程的标识符、到达时间、服务时间、剩余时间、等待时间等信息。
2)生成进程:根据指定的进程个数和服务时间范围,生成随机的进程并初始化进程控制块。
3)时间片轮转调度算法:根据时间片大小,按照轮转调度的方式进行进程调度。
4)性能评估:通过记录进程的等待时间和周转时间,比较不同调度算法的性能差异。
3.实验结果与分析通过实验我们生成了10个进程,并使用时间片大小为2进行轮转调度。
下表列出了各个进程的信息及调度结果。
进程到达时间服务时间剩余时间等待时间周转时间P108068P214004P3291310P4350115P542032P6570147P763063P8761714P981071P1093104从实验结果可以看出,时间片轮转调度算法相对公平地分配了CPU给各个进程,减少了等待时间和周转时间。
但是,对于长时间服务的进程,可能出现饥饿问题,即一些耗时较长的进程无法得到充分的CPU时间。
与时间片轮转算法相比,先来先服务(FCFS)算法对于短作业具有更好的响应时间,但可能导致长作业等待时间过长。
最短作业优先(SJF)算法能够最大化短作业的优先级,提高整体性能。
4.实验总结与体会本次实验通过实践了解了进程调度的原理与实现细节,加深了对操作系统的理解。
操作系统实验报告进程调度
操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。
其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。
实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。
实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。
在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。
实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。
在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。
2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。
在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。
3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。
在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。
实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。
在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。
因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。
结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。
同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。
操作系统调度算法实验报告
操作系统调度算法实验报告摘要:本篇实验报告旨在研究和分析不同的操作系统调度算法对系统性能的影响。
通过实验,我们对先来先服务调度算法、短作业优先调度算法和时间片轮转调度算法进行了比较和评估。
实验结果表明,不同的调度算法对系统响应时间、吞吐量和公平性等方面都有不同的影响。
一、引言操作系统的调度算法是管理计算机资源的关键部分之一。
调度算法的好坏直接影响着系统的性能和用户体验。
本实验旨在通过模拟不同的调度算法,评估其对系统的影响,以便选择最适合特定环境的调度算法。
二、实验方法本实验使用了一个模拟的操作系统调度器,通过调度器模拟不同的进程到达和执行过程。
我们选择了三种常见的调度算法进行比较和评估。
1. 先来先服务(First-Come, First-Served)调度算法先来先服务调度算法按照进程到达的先后顺序进行调度。
当一个进程到达后,它将占用处理器直到该进程执行完毕。
我们记录了每个进程的到达时间、执行时间和完成时间,并计算了系统的平均等待时间和平均周转时间。
2. 短作业优先(Shortest Job First)调度算法短作业优先调度算法按照进程执行时间的长短进行调度。
当一个进程到达后,系统会选择执行剩余执行时间最短的进程。
我们同样记录了每个进程的到达时间、执行时间和完成时间,并计算了系统的平均等待时间和平均周转时间。
3. 时间片轮转(Round Robin)调度算法时间片轮转调度算法将处理器时间分成若干个时间片,每个进程只能占用一个时间片。
当一个进程用完一个时间片后,它排到队列的末尾等待下一个时间片。
我们选择了不同的时间片长度,并观察了系统的响应时间和吞吐量。
三、实验结果与分析我们通过多组实验数据对不同的调度算法进行了评估。
以下是实验结果的分析:1. 先来先服务调度算法根据实验数据,我们发现先来先服务调度算法对长作业具有较高的等待时间和周转时间。
这是因为当一个长作业到达后,其他短作业需要等待该作业执行完毕才能获得处理器资源。
操作系统调度算法实验报告
操作系统调度算法实验报告
本实验旨在研究不同操作系统调度算法在实际应用中的表现和影响。
我们选择了三种常见的调度算法进行对比分析,分别是先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转(RR)。
1. 实验准备
在开始实验之前,我们首先搭建了一个简单的模拟环境,包括一个CPU和多个进程。
每个进程具有不同的执行时间,以便模拟不同情况
下的调度效果。
2. 先来先服务(FCFS)
先来先服务是最简单的调度算法之一,即根据进程到达的顺序依次
执行。
实验结果显示,FCFS算法适用于处理大量长作业,但当出现短
作业时会导致平均等待时间较长。
3. 最短作业优先(SJF)
最短作业优先算法会优先执行执行时间最短的进程,以减少平均等
待时间。
在我们的实验中,SJF算法表现出色,尤其在短作业较多的情
况下,能够显著提高系统的响应速度。
4. 时间片轮转(RR)
时间片轮转算法将CPU时间分配给每个进程,每个进程执行一个
时间片后轮转到下一个进程。
然而,RR算法可能导致上下文切换频繁,
影响系统效率。
在实验中,我们发现RR算法在处理多任务时效果较好,但在处理长时间任务时表现一般。
5. 实验总结
通过对三种调度算法的实验比较,我们可以看出不同算法在不同情
况下有着不同的优势和劣势。
在实际应用中,需要根据具体情况选择
合适的调度算法,以提高系统的性能和效率。
希望本实验能为操作系
统调度算法的研究提供一定的参考价值。
操作系统进程调度算法模拟实验报告
操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。
二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。
常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)、轮转法(Round Robin)和多级反馈队列调度(Multilevel Feedback Queue Scheduling)等。
1.先来先服务(FCFS)算法:按照进程到达的先后顺序进行调度,被调度的进程一直执行直到结束或主动阻塞。
2.最短作业优先(SJF)算法:按照进程需要的执行时间的短长程度进行调度,执行时间越短的进程越优先被调度。
3. 优先级调度(Priority Scheduling)算法:为每个进程分配一个优先级,按照优先级从高到低进行调度。
4. 轮转法(Round Robin)算法:将进程按照到达顺序排列成一个队列,每个进程被分配一个时间片(时间量度),当时间片结束时,将进程从队列头取出放置到队列尾。
5.多级反馈队列调度算法:将进程队列分为多个优先级队列,每个队列时间片大小依次递减。
当一个队列中的进程全部执行完毕或者发生阻塞时,将其转移到下一个优先级队列。
三、实验步骤与结果1.实验环境:- 操作系统:Windows 10- 编译器:gcc2.实验过程:(1)首先,设计一组测试数据,包括进程到达时间、需要的执行时间和优先级等参数。
(2)根据不同的调度算法编写相应的调度函数,实现对测试数据的调度操作。
(3)通过模拟实验,观察不同调度算法之间的区别,比较平均等待时间、完成时间和响应时间的差异。
(4)将实验过程和结果进行记录整理,撰写实验报告。
3.实验结果:这里列举了一组测试数据和不同调度算法的结果,以便对比分析:进程,到达时间,执行时间,优先------,----------,----------,-------P1,0,10,P2,1,1,P3,2,2,P4,3,1,P5,4,5,a.先来先服务(FCFS)算法:平均等待时间:3.8完成时间:15b.最短作业优先(SJF)算法:平均等待时间:1.6完成时间:11c. 优先级调度(Priority Scheduling)算法:平均等待时间:2.8完成时间:14d. 轮转法(Round Robin)算法:时间片大小:2平均等待时间:4.8完成时间:17e.多级反馈队列调度算法:第一级队列时间片大小:2第二级队列时间片大小:4平均等待时间:3.8完成时间:17四、实验总结通过上述的实验结果可以得出以下结论:1.在上述测试数据中,最短作业优先(SJF)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。
操作系统实验之处理机调度实验报告
操作系统实验之处理机调度实验报告一、实验目的处理机调度是操作系统中的核心功能之一,本次实验的主要目的是通过模拟不同的处理机调度算法,深入理解操作系统对处理机资源的分配和管理策略,比较不同调度算法的性能差异,并观察它们在不同负载情况下的表现。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 Python 38。
实验中使用了 Python 的相关库,如`numpy`、`matplotlib`等,用于数据生成、计算和图形绘制。
三、实验原理1、先来先服务(FCFS)调度算法先来先服务算法按照作业到达的先后顺序进行调度。
先到达的作业先被服务,直到完成或阻塞,然后再处理下一个到达的作业。
2、短作业优先(SJF)调度算法短作业优先算法选择预计运行时间最短的作业先执行。
这种算法可以有效地减少作业的平均等待时间,但可能导致长作业长时间等待。
3、时间片轮转(RR)调度算法时间片轮转算法将处理机的时间分成固定长度的时间片,每个作业轮流获得一个时间片的处理时间。
当时间片用完后,如果作业还未完成,则将其放入就绪队列的末尾等待下一轮调度。
4、优先级调度算法优先级调度算法为每个作业分配一个优先级,优先级高的作业先被执行。
优先级可以根据作业的性质、紧急程度等因素来确定。
四、实验内容与步骤1、数据生成首先,生成一组模拟的作业,包括作业的到达时间、预计运行时间和优先级等信息。
为了使实验结果更具代表性,生成了不同规模和特征的作业集合。
2、算法实现分别实现了先来先服务、短作业优先、时间片轮转和优先级调度这四种算法。
在实现过程中,严格按照算法的定义和规则进行处理机的分配和调度。
3、性能评估指标定义了以下性能评估指标来比较不同调度算法的效果:平均等待时间:作业在就绪队列中的等待时间的平均值。
平均周转时间:作业从到达系统到完成的时间间隔的平均值。
系统吞吐量:单位时间内完成的作业数量。
4、实验结果分析对每种调度算法进行多次实验,使用不同的作业集合,并记录相应的性能指标数据。
操作系统实验--处理机调度算法实现
当程序启动时,用户可以选择不同的调度算法。然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。判断进程容器中是否有新的进程可以加入就绪队列。
struct proc //定义进程结构体
{
char name[5];
int num;
int pri;
};
void main()//主函数
{ char ch;
struct proc pr[n];//声明结构体数组
int i,k,j;
int count=n;
for(i=0;i<n;i++)//输入5个进程
函数描述:
struct proc/*定义结构体内部包含进程的信息*/
{
char name[5]; /*定义进程名*/
int num; /*定义运行时间*/
int pri; /*定义优先权*/
};
Void main()/*主函数:掌控整个程序的运行过程,是程序的主体部分*/
struct proc pr[n];/*声明结构体数组*/
4.处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。
5.若要求运行时间为零,则将其状态置为“结束”,且退出队列。
6.运行所设计程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程
实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)
for(k=1;k<n;k++)
操作系统试验报告一处理机调度
实验课程名称:实验项目名称处理机调度 实验成绩实验者专业班级名且另IJ同组者实验日期年 月 日第一部分:实验分析与设计(可加页)一、 实验内容描述(问题域描述)实验目的:掌握处理机调度的相关内容,对进程调度算法有深入理解。
实验内容:模拟实现进程调度功能。
实验要求:1、任选一种高级语言实现;2、选择1-2种调度算法;3、能够输入进程的基本信息,如进程名、提交时间、预估运行时间等;4、根据选择的调度算法显示进程调度顺序;5、显示完成调度后每个进程的开始时间、完成时间呢、周转时间,带权周转时间;6、计算平均周转时间和平均带权周转时间。
二、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述) 数据结构:一个作业的描述结构: struct WORK {int num;//进程序号startTim;//开始时间 upTim;//提交时间 offTim;//结束时间 costTim;//耗费时间长度 Ti;//周转时间 Tr;//带权周转时间输出模块float floatfloat floatfloat float };功能说明:输入模块、输出模块:负责进程的输入及模拟结果的输出;处理机调度函数调用模块:选择调用算法完成进程调度;先入先出算法模拟模块、短进程优先算法模拟模块:实际完成模拟调度功能;相关时间计算模块:计算开始时间、结束时间,周转时间,带权周转时间。
三、主要仪器设备及耗材硬件:pc机;软件:windows2007旗舰版、VS 2010开发环境。
第二部分:实验调试与结果分析(可加页)一、实验源程序:# include <iostream>using namespace std;struct WORK{int num;//进程序号float startTim;//开始时间float upTimJ/提交时间float offTim;//结束时间float costTim;//耗费时间长度float Ti;〃周转时间float Tr;//带权周转时间};void FIFO(WORK *workspace,int workNum);void SJF(WORK *workspace,int workNum);void SUM(WORK *workspace,int workNum,float *T,float *W);int main(){int num;float upTim;float costTim;int workNum;cout<<"请输入需要被调度的作业的数目:"<<endl;cin>>workNum;WORK *workspace=new WORK[workNum];cout<<"请依次输入需要被调度的作业(输入格式:作业序号作业提交时间(用数字表示) 执行时间):"<<endl;int n=0;while(cin>>num>>upTim>>costTim && n<workNum){workspace[n].num=num;workspace[n].upTim=upTim;workspace[n].costTim=costTim;n++;}cin.clear();cin.sync();cout<<"作业序号\t作业提交时间\t执行时间):"<<endl;for(int i=0;i<workNum;i++) {cout<<workspace[i].num<<"\t\t"<<workspace[i].upTim<<"\t\t<<workspace[i].costTim<<endl;/****************** 选择算法,执行算法,结果输出*****************/int cho=0;float * T=new float[0],* W=new float[0];cout<<"请选择调度算法:"<<endl;cout<<0<<"--->FIFO\n"<<1<<"--->最短优先"<<endl;cin>>cho;switch(cho){case 0:FIFO(workspace,workNum);SUM(workspace,workNum,T,W);break;case 1:SJF(workspace,workNum);SUM(workspace,workNum,T,W);break;}cout<<"执行顺序"<<"\t"<<"提交时间"<<"\t"<<"执行时间"<<"\t"<<"开始时间"<<"\t"<<"结束时间"<<endl;for(int i=0;i<workNum;i++) {cout<<workspace[i].num<<"\t\t"<<workspace[i].upTim<<"\t\t"<<workspace[i].costTim <<"\t\t"<<workspace[i].startTim<<"\t\t"<<workspace[i].offTim<<endl;}cout<<"平均周转时间:"<<(*T)/workNum<<"\t 平均带权周转时间:"<<(*W)/workNum<<endl;system("PAUSE"); return 0;}void FIFO(WORK *workspace,int workNum)for(int i=0;i<workNum-1;i++) 〃按提交时间排序for(int j=0;j<workNum-1;j++)if(workspace[j].upTim>workspace[j+1].upTim) 〃大数沉底{WORK temp;temp=workspace[j+1];workspace[j+1]=workspace[j];workspace[j]=temp;}}void SJF(WORK *workspace,int workNum){float MinUptime=0;//最早的提交时间FIFO(workspace,workNum);//先按提交时间排序MinUptime=workspace[0].upTim+workspace[0].costTim;for(int i=0;i<workNum-1;i++) 〃按照最短的作业时间排序for(int j=1;j<workNum-1;j++){if(workspace[j].upTim<MinUptime&&workspace[j+1].upTim<MinUptime) {if(workspace[j].costTim>workspace[j+1].costTim) 〃提交时间大且耗时多的作业沉底{WORK temp;temp=workspace[j+1];workspace[j+1]=workspace[j]; workspace[j]=temp;}} else {MinUptime=workspace[j].upTim+workspace[j].costTim;//更新}}}void SUM(WORK *workspace,int workNum,float *T,float *W){*T=0;*W=0;for(int i=0;i<workNum;i++)//计算开始时间、结束时间,周转时间,带权周转时间{ if(i==0)//计算第一个作业{workspace[i].startTim=workspace[i].upTim;workspace[i].offTim=workspace[i].upTim+workspace[i].costTim;workspace[i].Ti=workspace[i].offTim-workspace[i].upTim;workspace[i].Tr=workspace[i].Ti/workspace[i].costTim;}else//计算第一个作业基础上的其他作业相关时间{if(workspace[i-1].offTim<workspace[i].upTim)workspace[i].startTim=workspace[i].upTim;elseworkspace[i].startTim=workspace[i-1].offTim;workspace[i].offTim=workspace[i].costTim+workspace[i].startTim; workspace[i].Ti=workspace[i].offTim-workspace[i].upTim; workspace[i].Tr=workspace[i].Ti/workspace[i].costTim; }*T+=workspace[i].Ti;//计算平均周转时间 *W+=workspace[i].Tr;//计算平均带权周转时间 } } 二、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)测试用例一结果:请依次前A 需要被洞度的作止:葡人格式;作出序号 执行时间M 1 10 2,眼糟翎要被调度的作业(输入格式:作业序号1 10 2作止提交升间1用道字表示)|2 10.2 1 1? 10a 4 0a 5 L 10a 5 0a 2■(此序]作业提父H J 闫 L 10Z 10.23 10.4k10.5青选择调度算法:0——>FIF0 i-—>最超优先 执行时间), 暨 1 0.5 0.3a 二顺序提交时间 执行时间开始时间结束时间1 10210 12,10.2i 12 13 卜 10.4 8.5 13 13.E 口 1Q.5 0.3平均周转时间.2.8 平均带权周转时间吗.26岛北旺京银继纨 -±3.513.8邛业序与 作北提交时、日h 1M 执行时间)।21«.2 13 10.4 0.5 MIB.E情选区调度算法,同——>FIF0 口一》最短优先 0.3执行顺序 提交时间1 10 执行时间 2开始时间10 结克时间 124IB.E 0.3 12 12.3 10.4 0.5 12.3 12.81M-21句周转时间:2.45平均带权周转时间:3.8512.JS13=8日数据细撷处理机调度废锚纵员或吐理挑洞庭模物n京葡a 需要神话后日作业的数诸输妻萼猫调康的作斗的豹目:2 1M-2 1 □ 10.4 0.5 4 10-5 0,3回作业提交时间(用数字表。
处理机调度实验报告
处理机调度实验报告处理机调度实验报告一、引言处理机调度是计算机操作系统中一个重要的概念,它涉及到如何合理地分配处理机资源以提高系统的运行效率。
本文将针对处理机调度进行实验,探讨不同调度算法对系统性能的影响。
二、实验目的本实验的目的是通过模拟不同的处理机调度算法,比较它们在不同负载下的性能表现,进而分析其优缺点,为实际操作系统的调度算法选择提供参考。
三、实验方法1. 实验环境本实验使用了一台配置较高的计算机作为实验环境,操作系统为Linux,处理器为Intel Core i7,内存为8GB。
2. 实验设置为了模拟不同的负载情况,我们使用了三个不同的测试程序:程序A、程序B和程序C。
程序A是一个计算密集型任务,程序B是一个I/O密集型任务,程序C是一个混合型任务。
3. 实验步骤首先,我们分别运行程序A、程序B和程序C,并记录它们的运行时间。
然后,我们使用不同的调度算法来调度这些任务,并记录它们的运行时间和系统资源利用率。
四、实验结果与分析1. 调度算法1:先来先服务(First-Come, First-Served,FCFS)FCFS算法按照任务到达的先后顺序进行调度,即先到先服务。
实验结果显示,在计算密集型任务下,FCFS算法表现较好,但在I/O密集型任务和混合型任务下,其性能明显下降。
这是因为在FCFS算法中,任务的执行顺序是固定的,无法根据任务的特性进行灵活调度。
2. 调度算法2:最短作业优先(Shortest Job First,SJF)SJF算法根据任务的执行时间进行调度,即执行时间最短的任务先执行。
实验结果显示,在计算密集型任务和混合型任务下,SJF算法表现较好,但在I/O密集型任务下,其性能较差。
这是因为在I/O密集型任务中,任务的执行时间不仅与计算量有关,还与I/O操作的耗时有关,因此SJF算法无法有效地进行调度。
3. 调度算法3:时间片轮转(Round Robin,RR)RR算法将处理机的运行时间划分为若干个时间片,每个任务在一个时间片内执行一定的时间,然后切换到下一个任务。
实验一 处理机调度实验报告
实验一处理机调度实验报告一、实验目的处理机调度是操作系统中的一个重要组成部分,其目的是合理地分配处理机资源,以提高系统的性能和效率。
本次实验的主要目的是通过模拟处理机调度算法,深入理解不同调度算法的工作原理和性能特点,并能够对它们进行比较和分析。
二、实验环境本次实验使用了以下软件和工具:1、操作系统:Windows 102、编程语言:Python3、开发环境:PyCharm三、实验内容1、先来先服务(FCFS)调度算法先来先服务调度算法按照作业或进程到达的先后顺序进行调度。
即先到达的作业或进程先得到处理机的服务。
2、短作业优先(SJF)调度算法短作业优先调度算法优先调度运行时间短的作业或进程。
在实现过程中,需要对作业或进程的运行时间进行预测或已知。
3、高响应比优先(HRRN)调度算法高响应比优先调度算法综合考虑作业或进程的等待时间和运行时间。
响应比的计算公式为:响应比=(等待时间+要求服务时间)/要求服务时间。
4、时间片轮转(RR)调度算法时间片轮转调度算法将处理机的时间分成固定大小的时间片,每个作业或进程在一个时间片内运行,当时间片用完后,切换到下一个作业或进程。
四、实验步骤1、设计数据结构为了表示作业或进程,设计了一个包含作业或进程 ID、到达时间、运行时间和等待时间等属性的数据结构。
2、实现调度算法分别实现了上述四种调度算法。
在实现过程中,根据算法的特点进行相应的处理和计算。
3、模拟调度过程创建一组作业或进程,并按照不同的调度算法进行调度。
在调度过程中,更新作业或进程的状态和相关时间参数。
4、计算性能指标计算了平均周转时间和平均带权周转时间等性能指标,用于评估不同调度算法的性能。
五、实验结果与分析1、先来先服务(FCFS)调度算法平均周转时间:通过计算所有作业或进程的周转时间之和除以作业或进程的数量,得到平均周转时间。
在 FCFS 算法中,由于按照到达顺序进行调度,可能会导致长作业或进程长时间占用处理机,从而使平均周转时间较长。
处理器调度实验报告
一、实验目的1. 理解处理器调度的基本概念和原理;2. 掌握常用的处理器调度算法,如先来先服务(FCFS)、短作业优先(SJF)、优先级调度等;3. 分析不同调度算法的性能指标,如平均周转时间、平均带权周转时间等;4. 通过实验,提高实际操作和编程能力。
二、实验原理处理器调度是操作系统中的一个重要组成部分,其主要任务是合理分配处理器资源,使系统中的多个进程高效、有序地运行。
常见的处理器调度算法有以下几种:1. 先来先服务(FCFS):按照进程到达就绪队列的顺序进行调度,先到先服务;2. 短作业优先(SJF):优先选择运行时间最短的进程执行;3. 优先级调度:根据进程的优先级进行调度,优先级高的进程先执行;4. 时间片轮转(RR):将每个进程分配一个时间片,按照时间片轮转的方式调度进程。
三、实验内容1. 实验环境:Windows操作系统,Python编程语言;2. 实验工具:Python编程环境,如PyCharm、Spyder等;3. 实验步骤:(1)设计一个进程类,包含进程名、到达时间、运行时间、优先级等属性;(2)编写调度算法,实现FCFS、SJF、优先级调度和时间片轮转算法;(3)模拟进程执行过程,记录各个进程的执行时间、等待时间、周转时间等性能指标;(4)分析不同调度算法的性能,比较其优劣。
四、实验结果与分析1. FCFS调度算法实验结果:平均周转时间为20,平均带权周转时间为1.25。
分析:FCFS调度算法简单易实现,但可能导致进程响应时间长,不利于实时性要求高的系统。
2. SJF调度算法实验结果:平均周转时间为16,平均带权周转时间为1.2。
分析:SJF调度算法可以缩短平均周转时间,提高系统性能,但可能使长作业长时间等待,影响公平性。
3. 优先级调度算法实验结果:平均周转时间为18,平均带权周转时间为1.3。
分析:优先级调度算法可以根据进程的优先级进行调度,提高系统响应速度,但可能导致低优先级进程长时间等待。
操作系统处理机调度实验报告word精品文档10页
处理机调度算法实验报告学号姓名时间专业班级实验题目:处理机调度算法一、实验目的在了解操作系统的基础上全面了解处理机调度算法的实现以及过程,详细了解处理机调度算法的机制,充分了解调度的过程及状态,采用优先数法进程调度算法来模拟演示进程调度二、实验内容与步骤:1. 了解进程的三种状态状态:ready、running、finish2.了解进程需要的CPU时间以时间片为单位确定3.编写一段程序#include <stdio.h>#include <stdlib.h>#define P_NUM 5#define P_TIME 50enum state{ready,execute,block,finish};struct pcbb{char name[4];int priority;int cputime;int needtime;int count;enum state process;struct pcbb *next;};typedef struct pcbb pcb;void display_menu(){printf("CHOOSE THE ALGORITHM:\n");printf("1 PRIORITY\n");printf("2 ROUNDROBIN\n");printf("3 EXIT\n");}pcb* get_process(){pcb *q;pcb *p;pcb *t;int i = 0;printf("input name and time\n");while (i < P_NUM){q=(pcb *)malloc(sizeof(pcb));scanf("%s",q->name);scanf("%d",&q->needtime);q->cputime = 0;q->priority = P_TIME - q->needtime;q->process = ready;q->next = NULL;if(i==0){p = q;t = q;}else{t->next = q;t = q;}i++;}return p;}void free_process(pcb *p){pcb *q;while(p!= NULL){q = p;p = p->next;free(q);}}void display(pcb *p){printf("name cputime needtime priority state\n");while(p){printf("%s",p->name);printf(" ");printf("%d",p->cputime);printf(" ");printf("%d",p->needtime);printf(" ");printf("%d",p->priority);printf(" ");switch(p->process){case ready:printf("ready\n");break;case execute:printf("execute\n"); break;case block:printf("block\n"); break;case finish:printf("finish\n"); break;}p = p->next;}}int process_finish(pcb *q){int b1 = 1;while(b1&&q){b1 = b1&&q->needtime==0;q = q->next;}return b1;}void cpuexe(pcb *q){pcb *t = q;int tp = 0;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;}if(t->needtime!=0){t->priority -=3;t->needtime --;t->process = execute;t->cputime++;}}void priority_cal(){pcb *p;p = get_process();int cpu = 0;while(!process_finish(p)){cpu++;printf("cputime:%d\n",cpu);cpuexe(p);display(p);sleep(2);}free_process(p);printf("All processes have finished\n"); }pcb *get_process_round(){pcb *q;pcb *p;pcb *t;int i = 0;printf("input name and time\n");while (i<P_NUM){q=(pcb *)malloc(sizeof(pcb));scanf("%s",q->name);scanf("%d",&q->needtime);q->cputime = 0;q->count = 0;q->process = ready;q->next = NULL;if(i==0){p = q;t = q;}else{t->next = q;t = q;}i++;}return p;}void cpu_round(pcb *q){if(q->needtime==1)q->cputime++;elseq->cputime +=2;q->needtime -=2;if(q->needtime<0){q->needtime = 0;}q->count++;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){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;}if(p->process == execute){p->process = ready; }p = p->next; }}void display_round(pcb *p){printf("name cputime needtime count state\n");while(p){printf("%s",p->name);printf(" ");printf("%d",p->cputime);printf(" ");printf("%d",p->needtime);printf(" ");printf("%d",p->count);printf(" ");switch(p->process){case ready:printf("ready\n");break;case execute:printf("execute\n"); break;case block:printf("block\n"); break;case finish:printf("finish\n"); break; }p = p->next; }}void round_cal(){pcb *p;pcb *r;p = get_process_round();int cpu = 0;r=p;while(!process_finish(p)){if(r->needtime==1)cpu+=1;elsecpu+=2;cpu_round(r);r = get_next(r,p);printf("cputime:%d\n",cpu);display_round(p);set_state(p);sleep(2);}free_process(p); }main(){display_menu();int k;scanf("%d",&k);switch(k){case 1:priority_cal();break;case 2:round_cal();break;case 3:break;default:printf("YOU HA VE NOT CHOOSE ANY ALGORITHM!\n");}}运行后结果如下:[root@rhel5hbzy ~]# gcc -o chuliji chuliji.c[root@rhel5hbzy ~]# ./mCHOOSE THE ALGORITHM:1 PRIORITY2 ROUNDROBIN3 EXIT1input name and timejing 2aaaa 8bbbb5ffff4ggg 6cputime:1name cputime needtime priority state jing- 1 1 45 execute aaaa* 0 8 42 ready bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 0 6 44 ready rtyucputime:2name cputime needtime priority state jing* 2 0 42 execute aaaa* 0 8 42 ready bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 0 6 44 ready 5cputime:3name cputime needtime priority state jing* 2 0 42 finish aaaa* 0 8 42 ready bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 1 5 41 execute 2cputime:4name cputime needtime priority state jing* 2 0 42 finish aaaa' 1 7 39 execute bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 1 5 41 readycputime:5name cputime needtime priority state jing* 2 0 42 finish aaaa' 1 7 39 ready bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 2 4 38 execute cputime:6name cputime needtime priority state jing* 2 0 42 finish aaaa$ 2 6 36 execute bbbb2 0 0 50 finish ffff2 0 0 50 finishggg 2 4 38 ready cputime:7name cputime needtime priority state jing* 2 0 42 finish aaaa$ 2 6 36 ready bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 3 3 35 execute cputime:8name cputime needtime priority state jing* 2 0 42 finish aaaa! 3 5 33 execute bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 3 3 35 ready cputime:9name cputime needtime priority state jing* 2 0 42 finish aaaa! 3 5 33 ready bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 4 2 32 execute cputime:10name cputime needtime priority state jing* 2 0 42 finish aaaa- 4 4 30 execute bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 4 2 32 ready cputime:11name cputime needtime priority state jing* 2 0 42 finish aaaa- 4 4 30 ready bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 5 1 29 execute cputime:12name cputime needtime priority state jing* 2 0 42 finish aaaa 5 3 27 execute bbbb2 0 0 50 finish ffff2 0 0 50 finish ggg 5 1 29 ready cputime:13name cputime needtime priority statejing* 2 0 42 finishaaaa 5 3 27 readybbbb2 0 0 50 finishffff2 0 0 50 finishggg 6 0 26 execute cputime:14name cputime needtime priority statejing* 2 0 42 finishaaaa 6 2 24 executebbbb2 0 0 50 finishffff2 0 0 50 finishggg 6 0 26 finish3cputime:15name cputime needtime priority statejing* 2 0 42 finishaaaa 7 1 21 executebbbb2 0 0 50 finishffff2 0 0 50 finishggg 6 0 26 finish cputime:16name cputime needtime priority statejing* 2 0 42 finishaaaa 8 0 18 executebbbb2 0 0 50 finishffff2 0 0 50 finishggg 6 0 26 finishAll processes have finished[root@rhel5hbzy ~]# rtyu2bash: rtyu2: command not found[root@rhel5hbzy ~]# 3bash: 3: command not found三、分析与体会多道程序设计中,通常是若干个进程同时处于就绪状态,必须依照某种策略来决定哪个进程优先占有处理机。
操作系统进程调度实验报告
操作系统进程调度实验报告操作系统进程调度实验报告引言:操作系统是计算机系统中的核心软件之一,负责管理计算机的硬件资源并提供用户与计算机硬件之间的接口。
进程调度作为操作系统的重要功能之一,负责决定哪个进程可以获得处理器的使用权,以及进程如何在处理器上运行。
本实验旨在通过设计和实现一个简单的进程调度算法,加深对操作系统进程调度原理的理解。
一、实验目的本实验的主要目的是通过编写代码模拟操作系统的进程调度过程,掌握进程调度算法的实现方法,深入理解不同调度算法的特点和适用场景。
二、实验环境本实验使用C语言进行编程实现,可在Linux或Windows系统下进行。
三、实验内容1. 进程调度算法的选择在本实验中,我们选择了最简单的先来先服务(FCFS)调度算法作为实现对象。
FCFS算法按照进程到达的先后顺序进行调度,即先到先服务。
这种调度算法的优点是简单易实现,但缺点是无法适应不同进程的执行时间差异,可能导致长作业效应。
2. 进程调度的数据结构在实现进程调度算法时,我们需要定义进程的数据结构。
一个进程通常包含进程ID、到达时间、执行时间等信息。
我们可以使用结构体来表示一个进程,例如:```struct Process {int pid; // 进程IDint arrival_time; // 到达时间int burst_time; // 执行时间};```3. 进程调度算法的实现在FCFS调度算法中,我们需要按照进程到达的先后顺序进行调度。
具体实现时,可以使用一个队列来保存待调度的进程,并按照到达时间的先后顺序将进程入队。
然后,按照队列中的顺序依次执行进程,直到所有进程执行完毕。
4. 实验结果分析通过实现FCFS调度算法,我们可以观察到进程调度的过程和结果。
可以通过输出每个进程的执行顺序、等待时间和周转时间等指标来分析调度算法的效果。
通过比较不同调度算法的指标,可以得出不同算法的优缺点。
四、实验步骤1. 定义进程的数据结构,包括进程ID、到达时间和执行时间等信息。
操作系统实验二处理机调度-实时调度算法EDF和RMS实验报告
实验报告
姓
名:
学号:日期:2011-1-10 实验
题
目:
实验二:处理机调度---实时调度算法EDF和RMS
实验目的:
深入理解处理机调度算法,了解硬实时概念,掌握周期性实时任务调度算法EDF(Earliest Deadline First)和RMS(Rate-Monotonic Scheduling)的可调度条件,并能在可调度的情况下给出具体调度结果。
实验内容:
在Linux环境中采用用户级线程模拟实现EDF和RMS两种实时调度算法。
给定一组实时任务,按照EDF算法和RMS算法分别判断是否可调度。
在可调度的情况下,创建一组用户级线程,分别代表各个实时任务,并按算法所确定的调度次序安排各个线程运行,运行时在终端上画出其Gantt图。
为避免图形绘制冲淡算法,Gantt图可用字符表示。
实验步骤:1.启动虚拟机,在Linux系统终端中找到代码
2.仔细阅读教材相关内容和实验指导书中实验准备;
3.将代码在Linux系统上编译并运行。
4.根据实验结果分析。
5.结束实验,退出保存。
实验结果:实验结果如实验指导书上所示。
EDF算法结果:
RMS算法结果:。
操作系统实验之处理机调度实验报告
1、开发工具
Clion for mac 2016,采用 cmake 编译。
2、主要源码
//先来先服务 void FCFS(List *p, int count) {
List temp; int i, j; //按照到达时间排序 for (i = 1; i < count; i++) {
min = 100; temp = p[k].Finish_time; for (j = 0; j < count; j++) {
if (p[j].order != 0 || temp - p[j].Arrival_time < 0) continue;
if (min > p[j].Service_time) {
max = 0;
temp = p[k].Finish_time; //找响应比最高任务 for (j = 0; j < count; j++) {
if (p[j].order != 0 || temp - p[j].Arrival_time <= 0) continue;
if (max < (temp - p[j].Arrival_time) / p[j].Service_time) {
if (temp > p[i].Arrival_time) {
temp = p[i].Arrival_time; k = i; } } //按照响应比大小设置优先级,以及相应参数 for (i = 0; i < count; i++) { p[k].order = ++flag; p[k].Start_time = temp; p[k].Wait_time = temp - p[k].Arrival_time; p[k].Finish_time = temp + p[k].Service_time; p[k].Turnover_time = p[k].Finish_time - p[k].Arrival_time; p[k].WeightedTurn_time = p[k].Turnover_time / p[k].Service_time;
处理机调度算法实验报告
实验二处理机调度算法(1)处理机调度的目的是什么?为提高内存利用率和系统吞吐量。
将那些暂时不能运行的进程调至外存,当内存不紧张时,将那些具备运行条件的就绪进程重新调入内存。
合理快速的处理计算机软件硬件资源,分配处理机,用以提高处理机的利用率及改善系统性能(吞吐量,响应时间)。
(2)处理机调度的算法有哪些,各自的优缺点是什么?①先来先服务算法:有利于长作业(进程),不利于短作业(进程);②短作业优先调度算法:有利于短作业(短进程),不利于长作业(长进程);③高优先权调度算法:静态缺点:可能导致低优先权进程长期得不到调度甚至饿死;动态:优先权随进程等待时间增加或执行而变④高响应比优先调度算法⑤基于时间片轮转调度算法:时间片太小,会频繁发生中断,系统开销增大时间片太大,响应进程慢。
⑥多级反馈队列调度算法:具有较好的性能,能很好满足各类型用户的需求。
1.内存中作业运行的序列:A、B、D、C2.A进入内存的时刻1,结束的时刻5B进入内存的时刻5,结束的时刻8D进入内存的时刻8,结束的时刻10C进入内存的时刻10,结束的时刻153.平均周转时间:61.内存中作业运行的序列:B、C、A、D2.B进入内存的时刻3,结束的时刻6C进入内存的时刻6,结束的时刻11A进入内存的时刻11,结束的时刻15D进入内存的时刻15,结束的时刻173.平均周转时间:8.75(4)画出处理机调度算法的程序流程图;(5)补全参考程序;void process(int currentTmp, int nextTmp){int j;int s=nextTmp-currentTmp;while(memoryNum>0 && s>=memory[0].needtime){totalTime=totalTime+memory[0].needtime;s=s-memory[0].needtime;printf("线程%c的开始时间是:%d,结束时间是:%f\n",memory[0].id,memory[0].cputime,totalTime+1);allTime+=totalTime+1;memoryNum--;for(j = 1; j<=memoryNum; j++)memory[j-1] = memory[j];if(waitNum>0 && s>0){memory[memoryNum] = wait[0];memoryNum++;waitNum--;for(j = 1; j<=waitNum; j++)wait[j-1] = wait[j];sort(memory,memoryNum, 'P');}}if(memoryNum>0 && s<memory[0].needtime){totalTime=totalTime+s;memory[0].needtime-=s;}}//选择排序算法,若key为'P'则按优先级大的排在数组首,否则为'N'则按所需时间进行短作业优先排序void sort(PCB *pcb,int count, char key){PCB *p;PCB mao;int i,j;if(key=='P'){for(i=0;i<count;i++){p=pcb;for(j=0;j<count-1-i;j++){if((p->priority)>((p+1)->priority)){mao=*p;*p=*(p+1);*(p+1)=mao;}p++;}}}else if(key=='N'){for(i=0;i<count;i++){p=pcb;for(j=0;j<count-1-i;j++){if((p->needtime)>((p+1)->needtime)){mao=*p;*p=*(p+1);*(p+1)=mao;}p++;}}}}(6)基于例题中的例子,分别运行两种处理机调度算法并将运行结果截图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void cpuexe(pcb *q){
pcb *t = q;
int tp = 0;
while(q){ //让t指向优先级最高的进程
if (q->process!=finish){
q->process = ready;
if(q->needtime==0){
q->process = finish;
}
if(r->needtime==1)
cpu+=1;
else
cpu+=2; //时间片长度是2
cpu_round(r);
r = get_next(r,p); //获得下一个需要执行的进程
printf("cputime:%d\n",cpu);
display_round(p); //每调度一次就显示次
set_state(p);
display(p); //每调度一次就显示次
sleep(2);
}
free_process(p); //释放所有进程
printf("All processes have finished\n");
}
pcb *get_process_round(){
pcb *q;
pcb *p; //头指针
pcb *t; //尾指针
3)优先级调度的基本思想是,把当前处于就绪队列中优先级最高的进程投入运行,而不管各进程的下一个CPU周期的长短和其他因素。
具体步骤:
分析问题,提出解决问题的算法
编制程序
程序调试
记录实验结果,以及思考是否能够改善算法
程序及运行结果:
#include <stdio.h>
#include <stdlib.h>
操作系统实验报告
学号
姓名
时间
2011年12月16日
专业
网络工程
班级
5班
实验题目:处理机调度
实验目的:
(1)通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,进一步掌握进程调度的概念和算法,加深对处理机分配的理解。
(2)了解Linux中进程(线程)的调度机制。
(3)学习使用Linux中进程(线程)调度算法,掌握相应的与调度有关的函数。
#define P_NUM 5
#define P_TIME 50
enum state{
ready,
execute,
block,
finish
};
struct pcbb{
char name[4];
int priority; //数越大优先级越高
int cputime; //已占用CPU的时间
int needtime; //执行时间
sleep(2);
}
free_process(p); //释放所有进程
}
main(){
display_menu();
int k;
scanf("%d",&k);
switch(k){
case 1:priority_cal();break;
case 2:round_cal();break;
case 3:break;
printf("输入各进程的处理时间和优先级并以两个0为结束标志:\n");
while(scanf("%d %d",&n,&m)&&n&&m)
{
s=(linknode *)malloc(sizeof(linknode));
K++;
s->time=n;
s->priority=m;
s->averageTime=0;
{
int time;
int averageTime;
int priority;
struct link *next;
}linknode;
linknode *creat()
{
int n,m;
linknode *head,*r,*s;
head=r=(linknode *)malloc(sizeof(linknode));
case finish:printf("finish\n"); break;
}
p = p->next;
}
}
int process_finish(pcb *q){
int b1 = 1;
while(b1&&q){
b1 = b1&&q->needtime==0;
q = q->next;
}
return b1;
}
if(tp<q->priority&&q->process!=finish){
tp = q->priority;
t = q;
}
q = q->next;
}
if(t->needtime!=0){
t->priority -=3; //每执行一次优先级降低三个单位
t->needtime --;
t->process = execute;
default:printf("YOU HAVE NOT CHOOSE ANY ALGORITHM!\n");
}
}
优先级调度:
时间片轮转调度:
先来先服务调度算法及结果:
#include <stdio.h>
#include <stdlib.h>
int SUM=0,K=0;
typedef struct link
}
main()
{
linknode *head;
head=creat();
seekAverageTime(head);
print(head);
printf("平均处理时间为:%d\n",(SUM/K));
}
分析与体会:
通过做本实验,让我对进程或作业先来先服务、高优先权、按时间片轮转调度算法以及进程调度的概念和算法,有了更深入的认识!初步理解了操作系统对于作业处理的基本思想!对于时间片轮转法的处理要比优先级调度算法的理解要深。在实验的过程中遇到了很多困难,感谢同学们的帮助。
if(i==0){
p = q;
t = q;
}
else{
t->next = q;
t = q;
}
i++;
}
return p;
}
void free_process(pcb *p){
pcb *q;
while(p!= NULL){
q = p;
p = p->next;
free(q);
}
}
void display(pcb *p){
q->process = ready;
q->next = NULL;
if(i==0){
p = q;
t = q;
}
else{
t->next = q;
t = q;
}
i++;
}
return p;
}
void cpu_round(pcb *q){
if(q->needtime==1)
q->cputime++;
else
p=p->next;
SUM+=sum;
}
}
void print(linknode *head)
{
linknode *p;
p=head->next;
printf("各进程处理时间为:");
while(p)
{
printf("%-4d",p->averageTime);
p=p->next;
}
printf("\n");
int count;
enum state process;
struct pcbb *next;
};
typedef struct pcbb pcb;
void display_menu(){
printf("CHOOSE THE ALGORITHM:\n");
printf("1 PRIORITY\n");
printf("2 ROUNDROBIN\n");
printf("3 EXIT\n");
}
pcb* get_process(){
pcb *q;
pcb *p; //头指针
pcb *t; //尾指针
int i = 0;
printf("input name and time\n");
while (i < P_NUM){
printf("name cputime needtimeprioritystate\n");
while(p){
printf("%s",p->name);
printf("");
printf("%d",p->cputime);
printf("");
printf("%d",p->needtime);
printf("");
r->next=s;