Pthread概念

时间:2012-03-21 23:50:11

标签: multithreading pthreads

我正在研究线程,我不确定我是否理解一些概念。抢占和收益有什么区别?到目前为止,我知道先发制人是强迫收益,但我不确定它实际意味着什么。 谢谢你的帮助。

4 个答案:

答案 0 :(得分:1)

抢占是指一个线程阻止另一个线程运行以便它可以运行。

屈服于线程自愿放弃处理器时间。

答案 1 :(得分:1)

答案 2 :(得分:1)

区别在于如何输入操作系统。

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

yield()的确切行为在某种程度上取决于硬件/ OS /语言。除非您正在开发低级无锁线程通信机制,并且您非常擅长,否则最好忘记yield()。

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

答案 3 :(得分:1)

收益 :线程调用调度程序中的一个函数,该函数可能“停放”该线程,并启动另一个。另一个线程是一个早先调用yield的线程,现在似乎从它返回。许多函数都可以产生语义,例如从设备读取。

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

仅依靠收益的调度系统被称为“合作”或“合作多任务”而不是“先发制人”。

传统(读取:旧的,1970年代和80年代)Unix在内核中协同多任务,具有抢先的用户空间。可以信任内核例程在合理的时间内生成,因此在运行内核代码时会禁用抢占。这大大简化了内核编码并提高了可靠性,但却牺牲了性能,尤其是在引入多个处理器时。 Linux就像这样多年。