常见操作系统调度算法研究(2)

轮转策略

轮转策略(Round-Robin)简称为RR,在RR里面,每个准备就绪的任务只能在有限的时间内运行,也就是说不管这个任务完成与否,都会切换任务到下一个。
由于它要频繁的切换队列,我们可以把准备就绪的队列视为FIFO队列,假设任务A需要30ms,cpu的时间切片为10ms,那么它执行到10ms时,cpu便会产生一个中断信号,此时任务A来到队尾,任务B接着上去。这样做看似雨露均沾,它的平均等待时间确实比较长的。假设使用4ms的时间片,A、B、C的任务时间分别为10ms,15ms,20ms,那么它在采用RR策略下的平均等待时间为(6+11+16)/3=11ms
一般来说CPU的调度时间小于切片时间,如果我们最关心的指标是操作系统的调度时间,那么使用RR显然不是一个明智的选择。

公平策略的得与失

RR策略是一种公平策略,使用任何一种公平策略的时候就要考虑到小任务不会被优先处理,这在某一种程度上是令人难受的,但这也是现实世界的哲学,没有什么算法是十全十美的,我们更多的是要结合使用场景来选择对当前场景最有利的算法。
优化了周转时间比如SJF,STCF优化了中转时间,但对响应时间不利
优化了响应时间比如RR优化了响应时间,但由于频繁切换任务浪费的时间,对周转时间不利。

多级反馈队列

多级反馈队列的出现主要是为了平衡周转时间与响应时间,这里涉及到一个MLFQ的概念,它是把所有待处理的任务都分成队列,然后给每个队列标上不同的优先级。
MLFQ(Multilevel Feedback Queue Scheduling)先处理优先级最高的队列,将优先级较低的队列放到后面处理,如果遇到两个优先级一样的队列就会采用轮询的方式来处理
在这里插入图片描述

比例分额

并不是我们所有的算法目的都是为了在周转时间与响应时间之间找到一个平衡点,有时候只需要保准CPU对每一个任务都有一波雨露均就可以了。用一个直接粗暴的方法,每隔一段时间随机抽取一个任务处理,这个被称作彩票处理方法,随机方法具有轻量的特性,它无需比较数据库中任务的大小,直接利用随机数抽取。
这里会用到步长调度算法。步长调度也很简单。系统中的每个工作都有自己的步长,这个值与票数值成反比。在上面的例子中,A、B、C这3个工作的票数分别是100、50和250,我们通过用一个大数分别除以他们的票数来获得每个进程的步长。比如用10000除以这些票数值,得到了3个进程的步长分别为100、200和40。我们称这个值为每个进程的步长(stride)。每次进程运行后,我们会让它的计数器 [称为行程(pass)值] 增加它的步长,记录它的总体进展。

多核处理器调度

初学者编写程序时,大多数情况下编写的程序都是单核调度的,增加了CPU的个数并没有对你这个程序运行有任何作用,为了解决这个问题不得不重写应用程序,让其采用多线程的方式执行。
程序第一次读取数据,花费时间比较长,读取之后你会把它放在缓存中,以防后续再有程序想要读取它, 这个叫做时间局限性;空间局限性是指,程序读取了这个地址的数据,它接下来很有可能读取这个地址周围地址的数据,这两种局部性存在于绝大多数系统,这只是在一个处理器的情况下,当有多个处理器的时候情况会变成怎样?

缓存一致性

存在这样一种情况,当程序A想要修改在内存上的一个数据,由于这个数据不在CPU的cache里面,我们便会首先访问内存并且修改数据,把数据位置从d转移到DDD假设这个时候,操作系统中断了这个任务的操作,这时候第二个任务也要来修改这个数据,那么它肯定在d处是找不到这个数据的,但是它不知道d处已经发生了变化,还会从d处读取一个过时的数据。
解决这个问题的方法是监控内存的访问,硬件可以保证获得正确的数据,并保证共享内存的唯一性。在基于总线的系统中,一种方式是使用总线窥探(bus snooping)[G83]。每个缓存都通过监听链接所有缓存和内存的总线,来发现内存访问。如果CPU发现对它放在缓存中的数据的更新,会作废(invalidate)本地副本(从缓存中移除),或更新(update)它(修改为新值)。

同步

在跨CPU访问数据的时候,会涉及到互斥原语,这里说几种CPU锁的结构

互斥锁

不管是互斥锁还是自旋锁,加锁的目的就是保证共享资源在任意时间里,只有一个线程访问,这样就可以避免多线程导致共享数据错乱的问题。
互斥锁,确保同一时间只有一个线程访问数据。对共享资源的访问,先对互斥量进行加锁,如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁

自旋锁

当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成 busy-waiting 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Apache Ignite优化Spark作业性能(第1部分)

快来看看他们是如何工作的! 本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 。 如果您对这篇文章感兴趣,请查看本书的其余部分,以获取更多有用的信息。 Apache Ignite提供了几种提高Spark作业性能的方法:Ignite RD…

centos8.2安装mysql_为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8为例

在本文中,我们将向你展示如何在CentOS 8操作系统上安装MySQL 8.0,可从默认的CentOS 8存储库中安装最新版本的MySQL数据库服务器8.0版,CentOS 8还提供了MariaDB 10.3,它是MySQL 5.7的直接替代品,但有一些限制&#xff0…

