我正在学习线程,我不确定我是否理解某些概念。抢先与收益有什么区别?到目前为止,我知道抢先是强制收益,但我不确定它的实际含义。 感谢您的帮助。Pthread Concepts
回答
的区别是如何进入操作系统。
'yield'是一个软件中断AKA系统调用,这可能会导致正在运行的线程组发生变化(可能会有很多其他系统调用可以做到这一点 - 阻塞读取,同步调用)。 yield()从正在运行的线程中调用,并且可能会导致另一个准备好的(但不是正在运行的)具有相同优先级的线程,而不是调用线程 - 如果有的话。
yield()的确切行为有些硬件/操作系统/语言相关。除非你正在开发低级无锁线程通信机制,并且你非常擅长,最好忘掉yield()。
抢占是中断一个线程和调度另一个线程的行为。它只能在硬件中断后发生。当硬件中断时,它的驱动程序被输入。驱动程序可能会决定它可以有效地使线程就绪,(例如,线程在对驱动程序的read()调用中被阻塞,并且驱动程序已经积累了一个漂亮的大缓冲区数据)。驱动程序可以通过发信号通知信号并退出。操作系统(为此提供了一个切入点)。此驱动程序的退出路径会导致重新计划,并且可能会使读取线程运行,而不是在中断之前运行的其他线程 - 另一个线程已被抢占。从本质上讲,当操作系统决定中断返回到不同于被中断的线程组时,抢占就会发生。
收率:该线程调用在调度器的功能,这潜在地“公园”该线程,并且开始另一个。另一个线程是早期调用yield的一个线程,现在似乎从它返回。许多函数可以产生语义,例如从设备读取数据。
抢占:外部事件进入系统:某种中断(时钟,网络数据到达,磁盘I/O完成...)。当时正在运行的线程被挂起,并且机器正在运行操作系统代码中断上下文。当中断得到服务,并且是时候从中断返回时,可以做出调度决定以保持中断的线程停止,而是恢复另一个线程。这是抢先。如果/当原始线程再次运行时,由中断保存的上下文将被激活,并且它将从其中断的地方继续。
依靠产量调度系统完全被称为“合作”或“合作多任务”,而不是“先发制人”。
传统(阅读:老了,20世纪70年代和80年代)UNIX是合作多任务内核,以抢占用户空间。内核例程在合理的时间内是可信的,以便在运行内核代码时禁用抢占。这极大地简化了内核编码,并以性能为代价提高了可靠性,特别是在引入多个处理器的情况下。 Linux多年来一直如此。
- 1. Solr Boosting Logic Concepts
- 2. IBM Blockchain Concepts
- 3. Javascript function scope concepts
- 4. Concepts-Lite迭代器比较比较
- 5. gcc中的Concepts-Lite(带链接到TS)
- 6. C++ Concepts Lite:概念体中的短路
- 7. 关于PThread和PThread的障碍
- 8. pthread,pthread on windows,pthread麻烦,链接器错误,msvc 2008/2010上的pthread链接器错误
- 9. pthread和同步
- 10. pthread未找到
- 11. Pthread Mutex锁定
- 12. Pthread Xlib编程
- 13. PThread vs boost :: thread?
- 14. C++ pthread和Qt
- 15. pthread池,C++
- 16. OS X铛-pthread
- 17. pthread库位置
- 18. pthread大项目
- 19. PThread监控
- 20. Pthread Mutex Segfault
- 21. pthread返回251
- 22. 安装pthread win32
- 23. Pthread和键盘
- 24. autoconf与-pthread
- 25. 关于pthread-kill
- 26. Posix Pthread互斥
- 27. 暂停pthread?
- 28. pthread多线程
- 29. Pthread的并发
- 30. pthread PHP扩展
屈服在应用程序内完成。抢占是在应用程序之外(由OS)完成的。 – Java42 2012-03-22 00:07:10