探究linux进程调度方式:多样性与灵活性 (linux进程调度方式)

探究Linux进程调度方式:多样性与灵活性

操作系统作为计算机系统中最基础的软件,对于优化计算机资源的利用非常重要。进程调度作为操作系统功能之一,对于现代操作系统来说更是至关重要。Linux作为一款自由开源软件,以其稳定、可移植性等优势被广泛应用于各个领域。本文将探究Linux进程调度方式的多样性与灵活性。

1. Linux进程调度方法概述

进程调度即操作系统决定哪个进程可以占用处理器和执行运算。在Linux中,进程调度方法可以分为两种,一种是基于时间分片的轮转调度算法,另一种是基于进程优先级的实时调度算法。

轮转调度算法是最常见的一种进程调度方式,目前在Linux系统中尚属于最常用的调度算法之一。它按照时间片的大小时间片轮流分配给每个进程,在时间片到期之后,操作系统会暂停当前进程,然后调度另一个进程来执行。

实时调度算法则是优先级排序的方式,一般通过调节进程的优先级来控制进程占用CPU时间。实时调度算法有两类:一类是硬实时(Hard Real-time),另一类是软实时(Soft Real-time)。硬实时要求必须在规定的时间内完成任务并且一定的可靠性和精度。软实时则要求任务尽可能地快地完成,但不一定在规定的时间内完成。

2. 多样性与灵活性展示

在Linux系统中,除了传统的时间片轮转和实时调度算法之外,还有以下几种进程调度方式,其中的灵活性和多样性更是体现出Linux的优势。

(1) CFS调度算法

CFS全称Completely Fr Scheduler,中文名称是完全公平调度器。它是Linux内核中早期的全新调度器,主要针对多核环境下的轮流分派CPU资源问题,并将关注的对象从进程转向线程,因此它的最小调度单位是线程。该调度器有三个特点:

其一,基于时间片。时间切片会按照进程的优先级比例分配。

其二,进程调度优先级不算像其他调度器那般重要。调度器会试着维持速率将进程转移到不同的核心中。

其三,CFS 实现公平调度的机制是基于当前活动进程的虚拟运行时间比值。

(2) MCG调度算法

MCG全称Mixed-Criticality Guarantee,中文名称是混合型严格调度器,是Linux上面一种全新的实时调度器。这种调度器比普通实时调度器更加严格,它通过在硬实时区域中保持全严格实时保障来消除混杂型系统带来的难题。该调度器满足多个严格实时应用程序同时运行在一个系统中,但必须确保相互不干扰。

多单元调度架构是MCG调度器的重要特点。该调度机制在系统中有多个实时单位,并以不同的方式进行调度。

(3) NOVA调度算法

NOVA调度算法是一种使用优先级和均衡调度在单个线程上执行的实时多线程调度器,其设计目标是提高Linux并行执行的吞吐量。在NOVA调度器中,进程的调度是基于线程组,每个线程组都有一个优先级,并且线程组中的所有线程都有相同的优先级,这样可以简化调度器的实现。

(NOVA &) Multipath IO

NOVA(Network over VMware Architecture)算法基于线程组的调度,构造“hyper-thread”的调度机制,它有以下两个特点:

其一,NOVA调度器的最小调度单位是线程组,可以很好地避免线程间的竞争,提高调度效率。

其二,它可以根据CPU负载情况自适应地调整线程组的优先级和CPU占用量,以提高系统的整体性能和稳定性。

3.

Linux之所以能够成功,其灵活性和多样性必不可少。Linux对调度算法进行了优化,使得其具有更高的灵活性,多样性和适应性。同时,Linux也为不同的环境提供不同的调度算法,以确保适用性。Linux由于Modular(可模块化),Portability(可移植性),以及Open Source(开源)等特点,使得它在各个领域中受到追捧,成为不可替代的操作系统之一。

相关问题拓展阅读:

linux进程调度的三种策略是什么?

进程调度策略就是调度系统种哪一个进程来CPU运行。这种调度分2层考虑。 之一层,进程状态这个是更优先考虑的,也就是说优先级更高的。在linux中只有就绪态的进程才有可能会被调度选中然后占有CPU,其它状态的进程不可能占有的到CPU。下面是linux中进程的状态TASK_RUNNING:就绪状态,得到CPU就可以运行。

TASK_INTERRUPTIBLE:浅度睡眠,资源到位或者受到信号就会变成就绪态。

TASK_UNINTERRUPTIBLE:深度睡眠,资源到位就会进入就绪态,不响应信号。

TASK_ZOMBIE:僵死态,进程exit后。

