2012-03-21 32 views
0

我正在学习线程,我不确定我是否理解某些概念。抢先与收益有什么区别?到目前为止,我知道抢先是强制收益,但我不确定它的实际含义。 感谢您的帮助。Pthread Concepts

+0

屈服在应用程序内完成。抢占是在应用程序之外(由OS)完成的。 – Java42 2012-03-22 00:07:10

回答

1

抢先是当一个线程停止运行另一个线程以便它可以运行。

产量是当一个线程自愿放弃处理器时间。

+0

虽然我们抢先了,但这并不意味着正在运行的线程必然会跑完? – BBB 2012-03-21 23:55:52

+0

不,我的理解是线程停止运行,没有完成它的任务,另一个线程将运行,一旦完成(或时间片结束),则第一个线程可以重新考虑再次运行。 – 111111 2012-03-21 23:57:13

1

的区别是如何进入操作系统。

'yield'是一个软件中断AKA系统调用,这可能会导致正在运行的线程组发生变化(可能会有很多其他系统调用可以做到这一点 - 阻塞读取,同步调用)。 yield()从正在运行的线程中调用,并且可能会导致另一个准备好的(但不是正在运行的)具有相同优先级的线程,而不是调用线程 - 如果有的话。

yield()的确切行为有些硬件/操作系统/语言相关。除非你正在开发低级无锁线程通信机制,并且你非常擅长,最好忘掉yield()。

抢占是中断一个线程和调度另一个线程的行为。它只能在硬件中断后发生。当硬件中断时,它的驱动程序被输入。驱动程序可能会决定它可以有效地使线程就绪,(例如,线程在对驱动程序的read()调用中被阻塞,并且驱动程序已经积累了一个漂亮的大缓冲区数据)。驱动程序可以通过发信号通知信号并退出。操作系统(为此提供了一个切入点)。此驱动程序的退出路径会导致重新计划,并且可能会使读取线程运行,而不是在中断之前运行的其他线程 - 另一个线程已被抢占。从本质上讲,当操作系统决定中断返回到不同于被中断的线程组时,抢占就会发生。

1

收率:该线程调用在调度器的功能,这潜在地“公园”该线程,并且开始另一个。另一个线程是早期调用yield的一个线程,现在似乎从它返回。许多函数可以产生语义,例如从设备读取数据。

抢占:外部事件进入系统:某种中断(时钟,网络数据到达,磁盘I/O完成...)。当时正在运行的线程被挂起,并且机器正在运行操作系统代码中断上下文。当中断得到服务,并且是时候从中断返回时,可以做出调度决定以保持中断的线程停止,而是恢复另一个线程。这是抢先。如果/当原始线程再次运行时,由中断保存的上下文将被激活,并且它将从其中断的地方继续。

依靠产量调度系统完全被称为“合作”或“合作多任务”,而不是“先发制人”。

传统(阅读:老了,20世纪70年代和80年代)UNIX是合作多任务内核,以抢占用户空间。内核例程在合理的时间内是可信的,以便在运行内核代码时禁用抢占。这极大地简化了内核编码,并以性能为代价提高了可靠性,特别是在引入多个处理器的情况下。 Linux多年来一直如此。