linux进程/线程调度策略(SCHED_OTHER,SCHED_FIFO,SCHED_RR)

linux内核的三种 调度策略 :

  • SCHED_OTHER 分时调度策略,(默认的)
  • SCHED_FIFO实时调度策略,先到先服务
  • SCHED_RR实时调度策略,时间片轮转

实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。

SHCED_RR和SCHED_FIFO的不同:

当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。

SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有 更高优先级任务到达或自己放弃 。

如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。

相同点:

  • RR和FIFO都只用于实时任务。
  • 创建时优先级大于0(1-99)。
  • 按照可抢占优先级调度算法进行。
  • 就绪态的实时任务立即抢占非实时任务。

当所有任务都采用分时调度策略时(SCHED_OTHER): 
1.创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。 
2.将根据每个任务的nice值确定在cpu上的执行时间( counter )。 
3.如果没有等待资源,则将该任务加入到就绪队列中。 
4.调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。 
5.此时调度程序重复上面计算过程,转到第4步。 
6.当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。 
  
当所有任务都采用FIFO调度策略时(SCHED_FIFO): 
1.创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。 
2.如果没有等待资源,则将该任务加入到就绪队列中。 
3.调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用cpu, 该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。 
4.调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。 
5.如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。 
当所有任务都采用RR调度策略(SCHED_RR)时: 
1.创建任务时指定调度参数为RR, 并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。 
2.如果没有等待资源,则将该任务加入到就绪队列中。 
3.调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用cpu。 
4. 如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾 。重复步骤3。 
5.当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3。 
系统中既有分时调度,又有时间片轮转调度和先进先出调度: 
1.RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。 
2. 当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程 。 
3. RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的未知决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。

原文地址:https://www.cnblogs.com/S-ong/p/9248960.html

时间: 2024-10-15 11:13:02

linux进程/线程调度策略(SCHED_OTHER,SCHED_FIFO,SCHED_RR)的相关文章

11 Linux进程线程认识

进程: 资源分配的最小单位 程序的实例,就像类与对象. 程序已经执行到一定程度的数据结构的汇集. 线程: 大部分的开支由创建进程时花费掉,所以线程是轻量级的 程序执行的最小单位 进程的执行流体 CPU调度和分派的基本单位 共享进程的资源 独立运行 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径.线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗

linux 进程线程拓展

依次参考: 多线程和多进程的区别(小结) Linux内核源代码分析——fork()原理&多进程网络模型 Linux写时拷贝技术(copy-on-write) linux内核 do_fork 函数源代码浅析

Linux编程---线程

首先说一下线程的概念.其实就是运行在进程的上下文环境中的一个执行流.普通进程只有一条执行流,但是线程提供了多种执行的路径并行的局面. 同时,线程还分为核心级线程和用户级线程.主要区别在属于核内还是核外. 核心级线程,地位基本和进程相当,由内核调度.也就是说这种系统时间片是按线程来分配的.这种线程的好处就是可以适当的运用SMP,即针对多核CPU进行调度. 用户级线程,在用户态来调度.所以相对来说,切换的调度时间相对核心级线程来说要快不少.但是不能针对SMP进行调度. 对于现在的系统来说,纯粹的用户

Linux进程调度策略

linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略(先到先服务)3,SCHED_RR实时调度策略(时间片轮转) 实时进程将得到优先调用,实时进程根据实时优先级决定调度权值. 分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度. 任一个执行时间超过10ms或前两个执行时间超过10ms都会导致运行结果出现偏差,因为 cpu 的调度周期为

linux线程调度策略

目录 linux线程调度策略 linux线程调度策略 这是一篇关于线程调度的非常好的资料,翻译自shed 从Linux 2.6.23开始,默认的调度器为CFS,即"完全公平调度器"(Completely Fair Scheduler).CFS调度器取代了之前的"O(1)"调度器. Scheduling policies 内核模块使用调度器来决定下一个CPU时钟周期执行的线程.每个线程都包含一个调度策略以及一个静态的调度优先级sched_priority,调度器根据系

Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 前言 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来. 调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 进程的分类 linux把进程区分为实时进程和非实时进程

Linux进程管理 (篇外)内核线程简要介绍

关键词:kthread.irq.ksoftirqd.kworker.workqueues 在使用ps查看线程的时候,会有不少[...]名称的线程,这些有别于其它线程,都是内核线程. 其中多数内核线程从名称看,就知道其主要功能. 比如给中断线程化使用的irq内核线程,软中断使用的内核线程ksoftirqd,以及work使用的kworker内核线程. 本文首先概览一下Linux都有哪些内核线程,然后分析创建内核线程的API. 在介绍内核线程和普通线程都有哪些区别? 最后介绍主要内核线程(irq/ks

Linux下进程线程,Nignx与php-fpm的进程线程方式

1.进程与线程区别 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源. "进程——资源分配的最小单位,线程——程序执行的最小单位" 进程有独立的地

linux进程的地址空间,核心栈,用户栈,内核线程

linux进程的地址空间,核心栈,用户栈,内核线程 地址空间: 32位linux系统上,进程的地址空间为4G,包括1G的内核地址空间,和3G的用户地址空间. 内核栈: 进程控制块task_struct中保存了2个page大小的信息. 为什么每一个进程都是用各自的内核栈呢? 引用(http://hi.baidu.com/iruler/blog/item/0c3363f377ccc5c90a46e023.html)“ 假设某个进程通过系统调用运行在内核态(使用这个全局内核堆栈),此时如果被抢占,发生