深入探讨Linux进程调度及IO调度机制 (linux 进程调度 io调度)

Linux操作系统作为开源操作系统,在服务器等领域具有很高的市场占有率。Linux为了保证其操作系统的稳定性和效率,采用了先进的进程调度和IO调度机制。本文将深入探讨Linux进程调度和IO调度的机制。

一、Linux进程调度机制

进程调度是Linux系统中至关重要的决策过程,主要是为了使不同的进程共享CPU资源,从而满足不同用户的需求。进程调度主要分为内核级调度和用户级调度两种,其中内核级调度是负责选取就绪进程并使其占用CPU的过程,用户级调度是进程自身的任务调度。内核级调度主要采用时间片轮转的算法对进程进行调度。

1. 时间片轮转调度

时间片轮转调度是最常见的进程调度算法之一,其基本思想是按照时间片轮流分配CPU时间给每个进程,保证所有进程以大致相同的时间获得CPU时间。当进程用完时间片后,该进程会被放入等待队列中,等待下一个时间片的到来。在Linux内核中,时间片通常设置为10ms,也就是说每个进程在10ms内都有机会获得CPU时间。

2. 多级反馈队列调度

多级反馈队列调度属于改进版的时间片轮转调度。其不同之处是队列不止一级,每个队列拥有不同的时间片,根据进程CPU时间的使用情况,动态调整进程在各个队列之间的位置。当进程的等待时间长时,则会被移到优先级较高的队列中。反之,则会被移到优先级较低的队列中。

3. 实时调度

实时调度是用于响应时间要求较高的任务的一种进程调度方式。其基本思想是将可用的CPU时间分配给优先级较高的进程。实时调度分为SCHED_FIFO和SCHED_RR两种类型。SCHED_FIFO采用先入先出的调度方式,即在进程队列中优先级更高的进程先被执行,并一直执行到其执行完毕或被抢占为止。而SCHED_RR采用轮流调度的方式,保证每个进程都有机会获得CPU时间,以防止某个进程无限制占用CPU时间。

二、Linux IO调度机制

IO调度机制是Linux中一种非常重要的调度分类。其主要作用是协助内核对块设备的IO请求进行调度,提高系统的IO性能。Linux操作系统主要采用了三种IO调度算法,它们分别是CFQ、NOOP和Deadline。

1. CFQ调度算法

CFQ调度算法是基于队列长度的调度算法。其对IO请求进行排序,使IO请求得到循序渐进的服务,以避免某部分请求的等待时间过长而影响整体效率。CFQ算法的主要特点是公平、可预测,适合用于支持多用户多任务的操作系统上。

2. NOOP调度算法

NOOP调度算法最早应用于阵列存储系统的IO请求调度中。其基本思想是尽可能地减少调度开销,以提高IO处理效率。如果IO请求达到时,其他IO请求会被缓冲到队列之中,先进先出地排队等待服务。

3. Deadline调度算法

Deadline调度算法是基于时间周期的调度算法。其主要思想是通过IO请求的截止时间来对IO请求进行调度,以避免产生延迟的IO请求对系统产生影响。如果IO请求的截止时间过长,则会被分配到更靠后的时间周期中。

Linux操作系统作为一个非常成熟,开源的操作系统,采用了先进的进程调度和IO调度机制来提供更加稳定和可靠的服务。进程调度主要采用时间片轮转,多级反馈队列和实时调度等算法。而IO调度主要采用CFQ、NOOP和Deadline等算法,以提高系统的IO性能。在实际使用时,可以根据实际需要,根据不同情况选择不同的进程调度和IO调度算法,以达到更好的系统性能表现。

相关问题拓展阅读:

linux进程、线程及调度算法(二)

执行一个 copy,但是只要任何修改,都造成分裂如,修改了chroot,写memory,mmap,sigaction 等。

p1 是一个 task_struct, p2 也是一个 task_struct. linux内核的调度器只认得task_struck (不管你是进程还是线程), 对其进行调度。

p2 的task_struck 被创建出来后,也有一份自己的资源。但是这些资源会短暂的与p1 相同。

进程是区分资源的单位,你的资源是我的资源,那从概念上将就不叫进程。

其他资源都好分配,唯一比较难的是内存资源的重新分配。

非常简单的程序,但是可以充分说明 COW。

结果:10 -> 20 -> 10

COW 是严重依赖于CPU中的MMU。CPU如果没有 MMU,fork 是不能工作的。

在没有mmu的CPU中,不可能执行COW 的,所以只有vfork

vfork与fork相比的不同

P2没有自己的 task_struct, 也就是说P1 的内存资源 就是 P2的内存资源。

结果 10,20,20

vfork:腔宽者

vfork 执行上述流程,P2也只是指向了P1的mm,那么将这个vfork 放大,其巧旅余的也全部clone,共同指向P1,那么就是线程的属性了。

phtread_create -> Clone()

P1 P2 在内核中都是 task_struct. 都可以被调度。共享资源可调度,即线程。

这就是线程为什么也叫做轻量级进程

不需要太纠结线程和进程的区别。

4651 : TGID

, 4653 tid 内核中 task_struct 真正的pid

linux 总是白发人 送 黑发人。如果父进程在子进程推出前挂掉了。那么子进程应该怎么办?

p3 -> init, p5 -> subreaper

每一个孤儿都会找最近的火葬场

可以设置进程的属性,将其变为subreaper,会像1号进程那样收养孤儿进程。

linux的进程睡眠依靠等待队列,这样的机制类似与涉及模式中的订阅与发布。

睡眠,分两种

每一个进程都是创建出来的,那么之一个进程是谁创建的呢?

init 进程是被linux的

0 进程

创建出来的。开机创建。

父进程就是 0 号进程,但在pstree,是看不到0进程的。因为0进程创建子进程后,就退化成了idle进程。

idle进程是 linux内核里,特殊调伍薯度类。

所有进程都睡眠停止

,则调度idle进程,进入到 wait for interrupte 等中断。此时 cpu及其省电,除非来一个中断,才能再次被唤醒。

唤醒后的任何进程,从调度的角度上说,都比idle进程地位高。idle是调度级别最更低的进程。

0 进程 一跑,则进入等中断。一旦其他进程被唤醒,就轮不到 0进程了。

所有进程都睡了,0就上来,则cpu需要进入省电模式

linux 进程调度 io调度的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 进程调度 io调度,深入探讨Linux进程调度及IO调度机制,linux进程、线程及调度算法(二)的信息别忘了在本站进行查找喔。


数据运维技术 » 深入探讨Linux进程调度及IO调度机制 (linux 进程调度 io调度)