从linux内核产生

Posted

技术标签:

【中文标题】从linux内核产生【英文标题】:yielding from linux kernel 【发布时间】:2014-03-12 16:54:54 【问题描述】:

我在 Linux (3.4) 中有一个实时线程。在某些情况下,我希望它放弃对具有相同优先级的其他线程的控制,即使它还没有用完当前的时间片。我正在考虑使用以下代码:

if (condition) 
    resched_task();
    cond_resched();

但是,我在代码中没有看到其他人这样做,这让我觉得还有其他(更好的?)方法可以做到这一点。有标准的方法吗?

【问题讨论】:

【参考方案1】:

您可以使用sched_yield() 函数来生成剩余的时间片as discussed here。

sched_yield() 导致调用线程放弃 CPU。线程因其静态优先级被移到队列的末尾,然后一个新线程开始运行。

【讨论】:

谢谢。你不会知道 sched_yield() 和 yield() 的区别吧? @John 你在说什么 yield() 函数?我不知道有一个简单地称为yield(),对不起。 在core.c(5029行)中有一个函数叫做yield。在函数顶部有一个很大的警告:Do not ever use this function, there's a 99% chance you're doing it wrong....它最终调用了 sys_sched_yield(),这让我有点厌倦。 @John Ah,这看起来像是内核内部的东西。 sched_yield() 是一个 POSIX 标准的系统调用。我不是内核黑客,但我肯定会使用 POSIX 调用并尊重您在 core.c 中找到的警告:)【参考方案2】:

这个问题听起来像是在询问内核编程,但公认的答案是函数用户模式 ​​API sched_yield()。我认为这个问题的内核答案是 schedule()

【讨论】:

schedule() 如果时间片未到,则不会将您置于运行队列的后面,这意味着您最终会立即再次醒来。 yield() 确实将您推到后面,允许下一个进程运行。经过一些分析,我们发现yield() 实际上是正确的调用,尽管上面有注释。 (注意——这仅适用于 RR 运行队列) @John 你确定 schedule() 没有把它放在队列的末尾吗?那它的目的是什么。我们是否会放弃 cpu 以立即唤醒?

以上是关于从linux内核产生的主要内容,如果未能解决你的问题,请参考以下文章

《linux内核设计与实现》读书笔记第十八章

Linux命令 dmesg:分析内核产生的信息

Linux x86_64内核中断初始化

linux源码解析16- Linux内核常用锁机制总结

linux c编程:信号 sigprocmask和sigpending函数

Linux内核设计与实现——内核同步