操作系统之进程调度——优先权法和轮转法(附上样例讲解)
操作系统之进程调度——优先权法和轮转法(附上样例讲解)
操作系统之银行家算法—详解流程及案例数据
操作系统之多线程编程—读者优先/写者优先详解
操作系统之存储管理——FIFO算法和LRU算法
操作系统之磁盘调度——SCAN实例讲解
要求
一、实验目的
多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。
二、实验内容
1.优先权法、轮转法
简化假设
1)进程为计算型的(无I/O)
2)进程状态:ready、running、finish
3)进程需要的CPU时间以时间片为单位确定
2.算法描述
1)优先权法——动态优先权
当前运行进程用完时间片后,其优先权减去一个常数。
2)轮转法
三、流程图
优先权:
轮转法:
分析
?想要完成操作系统算法第一步要弄清楚操作系统相关的专业术语。弄清各个算法的流程和目的要求。才能模拟出相关算法的过程。下面先附上实验的相关要求?
通过本次实验,深刻的理解了操作系统中线程资源的分配方式和进程的调度方式。操作系统实验重在理解每一个算法的意图和目的,那么就选择适当的数据结构模拟过程就可以完成相关算法了。
优先权算法:
- 所有线程的序列核心是围绕优先权的权值大小。并且该优先权的大小会动态的变化,那么我们选区以权值为排序准则的优先队列是处理该结构的最好方法。能够有效的节省空间,算法复杂度。
- 而优先权算法某个线程的结束标识是还需要的时间needtime。所以在随机选区线程的时候和输出状态的时候要判断该线程还需不需要资源。
- 至于状态还有一点很重要的是要即使转换。当进行下一个操作要即使转换上一个线程的状态和下一个线程的状态防止状态混淆。
轮转法:
- 轮转法强调先进先出的拉链式顺序,而不以其他的权值作为开始/调度的先后顺序,所以普通先进先出的普通队列是解决该算法的最好方法。
- . 轮转法和优先权法不一样的是优先权法每次只进一个线程只执行一次。而轮转法是进一个可以执行最多是该线程可轮转的次数/轮转值(可能在中间就完成线程的释放),所以在写程序的时候每次都要判断是否已经轮转。并且到最后还要判断还是否需要调度。如果需要,再抛入队尾。
代码
实现的代码(java):
import java.util.ArrayDeque;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;public class priority {static pcb pcb[];public static void main(String[] args) {// TODO 自动生成的方法存根System.out.println("创建线程数量:");Scanner sc=new Scanner(System.in);int n=sc.nextInt();pcb=new pcb[n];for(int i=0;i<n;i++){pcb[i]=new pcb(i+1,"ready");}System.out.println("是否采用优先权?Y/N");String s=sc.next();if(s.equals("Y")){priority();}else{lunzhuan();}//printstatus();}private static void lunzhuan() {Queue<pcb>q1=new ArrayDeque<>();for(int i=0;i<pcb.length;i++){int lunhzun=(int) (Math.random()*4)+1+(int)(Math.random()*2);//不能为0int needtime=(int)(Math.random()*8)+1;pcb[i].lunhzuan=lunhzun;pcb[i].needalltime=needtime; q1.add(pcb[i]);}while(!q1.isEmpty()){pcb team=q1.poll();int time=0;//占用cpu时间片树while(time<team.lunhzuan){if(team.needalltime<=0){break;}time++;team.needalltime-=1;team.status="running";printluzhuan();System.out.println();}if(team.needalltime<=0) {team.status="finish";}else{team.status="ready";q1.add(team);}}printluzhuan();}private static void printluzhuan() {for(int i=0;i<pcb.length;i++){System.out.println("threadid:"+pcb[i].id+" "+pcb[i].status+" needtime:"+pcb[i].needalltime+" lunzhuan:"+pcb[i].lunhzuan);} }private static void priority() {//优先权Queue<pcb>q1=new PriorityQueue<pcb>(com);for(int i=0;i<pcb.length;i++){int proty=(int) (Math.random()*15);int needtime=(int)(Math.random()*4)+1;pcb[i].proty=proty;pcb[i].needalltime=needtime;q1.add(pcb[i]);}
// for(int i=0;i<pcb.length;i++)
// {// q1.add(pcb[i]);
// }while(!q1.isEmpty()){pcb team=q1.poll();team.needalltime-=1;team.proty-=3;team.status="running";printstatus();System.out.println();if(team.needalltime>0){team.status="ready";q1.add(team); }elseteam.status="finish";}printstatus();}private static void printstatus() {// TODO 自动生成的方法存根for(int i=0;i<pcb.length;i++){System.out.println("threadid:"+pcb[i].id+" "+pcb[i].status+" needtime:"+pcb[i].needalltime+" priority:"+pcb[i].proty);} }static Comparator<pcb> com=new Comparator<pcb>() {@Overridepublic int compare(pcb o1, pcb o2) {// TODO 自动生成的方法存根return o2.proty-o1.proty;}}; static class pcb{ int id;//进程idString status;//进程状态int proty;int needalltime;//需要总时间int lunhzuan;//轮转时间树public pcb(int id, String status) {// TODO 自动生成的构造函数存根this.id=id;this.status=status;} }
}
数据打印
优先权
:
2:轮转法
:
声明:这只是本人的个人理解,如果又纰漏,还请大神指出!?
如果对后端、爬虫、数据结构算法
等感性趣欢迎关注我的个人公众号交流:bigsai
操作系统之进程调度——优先权法和轮转法(附上样例讲解)相关推荐
- 【操作系统】使用C语言实现轮转法进程调度(有代码)
代码见文章结束处 轮转法实现进程调度思想: 将CPU的处理时间分成固定大小的时间片 按照就绪队列中进程的顺序,调度各进程轮流使用CPU 每个进程执行一个时间片后,就释放CPU,排到就绪队列的末尾,等待 ...
- 操作系统-轮转法(时间片轮转法)
轮转法(时间片轮转法) 简介 在轮转算法中,系统根据先来先服务策略,将所有的就绪进程排成一个就绪队列.并可设置每隔一定的时间间隔即可产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给 ...
- 操作系统实验——进程调度 实验报告
(一) 实验目的 进程是操作系统中最基本.最重要的概念,进程调度又是操作系统的核心模块.本实验要求学生独立地用C 或 C++语言编写一个简单的进程管理程序,其主要部分是进程调度.调度算法可由学生自行选 ...
- c语言 进程调度 短作业,帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢!该怎么解决...
帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢! 帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢! ------解决方案-------------------- 完整的代码(C ...
- 操作系统实验--进程调度
一.实验名称 进程调度 二.实验内容 编写模拟程序实现FIFO算法,短作业优先调度算法和轮转法,比较他们的不同之处. 三.实验原理和设计思路 不同的调度算法,平均周转时间和平均带权周转时间有很大差别, ...
- R语言编写自定义函数计算R方、使用自助法Bootstrapping估计多元回归模型的R方的置信区间、可视化获得的boot对象、估计单个统计量的置信区间、分别使用分位数法和BCa法
R语言编写自定义函数计算R方.使用自助法Bootstrapping估计多元回归模型的R方的置信区间.可视化获得的boot对象.估计单个统计量的置信区间.分别使用分位数法和BCa法(Bootstrapp ...
- 基于倒谱法和线性预测法估计基音频率(MATLAB和Python)
基于倒谱法和线性预测法估计基音频率(MATLAB和Python) 倒谱法基音检测在python中实现 一帧信号的基音频率估计 wlen = 256 inc = 128 pitch = [] x1, F ...
- python中怎么比较两个列表的大小_python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法...
前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列.本文主要讲述python中经常用的三种排序算法,选择排序法 ...
- 容量法和库仑法的异同点_卡尔费休滴定仪容量法与库仑法有什么区别
卡尔费休滴定仪可分为体积法和库仑法两种方法,我们以前很少提到这两种方法,但每种方法的原理不同.他们之间有一定的区别.有什么区别?让我们知道. 一.卡尔费休滴定仪容量法的原理. 卡尔费休容量法测定水含量 ...
最新文章
- 转	Log4j.properties配置详解
- C++格式化输入输出
- HTML5 progress和meter控件
- PDF Reader
- 数据预处理(part2)--多个预测变量数据变换
- 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区
- 怎么重置unity界面_请问itween如何重置?
- Bzoj 3339: Rmq Problem Bzoj 3585: mex 莫队,树状数组,二分
- 计算机网线接口松动怎么办,家里宽带“罢工”怎么办?中国移动教你五步排障法...
- 5G牌照发放3周年:为啥现在5G不火了?
- 如何删除难卸载的软件
- 我的2014--菜鸟慢慢在长大
- 使用BAT脚本实现一键配置Mysql服务器和开启远程服务
- android全平台基于ffmpeg解码本地MP4视频推流到RTMP服务器
- 图片切换上一页 下一页
- 谷歌标签恢复_避免/从Google惩罚中恢复
- STM32 F105 USB CDC host
- IEEE754 浮点数的表示方法
- 用vscode开发autojs,输出窗口不显示任何输出结果
- [Chromium中文文档]Chrom{e,ium}{,OS}中的硬件视频加速
热门文章
- C++ Primer 5th笔记(chap 13 拷贝控制)综述
- 【Python小游戏】当当当当 万众瞩目得《滑雪大冒险》来啦~(附源码)
- django中序列化器字段参数、关联字段
- [architecture]-AMRV7和ARMV8中的一些细微差异
- X86汇编——字符串逆序输出
- angr学习笔记(3)
- My First Window构造过程,SendMessage同步,PostMessage异步
- ReadFile 和 补充CreateFile
- 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)
- Apache Log4j2 RCE 命令执行漏洞预警及修复方案