吐血整理 | 肝翻 Linux 进程调度所有知识点

本文深入介绍了Linux进程调度的各个方面,包括进程分类、调度相关的数据结构如task_struct和runqueue、调度时刻的设置与执行、各种调度算法(O(n)、O(1)和CFS调度器)以及CFS调度器的调度周期和虚拟运行时间。此外,还详细阐述了选择下一个进程的策略和进程上下文切换的过程。通过对这些知识点的讲解,帮助读者理解Linux内核如何高效地调度进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面我们重点分析了如何通过 fork, vfork, pthread_create 去创建一个进程或者线程,以及后面说了它们共同调用 do_fork 的实现。现在已经知道一个进程是如何创建的,但是进程何时被执行,需要调度器来选择。所以这一节我们介绍下进程调度和进程切换的详情。

进程的分类

在 CPU 的角度看进程行为的话,可以分为两类:

  • CPU 消耗型:此类进程就是一直占用 CPU 计算,CPU 利用率很高

  • IO 消耗型:此类进程会涉及到 IO,需要和用户交互,比如键盘输入,占用 CPU 不是很高,只需要 CPU 的一部分计算,大多数时间是在等待 IO

CPU 消耗型进程需要高的吞吐率,IO 消耗型进程需要强的响应性,这两点都是调度器需要考虑的。

为了更快响应 IO 消耗型进程,内核提供了一个抢占(preempt)机制,使优先级更高的进程,去抢占优先级低的进程运行。内核用以下宏来选择内核是否打开抢占机制:

  • CONFIG_PREEMPT_NONE: 不打开抢占,主要是面向服务器。此配置下,CPU 在计算时,当输入键盘之后,因为没有抢占,可能需要一段时间等待键盘输入的进程才会被 CPU 调度。

  • CONFIG_PREEMPT : 打开抢占,一般多用于手机设备。此配置下,虽然会影响吞吐率,但可以及时响应用户的输入操作。

调度相关的数据结构

先来看几个相关的数据结构:

task_struc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值