实验三进程调度蔡凤武

合集下载

进程调度实验【实验报告】

进程调度实验【实验报告】

实验一进程调度实验专业:信息管理与信息系统学号:2014******姓名:陈*实验日期:2016年11月11日一、实验目的通过本实验,采用动态优先权优先的调度算法编写和调试一个简单的进程调度程序,加深理解了有关进程控制块、进程队列的概念,并体会了优先权调度算法的具体实施办法。

二、实验要求用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.三、实验方法内容1.算法设计思路(流程图)开始输入所有进程到一个链表中是否所有进程都已完成结束Yi = 1,m = 0在就绪队列中找到优先级最高的进程,用P1表示,state 设为R用P2指向链表第一个节点P2所指进程state = F ?NP2所指进程state = R ?NPriority – 2,CPUTime + 1,AllTime –1,YAllTime = 0?YNState 设为F ,m = 1CPUTime % StartBlock = 0 ?state 设为B ,m = 1YNP2所指进程state = B ?BolckTime - 1BlockTime = 0?State 设为 W YYN P2所指进程state = W ?NPriority + 1YNP2指向下一个节点P2已指向链表末尾?NYM = 1 ?i <= 2 ?i + 1YNNYNY2.算法中用到的数据结构(1)首先定义一个结构体,用以保存一个进程的各种信息,最后一个指针便于将所有进程形成一个链表typedef struct pcb{int id;int arriveTime; //到达时间int priority;int cpuTime;int allTime;int startBlock;int blockTime;char state;struct pcb *next;}PCB;(2)接着建立一个链表存储所有进程,以结构体PCB为节点(头节点为空节点,从第二个节点开始存储数据)。

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

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

华中师范大学计算机科学系《操作系统》实验报告实验题目:进程调度学生姓名:日期: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)优先级调度算法是根据进程的优先级来进行调度的,优先级高的进程先执行。

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

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

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

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

进程调度操作系统实验报告一、实验目的本次实验的主要目的是深入理解操作系统中进程调度的概念和原理,通过实际编程和模拟,观察不同调度算法对系统性能的影响,并掌握进程调度的实现方法。

二、实验环境操作系统:Windows 10编程语言:C++开发工具:Visual Studio 2019三、实验原理进程调度是操作系统的核心功能之一,它负责决定哪个进程在何时获得 CPU 资源进行执行。

常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度等。

先来先服务算法按照进程到达的先后顺序进行调度,先到达的进程先获得 CPU 执行。

这种算法简单直观,但可能导致短作业等待时间过长。

短作业优先算法优先调度执行时间短的进程,能有效减少平均等待时间,但可能导致长作业饥饿。

时间片轮转算法将 CPU 时间划分成固定大小的时间片,每个进程轮流获得一个时间片进行执行。

如果进程在时间片内未完成,则被放回就绪队列等待下一轮调度。

优先级调度根据进程的优先级来决定调度顺序,优先级高的进程先获得 CPU 资源。

四、实验步骤1、设计进程结构体定义进程的标识号(PID)、到达时间、服务时间、剩余时间、优先级等属性。

2、实现先来先服务算法按照进程到达的先后顺序将它们放入就绪队列。

从就绪队列中取出第一个进程进行调度执行,直到其完成。

3、实现短作业优先算法计算每个进程的剩余服务时间。

将进程按照剩余服务时间从小到大排序,放入就绪队列。

从就绪队列中取出剩余服务时间最短的进程进行调度执行。

4、实现时间片轮转算法设定时间片大小。

将进程放入就绪队列,按照先来先服务的原则依次分配时间片执行。

进程在时间片内未完成的,放回就绪队列末尾。

5、实现优先级调度算法为每个进程设置优先级。

将进程按照优先级从高到低排序,放入就绪队列。

从就绪队列中取出优先级最高的进程进行调度执行。

6、计算平均周转时间和平均带权周转时间周转时间=完成时间到达时间带权周转时间=周转时间/服务时间平均周转时间=总周转时间/进程数平均带权周转时间=总带权周转时间/进程数7、输出调度结果包括每个进程的调度顺序、开始时间、结束时间、周转时间、带权周转时间等。

计算机操作系统实验指导计算机进程控制与进程调度

计算机操作系统实验指导计算机进程控制与进程调度

第三章￿程控制与程调度《计算机操作系统实验指导》内容Linux程介绍Linux程控制函数介绍 实验三.一程地创建 Linux程调度实验三.二程地调度Linux程介绍Linux程(一)互程:由一个shell启动地程。

