2013-04-25 187 views
2

如果我有一个进程的所有线程都在不同的内核上运行,那么sched_yield会在这种情况下执行什么操作?放弃并立即发布?因为我看到的是sched_yield不会导致线程调用它,所以请等待任何循环,看起来这个调用甚至不会进入内核。sched_yield在这种情况下做什么?

回答

3

手册页说:

如果调用线程处于当时的最高优先级 列表中唯一的线程,它会继续呼叫后运行至SCHED_YIELD()。

所以,如果没有什么更重要的运行,该功能将基本上什么都不做。

+0

“所以如果没有什么更重要的运行,功能基本上什么都不会做。”但是它会做一个系统调用(然后从用户空间切换到内核),甚至不是? – MetallicPriest 2013-04-25 14:03:32

+0

是的,它仍然会执行系统调用,检查CPU调度程序的等待列表,并返回而不等待是否没有其他正在等待的线程。 – zakinster 2013-04-25 14:07:45

+0

嗯,我现在没有Linux来测试,所以也许你可以创建一个程序,在循环中调用sched_yield并对其进行配置? – 2013-04-25 14:08:02

3

就linux内核而言,一个核心就是一个CPU,所以sched_yield会导致调用线程放弃CPU,但如果线程是队列中唯一的线程,它不会等待任何周期。

所以你的情况sched_yield将立刻返回立刻如果没有线程等待当前的核心。

请注意,sched_yield而不是旨在控制如何在多个CPU上运行线程。

+0

但是我们会在这里进行系统调用吗?对? – MetallicPriest 2013-04-25 14:07:23

+0

sched_yield **是一个系统调用,C实现只不过是类似'_syscall0(int,sched_yield)'的东西' – zakinster 2013-04-25 14:12:39