当前位置: 技术问答>linux和unix
新手,请教一个linux线程调度问题
来源: 互联网 发布时间:2016-05-09
本文导语: 线程A为SCHED_FIFO策略,线程B为SCHED_OTHER策略。创建A,B完成后,令B先sleep一段时间,然后再唤醒。 程序的预计运行情况应该是这样地吧: A运行 | |当A结束后 | B才运行 但是,意想不到的事情花生鸟~~ 实际运...
线程A为SCHED_FIFO策略,线程B为SCHED_OTHER策略。创建A,B完成后,令B先sleep一段时间,然后再唤醒。
程序的预计运行情况应该是这样地吧:
A运行
|
|当A结束后
|
B才运行
但是,意想不到的事情花生鸟~~
实际运行情况是这样:
A运行
|
|Bsleep的时间过后
|
B运行,A挂起
|
|B运行完后
|
A继续运行未完成的部分
不明白为嘛SCHED_OTHER的B的可以将SCHED_FIFO的A给抢了。而且A里应该没有使自己阻塞的语句,就算有的话,阻塞结束后也应该立即把B再抢了,不至于B完全结束后才得以运行啊。
等待各位指点!多谢!
程序的预计运行情况应该是这样地吧:
A运行
|
|当A结束后
|
B才运行
但是,意想不到的事情花生鸟~~
实际运行情况是这样:
A运行
|
|Bsleep的时间过后
|
B运行,A挂起
|
|B运行完后
|
A继续运行未完成的部分
不明白为嘛SCHED_OTHER的B的可以将SCHED_FIFO的A给抢了。而且A里应该没有使自己阻塞的语句,就算有的话,阻塞结束后也应该立即把B再抢了,不至于B完全结束后才得以运行啊。
等待各位指点!多谢!
|
不是一言两语说得清,CPU有个时钟,时钟一到会重新调度,并不是说会一定等你正在执行的任务执行完才会去执行别的任务的。很浅显的例子,你写一个死循环的程序,你的程序执行起来了,你的系统还是可以运行良好,并不会一直执行在这个死循环(如果时时刻刻都在执行这个死循环,那你的系统就别的任何事情都干不了,事实不是这样,虽然会慢一点)
|
cpu调度根据优先级计算出运行时间片,这只能保证优先级高的线程多一点时间来运行,并不保证一定是优先级高的代码运行完再运行优先级的底的线程。所以b打断a是因为a在所得的时间片内没能运行完程序,这个是正常的。如果你想要做到a线程完再启动b线程,可以采用多线程同步手段来实现。