时间片

进程调度算法总结

五迷三道 提交于 2020-03-24 03:43:52
FCFS(First come first serve)先来先服务算法: 简单的排队算法,维护一个队列,后来的只能排在队尾等待。 非抢占。 缺点:不够智能,对于cpu密集型进程不友好,比如:一个只需要1ms运行时间的cpu密集型进程,但是之前有一个要读5s的io密集型进程。那么即使那个cpu密集型进程只需要运行1ms,但是必须等待足足5s才能运行! SJF(Shortest job first)最短作业优先: 这种算法假设我们可以预测每个进程需要运行的时间。比如有5个进程,分别运行时间是:1,3,2,5,1。 这个算法顾名思义,先取需要最短运行时间的进程来运行,所以执行顺序就是:1,1,2,3,5。其实就是算法里的贪心法。 SJF调度是最优调度(贪心法),但问题是怎么预测运行时间呢?所以其实这个算法只能作为比较,无法真正实现。 非抢占。 SJF算法还有一个变种:最短剩余时间优先。是选择剩余运行时间最少的进程来调度,所以这个算法是 抢占的 。 RR(Round robin)轮转调度: 每个进程被分配一个时间片,一般为20~50ms。每个进程只能最多使用一个时间片的时间,如果没用完时间片就运行完毕,那么可以直接调度下一个进程;如果用完了时间片还没运行完毕,系统会把该进程重新放到队尾。 时间片的选择是有要求的,因为在切换进程的时候要进行上下文切换。如果上下文切换的时间不比一个时间片小多少

操作系统中常见算法汇总

不问归期 提交于 2020-03-08 16:07:54
一、常见作业调度(高级调度)算法 1、先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业。这种调度算法的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多。 2、短作业优先调度算法(SPF): 就是优先调度并处理短作业,所谓短是指作业的运行时间短。而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值。 3、最高响应比优先算法(HRN):FCFS可能造成短作业用户不满,SPF可能使得长作业用户不满,于是提出HRN,选择响应比最高的作业运行。响应比=1+作业等待时间/作业处理时间。 基本概念: 作业周转时间(Ti)=完成时间(Tei)-提交时间(Tsi) 作业平均周转时间(T)=周转时间/作业个数 作业带权周转时间(Wi)=周转时间/运行时间 响应比=(等待时间+运行时间)/运行时间 4.基于优先数调度算法(HPF):每一个作业规定一个表示该作业优先级别的整数,当需要将新的作业由输入井调入内存处理时,优先选择优先数最高的作业。 5.均衡调度算法,即多级队列调度算法。 二、常见进程调度(低级调度)算法 1、先进先出算法(FIFO):按照进程进入就绪队列的先后次序来选择。即每当进入进程调度

进程-线程-多线程-异步

蹲街弑〆低调 提交于 2020-03-01 06:58:07
进程-线程-多线程-异步 一、多线程的本质 1、并发多线程的启动、结束顺序 a、如何控制多线程的调用顺序 b、阻塞主线程等待子线程 二、异步操作的本质 三、线程 1、Thread 2、ThreadPool 3、Task 4、TaskFactory 5、Parallel 6、async await 语法糖 四、异常处理 五、线程取消 六、线程安全 一、多线程的本质 cpu的计算速度太快了导致硬件跟不上,就是木桶原理(盛水多少取决于最短板)。 cpu的计算能力很强,所以cpu可以分“时间片”,一个cpu可以分N+个时间片,每个时间片上跑一个线程(代码流)。cpu按顺序执行时间片,因为cpu太强,线程切换的太快,导致人感觉不出执行的卡顿,感觉上是多线程并发的。 微观角度:一个核同一时刻只能执行一个线程; 宏观角度: 是多线程并发的。 cpu分时间片执行线程,线程所需资源的不同会导致有 上下文的切换 ,其实上下文的切换会有性能的损失,但因为cpu计算能力超过其它硬件太多,不损失也是浪费。 扩展:4核8线程—核是物理的核,这里的线程是指虚拟核(一个核虚拟出2个核)。 1、并发多线程的启动、结束顺序 并发线程的启动是无序。 执行相同代码的并发线程的运行时间也不相同,所以结束时间也不同。 a、如何控制多线程的调用顺序 可以用委托提供的BeginInvoke方法,它是异步线程方法,并支持回调函数