互程既可在前台运行,也可以在后台运行,前者称为前台程,后者称为后台程。

(二)批处理程:这种程与终端没有联系,是一个程系列,由多个程按照指定地方式执行。

(三)守护程(Daemon):运行在后台地一种特殊程,它在系统启动时启动,并在后台运行。

Linux PCBC结构:task_structpid t_pid; /* process identifier */long state; /* state of the process */unsigned int time_slice /* scheduling information */struct task_struct *parent; /* this process’s parent */struct list_head children; /* this process’s children */ struct files_struct *files; /* list of open files */struct mm_struct *mm; /* address space of this process ……Linux程状态运行态(TASK_RUNNING):程准备运行,或正在运行可断等待态(TASK_INTERRUPTIBLE):程等待特定可断等待态(TASK_UNINTERRUPTIBLE):程处于等待状态,但是此刻程是不可断地僵尸态(TASK_ZOMBIE):程已经停止运行,但在内存仍有结构(task_struct)停止态(TASK_STOPPED/ TASK_TRACED ):程暂停状态Linux三种资源拷贝方式ü享ü享同一资源,如虚存空间,文件等。

实验三进程调度蔡凤武

实验三进程调度蔡凤武

实验三进程调度实验目的1、理解有关进程控制块、进程队列的概念。

2、掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。

实验内容与基本要求1、设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。

2、建立进程就绪队列。

3、编制两种进程调度算法:优先权调度算法和时间片轮转调度算法。

实验报告内容一.优先权调度算法和时间片轮转调度算法原理。

对于优先权调度算法,其关键是在于是采用静态优先权还是动态优先权,以及如何确定进程的优先权。

静态优先权是在创建进程是确定的,并且规定它在进程的整个运行期间保持不变。

动态优先权要配合抢占调度方式使用,它是指在创建进程时所赋予的优先权,可以随着进程的推进而发生改变,以便获得更好的调度性能。

在就绪队列中等待调度的进程,可以随着等待时间的增加,其优先权也以某个速率增加。

因此,对于优先权初值很低的进程,在等待足够时间后,其优先权也可能升为最高,从而获得调度,占用处理器并执行。

对已时间片轮转调度算法,系统将所有的就绪进程按进路就绪队列的先后次序排列。

每次调度时把CPU分配给队首进程,让其执行一个时间片,当时间片用完,由计时器发出时钟中断,调度程序则暂停改程序的执行,使其退出处理器,并将它送人就绪队的末尾,等待下一轮调度执行。

然后,把cpu 分配给就绪队列中新的队首进程,同时让它执行一个时间片。

二.程序流程图。

三.程序及注释。

#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 50enum st {ready,execute,block,finish};//状态定义进程//struct pcb{char name[4];//进程名字//int priority;//进程优先权//int cputime;//CPU运行时间//int needtime;//进程运行需要的时间//int count;//进程执行次数//int round;//时间片轮转轮次//st process;//进程状态//pcb *next;};//定义进程//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));cin>>q->name;cin>>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;//输入模拟测试的进程名和执行所需的时间,初始设置可模拟5个进程的调度//}void display (pcb *p){cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"st"<<endl;while(p){cout<<p->name;cout<<" ";cout<<p->cputime;cout<<" ";cout<<p->needtime;cout<<" ";cout<<p->priority;cout<<" ";switch(p->process){case ready:cout<<"ready"<<endl;break;case execute:cout<<"execute"<<endl;break;case block:cout<<"block"<<endl;break;case finish:cout<<"finish"<<endl;break;}p=p->next;}}//显示模拟结果,包含进程名,cpu的时间。

实验进程调度的实验报告

实验进程调度的实验报告

一、实验目的1. 加深对进程概念和进程调度算法的理解。

2. 掌握进程调度算法的基本原理和实现方法。

3. 培养编程能力和系统分析能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 实现进程调度算法2. 创建进程控制块(PCB)3. 模拟进程调度过程四、实验原理进程调度是操作系统核心功能之一,负责将CPU分配给就绪队列中的进程。

常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转(RR)等。

1. 先来先服务(FCFS)算法:按照进程到达就绪队列的顺序进行调度。

2. 短作业优先(SJF)算法:优先调度运行时间最短的进程。

3. 优先级调度算法:根据进程的优先级进行调度,优先级高的进程优先执行。

4. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行,时间片结束后进行调度。

五、实验步骤1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、运行时间、优先级、状态等信息。

2. 创建进程队列,用于存储就绪队列、等待队列和完成队列。

3. 实现进程调度算法:a. FCFS算法:按照进程到达就绪队列的顺序进行调度。

b. SJF算法:优先调度运行时间最短的进程。

c. 优先级调度算法:根据进程的优先级进行调度。

d. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行。

4. 模拟进程调度过程:a. 初始化进程队列,将进程添加到就绪队列。

b. 循环执行调度算法,将CPU分配给就绪队列中的进程。

c. 更新进程状态,统计进程执行时间、等待时间等指标。

d. 当进程完成时,将其移至完成队列。

六、实验结果与分析1. FCFS算法:按照进程到达就绪队列的顺序进行调度,简单易实现,但可能导致短作业等待时间过长。

2. SJF算法:优先调度运行时间最短的进程,能提高系统吞吐量,但可能导致进程饥饿。

进程调度的实验总结

进程调度的实验总结

进程调度的实验总结咱就说进程调度这个事儿啊,你可别小看它,这就好比是一场精彩的大戏!在计算机的世界里,各个进程就像是舞台上的演员,都眼巴巴地等着上台表演呢!进程调度啊,就是那个决定谁先上台,谁后上台的导演。

它得公平公正地安排好每个进程的出场顺序,不能让某个进程一直霸占着舞台,也不能让其他进程等得花儿都谢了。

这要是安排不好,那可就乱套啦!你想想看,要是有个进程特别重要,比如说像正在播放的视频,那肯定得让它优先表演呀,不然画面卡顿了,咱不得着急上火嘛!可要是有个不那么重要的进程,比如后台自动更新啥的,那就可以让它先等等,别抢了重要进程的风头。

这就跟咱生活中排队一样,着急的人先办事儿,不着急的就往后靠靠。

但进程调度可比咱排队复杂多了,它得考虑好多因素呢!比如进程的优先级、等待时间、占用资源等等。

这就像是导演要考虑演员的演技、知名度、档期一样,可不能马虎。

有时候啊,进程调度就像是在走钢丝,得小心翼翼地保持平衡。

要是过于偏向某个进程,其他进程可不干啦,会闹脾气的哟!电脑可能就会变得慢吞吞的,或者干脆罢工给你看。

咱再打个比方,进程调度就像是交通警察,指挥着车辆有序通行。

要是警察乱指挥,那路上还不得堵成一锅粥啊!同样的道理,进程调度要是乱来,那计算机系统也得乱套。

而且啊,不同的操作系统有不同的进程调度算法呢,就像是不同的导演有不同的风格。

有的算法注重公平性,让每个进程都有机会上台;有的算法则更注重效率,让重要的进程赶紧表演完。

咱在使用电脑的时候,可能感觉不到进程调度在背后默默地工作,但它真的很重要啊!它就像是一个默默付出的幕后英雄,保障着我们的电脑能够顺畅运行。

所以啊,可别小瞧了这进程调度,它虽然看不见摸不着,但却起着至关重要的作用呢!它让我们的计算机世界变得有序、高效,就像一场精彩绝伦的演出,离不开导演的精心安排一样。

咱得感谢进程调度这个小能手,让我们能愉快地使用电脑呀!这就是我对进程调度的实验总结啦,是不是挺有意思的呀!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三进程调度蔡凤武进程调度实验目的1、理解有关进程控制块、进程队列的概念。

2、掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。

实验内容与基本要求1、设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。

2、建立进程就绪队列。

3、编制两种进程调度算法:优先权调度算法和时间片轮转调度算法。

实验报告内容一.优先权调度算法和时间片轮转调度算法原理。

对于优先权调度算法,其关键是在于是采用静态优先权还是动态优先权,以及如何确定进程的优先权。

静态优先权是在创建进程是确定的,并且规定它在进程的整个运行期间保持不变。

动态优先权要配合抢占调度方式使用,它是指在创建进程时所赋予的优先权,可以随着进程的推进而发生改变,以便获得更好的调度性能。

在就绪队列中等待调度的进程,可以随着等待时间的增加,其优先权也以某个速率增加。

因此,对于优先权初值很低的进程,在等待足够时间后,其优先权也可能升为最高,从而获得调度,占用处理器并执行。

对已时间片轮转调度算法,系统将所有的就绪进程按进路就绪队列的先后次序排列。

每次调度时把CPU 分配给队首进程,让其执行一个时间片,当时间片用完,由计时器发出时钟中断,调度程序则暂停改程序的执行,使其退出处理器,并将它送人就绪队的末尾,等待下一轮调度执行。

然后,把cpu分配给就绪队列中新的队首进程,同时让它执行一个时间片。

二.程序流程图。

结束就绪队列为空吗三.程序及注释。

#include <stdio、h>#include <dos、h>#include <stdlib、h>#include <conio、h>#include <iostream、h>#include<windows、h>#define P_NUM5#define P_TIME50 enum st{ ready, execute, block, finish};//状态定义进程//struct pcb{ char name[4];//进程名字// int priority;//进程优先权// int cputime;//CPU运行时间// int needtime;//进程运行需要的时间// int count;//进程执行次数// int round;//时间片轮转轮次// st process;//进程状态// pcb *next;};//定义进程//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)); cin>>q->name; cin>>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;//输入模拟测试的进程名和执行所需的时间,初始设置可模拟5个进程的调度//}void display (pcb *p){ cout<<"name"<<""<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<""<<"st"<<endl;while(p){ cout<<p->name;cout<<" ";cout<<p->cputime;cout<<" ";cout<<p->needtime;cout<<" ";cout<<p->priority;cout<<" ";switch(p->process){caseready:cout<<"ready"<<endl;break;caseexecute:cout<<"execute"<<endl;break; caseblock:cout<<"block"<<endl;break;casefinish:cout<<"finish"<<endl;break;}p=p->next;}}//显示模拟结果,包含进程名,cpu的时间。

运行所需时间以及优先级//int process_finish(pcb * q){int bl=1;while(bl&&q){bl=bl&&q->needtime==0;q=q->next;}return bl;//结束进程,即将队列中各进程的所需时间设置为零//}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++;}//选择某一个进程,给它分配cpu//}//计算进程优先级//voidpriority_cal(){pcb*p;system("cls");p=get_process();int cpu=0;system("cls");while(!process_finish(p)){cpu++;cout< <"cputime:"<<cpu<<endl;cpuexe(p);display(p);Sleep(2);}printf("All processes have finished,press any key to exit");getch();}void display_menu(){cout<<"CHOOSE THE ALGORITHM:"<<endl;cout<<"1 PRIORITY"<<endl;cout<<"2 ROUNDROBIN"<<endl;cout<<"3 EXIt"<<endl;}//显示调度算法菜单,可供用户选择优先权调度算法和时间片轮转调度算法//pcb *get_process_round(){pcb*q;pcb*t;pcb*p;inti=0;cout<<"input name andtime"<<endl;while(i<P_NUM){q=(structpcb*)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){p=q;t=q;}else{t->next=q;t=q;}i++;}return p;}//时间片轮转调度算法创建就绪进程队列//void cpu_round(pcb*q){q->cputime+=2;q->needtime-=2;if(q->needtime<0)q->needtime=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){t=head;while(t->next!=k&&t->process==finish){t=t->next;}}return t;}voidset_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){cout<<"NAME"<<""<<"cputime"<<" "<<"NEEDTIME"<<" "<<"count"<<""<<"ROUND"<<" "<<"STATE"<<endl;while(p){cout<<p->name;cout<<" ";cout<<p->cputime;cout<<" ";cout<<p->needtime;cout<<" ";cout<<p->count;cout<<" ";cout<<p->round;cout<<" ";switch(p->process){caseready:cout<<"ready"<<endl;break; caseexecute:cout<<"execute"<<endl;break;casefinish:cout<<"finish"<<endl;break;}p=p->next;}//时间片轮转调度算法输出调度信息//}voidround_cal(){pcb*p;pcb*r;system("cls");p=get_process_round ();intcpu=0;system("cls");r=p;while(!process_finish(p)){cpu+=2; cpu_round(r);r=get_next(r,p);cout<<"cpu"<<cpu<<endl;displ ay_round(p);set_state(p);Sleep(5);}}voidmain(){display_menu();int k;scanf("%d",&k);switch(k){case1:priority_cal();break; case2:round_cal();break;case3:break;display_menu();scanf( "%d",&k);}}四.结果分析本程序用两种方法对五个进程进行调度,每个进程可有三种状态,并假设初始状态为就绪状态。

相关文档
最新文档