如果我有一个进程的所有线程都在不同的内核上运行,那么sched_yield
会在这种情况下执行什么操作?放弃并立即发布?因为我看到的是sched_yield
不会导致线程调用它,所以请等待任何循环,看起来这个调用甚至不会进入内核。sched_yield在这种情况下做什么?
2
A
回答
3
手册页说:
如果调用线程处于当时的最高优先级 列表中唯一的线程,它会继续呼叫后运行至SCHED_YIELD()。
所以,如果没有什么更重要的运行,该功能将基本上什么都不做。
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
“所以如果没有什么更重要的运行,功能基本上什么都不会做。”但是它会做一个系统调用(然后从用户空间切换到内核),甚至不是? – MetallicPriest 2013-04-25 14:03:32
是的,它仍然会执行系统调用,检查CPU调度程序的等待列表,并返回而不等待是否没有其他正在等待的线程。 – zakinster 2013-04-25 14:07:45
嗯,我现在没有Linux来测试,所以也许你可以创建一个程序,在循环中调用sched_yield并对其进行配置? – 2013-04-25 14:08:02