操作系统---时间片轮转

霸气de小男生 提交于 2020-02-29 09:07:38
#include<iostream> using namespace std; #include <string> #include<queue> static const int MaxNum=100; deque<char>item; int ArrivalTime[MaxNum]; int ServiceTime[MaxNum]; int PServiceTime[100];//还需要服务的时间 int FinishTime[MaxNum]; int WholeTime[MaxNum];//周转时间; double WeightWholeTime[MaxNum];//带权周转时间 bool Finished[MaxNum]; int n,q,insert=0,pass_time=0; /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ void get_run_time(){ //求周转时间; for(int i=0;i<n;i++) { WholeTime[i]=FinishTime[i]- ArrivalTime[i]; //周转时间=完成时间-到达时间; } //求带权周转时间 for(i=0;i<n;i++) { WeightWholeTime[i]

Sleep(0)的妙用

只愿长相守 提交于 2020-02-26 11:45:51
原文地址:https://blog.csdn.net/qiaoquan3/article/details/56281092/ Thread.Sleep(0) 表示挂起0毫秒,你可能觉得没作用,你要写Thread.Sleep(1000) 就有感觉了。似乎毫无意义。 MSDN的说明:指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。 Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下,让其他线程有机会优先执行。Thread.Sleep(0) 是你的线程暂时放弃cpu,也就是释放一些未用的时间片给其他线程或进程使用,就相当于一个让位动作。 [AppleScript] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 8 Thread th = new Thread ( new ThreadStart ( MainForm.StartSplash ) ) ; th.Priority = ThreadPriority.AboveNormal; th.Start ( ) ; Thread.Sleep ( 0 ) ; base.SetStyle ( ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint |

Linux O(1)调度器

血红的双手。 提交于 2020-02-24 04:59:43
前面我们学习了O(n)调度器的设计,以及它的核心算法。在这里复习下。 O(n)调度器核心: O(n)调度器采用一个runqueue运行队列来管理所有可运行的进程,在主调度schedule函数中会选择一个优先级最高,也就是时间片最大的进程来运行,同时也会对喜欢睡眠的进程做一些补偿,去增加此类进程的时间片。当runqueue运行队列中无进程可选择时,则会对系统中所有的进程进行一次重新计算时间片的操作,同时也会对剩余时间片的进程做一次补偿。 O(n)调度器的缺陷: 时间复杂度是O(n) SMP系统扩展不好,访问runqueue需要加锁 实时进程不能及时调度 CPU空转的现象存在 进程在各个CPU之间跳跃,性能影响 O(1)调度器的引入 基于O(n)调度器的种种问题,linux内核社区则在2.6内核版本引入了O(1)调度器,当然了引入的目的也正是要解决O(n)调度器面临的问题。我们这片文章以Linux2.6.2版本来学习,在Linux内核文档中有一篇关于O(1)调度器的目的,如何设计的,以及实现有一个详细的介绍:sched-design.txt文档,有兴趣的可以去阅读。 O(1)调度器的工作原理 系统中的runqueue是一个PER_CPU变量,也就是说每一个CPU维护这一个runqueue,这样在SMP系统就可以有效的避免多个CPU去访问同一个runqueue。

FreeRTOS——支持时间片

