导航:首页 > 编程系统 > linux内核schedule函数分析

linux内核schedule函数分析

发布时间:2025-02-20 10:51:29

① 一文解析linux进程的睡眠和唤醒

在Linux中,进程的睡眠与唤醒是一个关键概念。当进程执行完时间片后,Linux内核会通过调度器选择下一个进程,使之获取CPU控制权。此外,进程也可以主动通过调用`schele()`函数释放CPU控制权,使其他进程运行。当进程需要等待特定事件发生,如设备初始化完成或I/O操作结束时,它会进入睡眠状态,从运行队列移出,加入等待队列。

Linux中的进程睡眠有两种状态:可中断的睡眠与不可中断的睡眠。可中断的睡眠进程在满足特定条件时被唤醒,如硬件中断、系统资源释放或信号传递。而不可中断的睡眠状态较为少见,主要用于进程必须等待特定事件,直到事件发生而不会被中断。

Linux操作系统中,进程通常通过`schele()`函数进入睡眠状态。程序首先存储进程结构指针,然后使用`set_current_state()`将进程状态从执行状态改为睡眠状态。如果`schele()`被处于睡眠状态的进程调用,进程将从运行队列中移出。要唤醒睡眠中的进程,可以使用`wake_up_process()`函数,这将改变进程状态并将其加入运行队列,等待下一次调度。

然而,进程有时可能因竞争条件而进入无效唤醒状态,导致无限期睡眠。这个问题发生在进程检查条件后,状态未被改为睡眠状态之前。解决方法是将判断条件与状态更改合并为一个步骤,消除竞争条件,确保唤醒过程有效。

为了在Linux内核中避免无效唤醒,应使用特定的内核函数进行进程睡眠。例如,`DECLARE_WAITQUEUE()`用于创建等待队列的项,`add_wait_queue()`将进程加入等待队列并更改状态为可中断状态。然后,进程循环检查条件,如果条件满足,设置状态为运行状态并移出等待队列。若条件未满足,调用`schele()`使进程重新调度。这种设计确保进程在条件满足时能够及时退出睡眠状态,避免无效唤醒。

在Linux内核中,代码示例展示了如何通过合理设计避免无效唤醒。通过在检查条件之前设置进程状态为睡眠状态,确保即使在条件满足时进程也不会错误地进入睡眠,从而有效避免了无效唤醒问题。

原文作者:Linux内核那些事

参考资源:内核技术中文网 - 构建全国最权威的内核技术交流分享论坛

② 一文了解Linux内核延时机制

内核延时机制是Linux系统中实现时间延时的两种主要方式:忙等待与睡眠等待。忙等待适用于毫秒以内的精确延时,通过CPU占用循环来实现,适用于对延迟时间要求不甚精确的场景,能够充分利用CPU资源,提升系统吞吐性能。睡眠等待则适用于毫秒以上的长延时,将进程挂起并释放CPU资源,底层实现通过系统定时器和等待队列来完成。

内核提供了几个用于实现纳秒、微秒和毫秒级延时的函数,其原理实质上是忙等待。这些函数根据CPU频率执行一定次数的循环。为更直观地实现延迟,可以使用jiffies比较机制,通过比较当前jiffies与目标jiffies(即当前jiffies加上时间间隔的jiffies)来达到延时目的。

对于短延时,内核提供了sleep类、schele类、以及sleep_on类延时函数。sleep类函数使进程睡眠指定时间,受系统HZ和进程调度影响,msleep()、ssleep()不能被打断,而msleep_interruptible()可以被打断。schele类函数使用定时器原理实现进程睡眠,而sleep_on类函数则允许进程在等待队列上睡眠,当超时发生时,进程将被唤醒。

总结而言,内核延时机制通过忙等待与睡眠等待两种方式,提供了灵活多样的延时手段,满足不同场景的需求,同时兼顾了对系统资源的高效利用。

③ Linux-抢占式调度

主动调度机制在Linux中,是指进程在运行过程中,由于等待I/O操作或其他原因主动让出CPU。所有进程的调用最终都会通过__schele函数来实现。与此同时,Linux系统也采用了抢占式调度来管理进程执行时间。当一个进程执行时间过长时,系统会判断并决定切换到另一个进程,以确保系统资源的公平分配。衡量进程运行时间的依据是计算机内部的时钟周期,通过时钟中断通知操作系统检查是否到了需要抢占的时间点。

在Linux系统中,调度器主要通过scheler_tick函数来处理时钟事件。该函数首先获取当前CPU的运行队列,然后找到正在执行的进程的task_struct。接着,它调用这个task_struct的调度类的task_tick函数,处理时钟事件。对于普通进程,调度类通常为fair_sched_class,其处理时钟事件的函数为task_tick_fair。

在task_tick_fair函数中,首先会查找当前进程对应的调度实体sched_entity和cfs_rq队列,并调用entity_tick函数进行进一步处理。entity_tick函数更新当前进程的vruntime,并通过check_preempt_tick函数检查是否到了抢占的时间。如果当前进程被唤醒且优先级高于当前执行进程,就会触发抢占。唤醒任务会被添加到队列中,然后进行激活,其中调用check_preempt_curr函数检查是否应该进行抢占。

用户态和内核态的抢占时机对于进程调度至关重要。用户态的抢占时机通常发生在系统调用返回时,此时会调用schele函数进行调度。内核态的抢占时机一般发生在preempt_enable函数中,该函数会关闭抢占以执行特定操作,当再次开启时,就会提供内核态代码被抢占的机会。

整个进程调度体系复杂且关键,涵盖了主动调度、抢占式调度、时钟事件处理、调度类调用、实体处理以及各种抢占时机的管理。通过深入了解这些机制,可以更好地理解Linux操作系统中进程调度的原理和实现。

④ Linux进程调度的概述

在Linux中,进程的运行时间不可能超过分配给他们的时间片,他们采用的是抢占式多任务处理,所回以进程之间的挂起和继答续运行无需彼此之间的协作。
在一个如linux这样的多任务系统中,多个程序可能会竞争使用同一个资源,在这种情况下,我们认为,执行短期的突发性工作并暂停运行以等待输入的程序,要比持续占用处理器以进行计算或不断轮询系统以查看是否有输入到达的程序要更好。我们称表现好的程序为nice程序,而且在某种意义上,这个nice 是可以被计算出来的。操作系统根据进程的nice值来决定它的优先级,一个进程的nice值默认为0并将根据这个程序的表现不断变化。长期不间断运行的程序的优先级一般会比较低。

阅读全文

与linux内核schedule函数分析相关的资料

热点内容
手机切换软件重新运行程序 浏览:332
神庙逃亡代码 浏览:932
文件压缩到最小到多少 浏览:336
sb0060win10驱动 浏览:876
宽带拨号上网账号密码忘了 浏览:531
除夕哪个app烧钱最多 浏览:179
有什么app是中国用不了的 浏览:134
考大专证哪个网站好 浏览:667
迷你编程最新版本怎么获得皮肤 浏览:385
索尼影像数据库文件错误 浏览:890
看客影视手机版本 浏览:804
电脑里文件突然不见了 浏览:982
微信消息没提示设置都打开了 浏览:196
typecho教程 浏览:662
qq申诉英文网站如何修改代码 浏览:757
iphone4s8g升级ios9 浏览:177
js怎么设置打印横向边距 浏览:726
慧编程里的画笔用不了怎么办 浏览:19
第七次人口普查数据哪里看 浏览:126
plc编程mon是怎么缩小 浏览:633

友情链接