Met*_*est 11 multithreading yield scheduler linux-kernel
我对该sched_yield
函数几乎没有任何疑问,因为我发现它在我的代码中没有按预期运行.很多时候,当我尝试通过调用产生它时,我看到同一个线程一次又一次地运行,即使存在其他线程sched_yield
.
此外,如果我有多sched_yield
核,将为所有核心上运行的线程或仅一个核心运行.例如,我在核心1上运行线程1,2和3,在核心2上运行线程4,5和6,并且sched_yield
从线程2调用If ,它将仅由线程1和3替换,或者1,3,4 ,5和6都可能吗?我问这个是因为.Net Thread.Yield
只会产生在同一个核心/处理器上运行的线程.
http://www.kernel.org/doc/man-pages/online/pages/man2/sched_yield.2.html
sched_yield() 导致调用线程放弃 CPU。该线程因其静态优先级而被移至队列末尾,并且新线程开始运行。
如果调用线程是当时最高优先级列表中的唯一线程,则在调用 sched_yield() 后它将继续运行。
sched_yield 不是 .Net 调用,线程/进程模型与之不同。Windows/.NET的调度器与Linux的调度器不一样。Linux 甚至有几种可能的调度程序。
因此,您对 sched_yield 的期望是错误的。
如果你想控制线程如何运行,你可以将每个线程绑定到CPU。然后,线程将仅在绑定的 CPU 上运行。如果您有多个线程绑定到同一个 CPU,则使用 sched_yield可以切换到绑定到当前 CPU 并准备运行的另一个线程。
此外,如果每个线程想要执行大量 CPU 密集型工作,那么每个 CPU 使用多个线程也可能不是个好主意。
如果您想完全控制线程的运行方式,可以使用实时线程。http://www.linuxjournal.com/magazine/real-time-linux-kernel-scheduler - SCHED_FIFO 和 SCHED_RR RT 策略。
归档时间: |
|
查看次数: |
13257 次 |
最近记录: |