北慕城南 提交于 2020-02-19 13:42:51
所谓时间片就是同一个优先级任务下可以有多个任务,每个任务轮流的享有相同的CPU时间,享有CPU的时间我们叫做时间片。在RTOS中,最小的时间单位是一个tick,即 SysTick 的中断周期。对于FreeRTOS,时间片只能是一个tick。与其说FreeRTOS支持时间片,倒不如说他的时间片就是正常的任务调度。 一、原理分析 之 所 以 在 同 一 个 优 先 级 下 可 以 有 多 个 任 务 , 最 终 还 是 得 益 于taskRESET_READY_PRIORITY()和taskSELECT_HIGHEST_PRIORITY_TASK()这两个函函数的实现方法。接下来我们分析下这两个函数是如何在同一个优先级下有多个任务的时候起作用的。 系统在任务切换的时候总会从就绪列表中寻找优先级最高的任务来执行,寻找优先级最高的任务这个功能由taskSELECT_HIGHEST_PRIORITY_TASK()函数来实现,该函数在task.c 中定义。 taskSELECT_HIGHEST_PRIORITY_TASK ()函数 # define taskSELECT_HIGHEST_PRIORITY_TASK()\ {\ UBaseType_t uxTopPriority;\ /* 寻找就绪任务的最高优先级 */ \ ( 1 ) portGET_HIGHEST_PRIORITY (

什么是真正的实时操作系统(转)

余生颓废 提交于 2020-02-16 17:41:20
转载链接: https://blog.csdn.net/zhourui1982/article/details/5282361 做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN上好多同学们都对实时、嵌入式这些概念似懂非懂,毕竟如果不做类似的产品,平时接触的机会很少,即使做嵌入式产品开发,基本也是只管调用Platform team封装好的API。所以在此总结一下这些概念,加深自己的理解,同时也给新手入门,欢迎大家拍砖,争取写个连载,本文先总结一下实时的概念,什么是真正的实时操作系统? 1. 首先说一下实时的定义及要求: 参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。 http://www.faqs.org/faqs/realtime-computing/faq/ 一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows在CPU空闲时可以提供非常短的典型中断响应,但是

CLR via C# —— 线程

与世无争的帅哥 提交于 2020-02-12 11:06:02
线程的作用 早期的操作系统没有 "线程" 的概念, 例如16位的 Windows 就是一个不支持多线程的操作系统. 这样的系统有一个特征: 整个系统同时只运行着一个任务, 包含操作系统代码还有应用程序的代码. 这带来了一个问题: 如果当前运行的这个任务需要很长一段时间才能执行完成, 它就会阻止其它任务执行. 如果某个程序含有 bug , 程序进入了一个死循环, 用户只好重新启动电脑了. 这样的操作系统显然很不给力, 微软决定改进操作系统内核, 让它的健壮性, 可靠性, 扩展性以及安全性都要得到提高. 微软从1988年11月开始编写 Windows NT, 微软在设计这个系统内核的时候, 决定在一个进程中运行应用程序的每个实例, 进程则是应用程序的一个实例要使用的资源的集合. 每一个进程被赋予了一个虚拟地址空间, 确保一个进程无法访问另一个进程的代码和数据. 因为一个进程无法破坏另一个进程的代码和数据, 所以系统的健壮性提高了; 程序无法访问另一个应用程序的用户名, 密码等信息, 因此安全性提高了. 虽然数据无法被破坏, 而且更安全, 但如果一个应用程序进入无限循环, 机器只有1个 CPU 的话, CPU 就会执行无限循环, 系统仍然会停止响应. 微软修正这个问题的办法就是 "线程". 线程的职责是对 CPU 进行虚拟化 , Windows 为每个进程都提供了该进程专用的线程

操作系统知识点

无人久伴 提交于 2020-02-08 23:45:52
操作系统是什么 管理计算机硬件与软件资源的程序,是计算机系统的内核与基石 本质上是运行在计算机上的软件程序 为用户提供一个与系统交互的操作界面 分为内核与外壳,其中内核是能操作硬件的程序,而外壳则是围绕着内核的应用程序 进程调度算法 根据系统资源分配资源所规定的资源分配算法 先来先服务调度算法 FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。 不可剥夺算法。对长作业有利,对短作业不利。有利于CPU繁忙型作业,不利于I/O繁忙型作业 时间片轮转调度法 适用于分时系统 系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。 时间片的大小对系统性能影响很大。如果时间片过短,则处理机在进程间过于频繁切换,处理机的开销增大;若过长,则退化为先来先服务算法 短进程优先调度算法 从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。 非抢占策略。但是长作业不利,不能保证紧迫性作业(进程)被及时处理