TASK_STOPPED:暂停态,收到SIG_CONT信号进入就绪态。 第二层,其实真正在操作系统中的实现,就是所有就绪态进程链接成一个队列,进程调度时候只会考虑这个队列中的进程,对其它的进程不考虑,这就实现了之一层中的要求。接下来就是就绪队列内部各个进程的竞争了。 Linux采用3种不同的调度政策,SCHED_FIFO(下面简写成FIFO,先来先服务),SCHED_RR(简写成RR,时间片轮流),SCHED_OTHER(下面简写成OTHER)。这里大家就能看出一个问题,采用同等调度政策的进程之间自然有可比性,Linux3种调度政策并存,那么不同调度政策间的进程如何比较呢?可以说他们之间根本就没有可比性。其实在调度时候,调度只看一个指标,那就是各个进程所具有的权值,权值更大的且在可执行队列中排庆祥在最前面的就会被调度执行。而权值的计算才会设计到各方面因素,其中调度政策可以说在计算权值中,份量是最重的。 为什么Linux要这么干呢?这是由于事务的多样性决定的,进程有实时性进程和非实时性的进程2种,FIFO和RR是用来支持实时性进程的调度,我们看一下这3种政策下权值的计算公式就明白了:FIFO和RR计算公式,权值=1000+进程真正的运行时间OTHER计算公式,当时间片为0时,权值=0.当时间片不为0时候,权值=剩余时间片+20-nice,同时如果是内核线程有+1的小加分,这是因为内核线程无需用户空间的切换,所以给它加了一分,奖励他在进程切换时候开销小的功劳。时间片好理解,那么nice这个值,用过linux系统的人都知道晌差培,这是一个从unix下继承过来的概念,表示谦让度,是一个从20~-19的数,可以通过nice和renice指令来设置。从代码中也能看到值越小就越不会谦让他人。 从这里我们看出FIFO和RR至少有1000的基数,所以在有FIFO和RR调度政策进程存在时,OTHER进程是没有机会被调度的到的。从权值计算公式同时也能看出,FIFO先来先服务的调度政策满足了,但RR这个时间片轮流的调度如果按照这种权值计宴唯算是不能满足时间片轮流这一概念的。这里只是权值的计算,在调度时候对RR政策的进程特殊处理。 以上都是权值计算,下面看看真正的调度过程,首先是对RR政策进程的特殊处理,如果当前进程采用的RR政策,那么看他的时间片是否用完,用完了就踢到就绪队列尾部,同时恢复他的时间片。然后是便利整个就绪队列,找到之一个权值更大的进程来运行。 整体调度效果就是:如果有FIFO和RR政策的进程,就优先调度他们2个,他们之间看已执行时间长短决定胜负,而2种政策内部则遵守各自调度政策。而OTHER只有在前面2种不存在于就绪队列时候才有可能执行,他们实际也是轮流执行,但他们之间是靠剩余时间和NICE值来决定胜负。同时就绪队列中排在最前面的更优先考虑在同样权值情况下。

linux内核的三种主要调度策略:

1,SCHED_OTHER 分时调度策略,

2,SCHED_FIFO实时调度策略,先到先服务

3,SCHED_RR实时调度策略,时间片轮转

实时进程将得到优先调用,实时进程根据实时

优先级

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

SHCED_RR和SCHED_FIFO的不同:

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

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

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

相同点:

RR和FIFO都只用于实时任务。

创建时优先级大于0(1-99)。

按照可抢占优先级调度算法进行。

就绪态的实时任务立即抢占非实时任务。

所旅陵如有任务都采用linux分时调度策略时:

1,创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。

2,将根据每个任务的nice值确定在cpu上的执行时间(counter)。

3,如果没有等待资源,则将该任务加入到就绪队列中。

4,调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算权值(counter+20-nice)结果,选择计算结果更大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。

5,此时调度程序重复上面计算过程,转到第4步。

6,当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。

所有任务都采用FIFO时:

1,创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值更高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。

4,调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务

堆栈

中保存当前cpu

寄存器

的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。

5,如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。

所有任务都采用RR调度策略时:

1,创建任务时指定调度参数为RR,并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值更高的任务使用cpu。

4,如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步骤3。

5,当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3。

系统中既有分时调度,又有时间片轮转调度和先进先出调度:

1,RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。

2,当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。

3,RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列拆启中的未知决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。

Ingo Molnar-实时补丁

为了能并入主流内核,Ingo Molnar的实时补丁也采用了非常灵活的策略,它支持四种抢占模式:

1.No Forced Preemption (Server),这种模式等同于没有使能抢占选项的标准内核,主要适用于科学计算等服务器环境。

2.Voluntary Kernel Preemption (Desktop),这种模式使能了自愿抢占,但仍然失效抢占内核选项,它通过增加抢占点缩减了抢占延迟,因此适用于一些需要较好的响应性的环境,如桌面环境,当然这种好的响应性是以牺牲一些吞吐率为代价的。

3.Preemptible Kernel (Low-Latency Desktop),这种模式既包含了自愿抢占,又使能了可抢占内核选项,因此有很好的响应延迟,实际上在一定程度上已经达到了软实时性。它主要适用于桌面和一些

嵌入式系统

,但是吞吐率比模式2更低。

4.Complete Preemption (Real-Time),这种模式使能了所有实时功能,因此完全能够满足软实时需求,它适用于延迟要求为100微秒或稍低的实时系统。

实现实时是以牺牲系统的吞吐率为代价的,因此实时性越好,系统吞吐率就越低。

关于linux进程调度方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 探究linux进程调度方式:多样性与灵活性 (linux进程调度方式)