
一篇文章全面了解Linux进程调度
进程调度是确保进程能有效工作的一个内核子系统,决定哪个进程可以投入运行,可以运行多长时间。进程和线程在创建到销毁的过程中,会经历创建、就绪、执行、阻塞、终止五种状态的转换。多任务操作系统可以分为非抢占式和抢占式两种,其中抢占式操作系统可以让多个进程处于阻塞或者睡眠状态,这些进程不会真正运行,直到等待的条件(例如键盘输入、网络数据到达、定时器)就绪。进程相关的数据结构主要包括task_struct,进程状态、pid和tgid、进程内核栈、进程标记、进程的父子、兄弟关系等。内核线程是直接由内核本身启动的进程,用于执行周期性的任务。调度器的实现基于周期性调度器函数和主调度器函数,其中周期性调度器函数负责管理内核中与整个系统和各个进程的调度相关的统计量,而主调度器函数则负责执行调度过程。Linux进程调度机制的历史经历了从Linux1.0到2.6的演变,引入了O(1)调度器和完全公平调度算法(CFS)。进程调度策略需要在响应时间和吞吐量之间寻求平衡,Linux更加倾向于优先调度I/O消耗型进程,以缩短响应时间。进程按优先级可分为硬实时进程、软实时进程、普通进程,Linux采用了两种不同的优先级范围:nice值和实时优先级。时间片是一个数值,用来表示进程被抢占前,能够持续运行的时间。调度器类是Linux以模块的方式提供的调度器,以便不同类型的进程可以选择不同的调度算法。目前Linux提供了以下调度器类:完全公平调度器类(CFS)、实时调度器类(RT)和Deadline调度器。完全公平调度类(CFS)使用红黑树来组织可运行进程队列,排序依据为虚拟运行时间vruntime。实时调度类(RT)按照POSIX标准的强制要求,除了“普通”进程之外,Linux还支持两种实时调度器类,分别是循环进程(SCHED_RR)和先进先出进程(SCHED_FIFO)。

任务调度器:从入门到放弃(二)
本文讨论了理想调度模型与实际工程实现之间的差异,分析了Linux调度器中的事件驱动机制及其带来的不确定性。文中介绍了任务调度器的两个关键指标:吞吐量(throughout)和调度精度(latency)。同时,针对big-little架构,探讨了如何界定任务的大小以及如何在不同核心之间分配任务以达到性能与功耗的平衡。文中还对比了两种负载量化模型:PELT和WALT,并讨论了它们在处理任务负载变化时的局限性。

任务调度器:从入门到放弃(一)
本文是关于Linux内核调度器的科普文章,作者XiaoGang通过内部项目复盘中的实际问题,引出了调度器的重要性和工作原理。文章主要内容包括: 1. 调度器的作用:CPU资源有限,但任务数量众多,调度器通过分时复用让用户感觉多个线程同时运行。 2. Linux的调度类:包括stop、deadline、realtime、fair和idle等,各有不同的优先级。 3. RT调度类与fair调度的区别:RT调度类按照优先级顺序选择任务,而fair调度类采用虚拟运行时间(virtual runtime)来决定任务的调度。 4. 调度器管理的任务:只有处于TASK_RUNNING状态的进程在调度器的管理范围内。 5. 比例调度的问题:通过大量低优先级线程可能占用较高资源配额。 6. cgroup的作用和问题:cgroup通过cpu.shares控制资源配额,解决比例调度问题,但同时也带来了一些新的挑战。 文章以实例和实验说明问题,深入浅出地解释了调度器的复杂机制。下周将更新续篇,继续探讨相关话题。

【深入内核】linux ftrace详解
Ftrace(Function Tracer)是Linux内核自带的轻量级跟踪框架,用于记录内核内部事件和函数调用,帮助开发者分析系统执行路径、时序瓶颈和异常行为。Ftrace支持多种trace类型,包括function、function_graph、blk等,可以通过静态插桩和动态插桩两种方式实现。Ftrace可以通过配置内核参数和挂载debugfs文件系统来使能,并通过trace目录下的文件进行操作和管理。常见的trace event包括sched_switch、sched_wakeup、power/suspend_resume等,可以用于调试和分析系统性能和延迟问题。

linux-dead-lock-detect-lockdep
本文主要介绍了死锁概念、AB-BA死锁的形成、Linux中的lockdep死锁检测模块及其使用实例。 摘要: 死锁是指多个进程因为长久等待已被其他进程占有的资源而陷入阻塞的状态。Linux中的lockdep模块可以检测死锁,它通过跟踪锁类之间的依赖关系来工作。文章介绍了死锁的概念,分析了AB-BA死锁的形成原因,并给出了lockdep的使用实例,说明了如何通过lockdep检测和修复死锁问题。

MTK平台模块加载顺序控制
一、文件位置 在讲述模块加载顺序控制前,我们需要了解一些基础知识点,也就是模块位置。 启动模式 存储 显示 拨号键盘 电池 PMIC 触摸屏 NFC/WLAN/蓝牙 传感器 相机 恢复 Y Y Y Y Y N N N N 充电 Y Y Y Y Y N N N N</

【深入内核】Linux 内核栈详解:你所需要知道的一切
这篇文章详细介绍了Linux内核栈的概念、重要性以及在使用过程中可能遇到的常见问题。以下是摘要总结: 文章首先解释了内核栈的定义及其在内核代码运行时的作用,强调每个线程都有一块独立的内核栈。在ARM64架构下,内核栈大小默认为16KB,不可扩展。内核栈中保存了函数调用链、局部变量、寄存器上下文等信息。 文章还探讨了内核栈的常见错误操作,如分配过大的数组或返回栈上变量的地址,可能导致栈溢出等问题。并对比了内核栈与用户栈的差异。 最后,文章提供了调试内核栈的方法和内核栈溢出的日志示例,给出了避免内核栈溢出的建议,包括避免在内核栈上分配大数组、使用kmalloc分配大缓冲区以及开启DEBUG_STACK_USAGE检测等。

设备树节点是如何转换成platform_device设备的呢?
0. 前言 其实本章想要描述的函数的功能和内存的关系并不大,但是在启动流程中,paging_init后,该函数unflatten_device_tree就会被执行。为了启动流程的完整性,也鉴于此函数也确实有必要花时间去介绍。 作为Linux BSP驱动工程师我们在适配驱动的流程里,可能就是配置DTS
如何下载以及编译ACK?
一、ACK代码下载 mkdir android-kernel && cd android-kernel repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH repo sync 如需查看可与之前的“repo

Linux级联中断控制器注册与中断处理
{% tip success %} 特别提醒:本文章所有涉及的代码均可在{% u linux-5.15 %}处查看源码。 {% endtip %} 一、内核中关于中断控制器的几个概念 在介绍中断控制器的注册前先介绍内核中关于中断控制器几个知识点: 1.1 IRQCHIP_DECLARE 用于实现中断