rust中的堆和栈

堆和栈定义: 在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构。假设给定栈 S(a0,a1,…,an-1),则称 a0 为栈底,an-1…

mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度

相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战。例如,你创建…

rust中函数 变量 控制结构

变量相关 不可变 let x可变 let nut x常量 const x:T value静态变量 static x:TT::new();可变的静态变量 static mut x:TT::new(); 可能要使用到lazy_static()变量函数体 fn x(a1;T1…) -T{} 如果函数没有返回值 那么返回值就会为unit结构体 struct S {…} 1.元组结构体 struc…

选择Java密码算法第1部分-散列

抽象 这是涵盖Java加密算法的三部分博客系列的第1部分。 本系列介绍如何实现以下目标: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥/私钥非对称加密 这第一篇文章详细介绍了如何实现SHA–512哈希。 让我们开始吧。 免责声明 这篇文章仅…

mysql order by date_Best practice question for MySQL: order by id or date?

问题This is kind of a noobish question, but its one that Ive never been given a straight answer on.Suppose I have a DB table with the following fields and values:| id | date_added | balance |------------------------------------| 1 | 2009-12-01 19:43:22 | 1…

坚实原则:单一责任原则

单一责任原则是首字母缩写词的第一原则。 “一个班级只有一个改变的理由。” 每个模块或类都应对软件提供的功能的单个部分负责,并且该责任应由类完全封装。 例如,想象一下导航软件的场景。 我们根据给定的方向(北,南&#xf…

rust的项目管理

cargo cargo是rust的包管理工具 创建的一个项目 cargo new expr编写完代码之后记得编译一下,然后运行 cargo build运行项目cargo run 当我们觉得项目编译起来太慢了的时候可以将项目编辑成release版本 cargo run --releasecrate 在 Rust 里,一个项目…

宋利兵 mysql_《MySQL 5.7 Replication新特性》分享之互动问题解答

分享主题《MySQL 5.7 Replication新特性》嘉宾介绍宋利兵,MySQL研发工程师。2009年加入MySQL全球研发团队,从事MySQL复制相关功能的开发。主题介绍主要分享在MySQL 5.7中,Replication(复制)相关的一些新特性,比如多源复制、增强半同步复制、并…

使用Eclipse Deeplearning4j构建简单的神经网络

神经网络导论 深度学习既包含深度神经网络又包含深度强化学习,这是机器学习的子集,而机器学习本身就是人工智能的子集。 广义上讲,深度神经网络执行机器感知,该机器感知从原始数据中提取重要特征,并对每个观察结果做出…

mysql 注入 绕过防火墙_绕过阿里云防火墙继续扫描探测和SQL注入

前言如今的互联网,WAF泛滥的年代,实在让我等脚本小子苦恼ing,尤其是阿里云服务器的自带防护,那不是一般的叫人牙疼,十个站8个站都是阿里云....最近遇到几个站都是阿里云的服务器,比如:泛微e-col…

坚实原则:依赖倒置原则

到目前为止,我们只研究了单一职责 , 打开/关闭 , liskov替换和接口隔离原则。 依赖倒置是我们要研究的最后一个原理之一。 该原则指出 答:高级模块不应依赖于低级模块。 两者都应依赖抽象。 B.抽象不应依赖细节。 细节应取决于…

python处理中文字符串_python字符串中的中文处理

LeetCode 374. Guess Number Higher or LowerWe are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...【HDU】1693 Eat the Treeshttp://acm.hdu.edu.cn/showproblem.php?pid1693 题意:nm的棋盘求简单回路(可以…

java创建类的三个步骤_3个简单步骤即可测试Java 8

java创建类的三个步骤即将发布的Java 8版本为Java开发人员带来了许多新功能,但是升级时始终存在代码破裂的风险。 我们都记得Java 7出厂时有一系列非常严重的错误 。 当然,我们所有人都可以帮助避免在Java 8中出现相同的问题。我今天要介绍的方法是使用…

mybatis嵌套查询和嵌套结果有什么区别_Java面试专题之九:Mybatis面试5个大概率被问到的问题...

1、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybati…

使用Pargon-neo进行5G sync相关的测试

前言 Paragon-neo是Calnex旗下的一款测试仪器,主要用于5G的高精度场景下的PTP与SyncE的测试,它可以提供高达100GbE的测试速度,可以用在ITU-T G.8273.2 C/D类边界时钟测试,符合O-RAN的O-DU和O-RU设备,以及设计和部署5G…

功能Java示例 第1部分–从命令式到声明式

函数式编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数。 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么? 在这个名为“ Functional Java by Example”的系列…

python怎样使用各个日期赤纬_python--日期操作

import datetimedatetime有几个常用类:date time datetime timedelta1. 今天日期时间(今天时间)>>> import datetime>>> now datetime.datetime.now()>>> print now2014-06-04 21:08:32.952591(今天日期)>>> print datetime…

常用的光电模块SFP、QSFP等解析

前言 学习记录 BNC 是用来接同轴电缆的接口,好处是降低了信号之间的相互干扰;主要市场是安防行业以及一些使用同轴电缆作为传输介质的令牌以太网。举个例子就是小时候的电视机后面经常能够看见这种线,BNC接头中间有一个凸起来的针&#xff…