2012-03-21 79 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多年來一直如此。