我正在學習線程,我不確定我是否理解某些概念。搶先與收益有什麼區別?到目前爲止,我知道搶先是強制收益,但我不確定它的實際含義。 感謝您的幫助。Pthread Concepts
回答
的區別是如何進入操作系統。
'yield'是一個軟件中斷AKA系統調用,這可能會導致正在運行的線程組發生變化(可能會有很多其他系統調用可以做到這一點 - 阻塞讀取,同步調用)。 yield()從正在運行的線程中調用,並且可能會導致另一個準備好的(但不是正在運行的)具有相同優先級的線程,而不是調用線程 - 如果有的話。
yield()的確切行爲有些硬件/操作系統/語言相關。除非你正在開發低級無鎖線程通信機制,並且你非常擅長,最好忘掉yield()。
搶佔是中斷一個線程和調度另一個線程的行爲。它只能在硬件中斷後發生。當硬件中斷時,它的驅動程序被輸入。驅動程序可能會決定它可以有效地使線程就緒,(例如,線程在對驅動程序的read()調用中被阻塞,並且驅動程序已經積累了一個漂亮的大緩衝區數據)。驅動程序可以通過發信號通知信號並退出。操作系統(爲此提供了一個切入點)。此驅動程序的退出路徑會導致重新計劃,並且可能會使讀取線程運行,而不是在中斷之前運行的其他線程 - 另一個線程已被搶佔。從本質上講,當操作系統決定中斷返回到不同於被中斷的線程組時,搶佔就會發生。
收率:該線程調用在調度器的功能,這潛在地「公園」該線程,並且開始另一個。另一個線程是早期調用yield的一個線程,現在似乎從它返回。許多函數可以產生語義,例如從設備讀取數據。
搶佔:外部事件進入系統:某種中斷(時鐘,網絡數據到達,磁盤I/O完成...)。當時正在運行的線程被掛起,並且機器正在運行操作系統代碼中斷上下文。當中斷得到服務,並且是時候從中斷返回時,可以做出調度決定以保持中斷的線程停止,而是恢復另一個線程。這是搶先。如果/當原始線程再次運行時,由中斷保存的上下文將被激活,並且它將從其中斷的地方繼續。
依靠產量調度系統完全被稱爲「合作」或「合作多任務」,而不是「先發制人」。
傳統(閱讀:老了,20世紀70年代和80年代)UNIX是合作多任務內核,以搶佔用戶空間。內核例程在合理的時間內是可信的,以便在運行內核代碼時禁用搶佔。這極大地簡化了內核編碼,並以性能爲代價提高了可靠性,特別是在引入多個處理器的情況下。 Linux多年來一直如此。
- 1. Javascript function scope concepts
- 2. IBM Blockchain Concepts
- 3. Solr Boosting Logic Concepts
- 4. C++ Concepts Lite:概念體中的短路
- 5. gcc中的Concepts-Lite(帶鏈接到TS)
- 6. pthread池,C++
- 7. Pthread的鎖定
- 8. Pthread Mutex Segfault
- 9. pthread返回251
- 10. pthread大項目
- 11. PThread監控
- 12. pthread庫位置
- 13. pthread malloc SegFault
- 14. Pthread和鍵盤
- 15. PThread vs boost :: thread?
- 16. pthread多線程
- 17. Pthread的併發
- 18. autoconf與-pthread
- 19. 暫停pthread?
- 20. pthread未找到
- 21. Pthread Xlib編程
- 22. pthread PHP擴展
- 23. pthread調度方法?
- 24. Pthread隊列系統
- 25. 推理PTHREAD問題()
- 26. Pthread庫初始化
- 27. pthread返回例程
- 28. 打印單的Pthread
- 29. pthread並行處理
- 30. pthread靜態鏈接
屈服在應用程序內完成。搶佔是在應用程序之外(由OS)完成的。 – Java42 2012-03-22 00:07:10