从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内核产生的主要内容,如果未能解决你的问题,请参考以下文章