回答
一種阻塞系統調用是一個必須等到動作就可以完成。 read()
就是一個很好的例子 - 如果沒有輸入準備好,它就會坐在那裏等待,直到有一些是(假如你沒有把它設置爲非阻塞,當然,在這種情況下,它不會是一個阻塞系統呼叫)。顯然,當一個線程正在等待一個阻塞的系統調用時,另一個線程可能不會做其他事情。
對於阻塞系統調用,在系統調用返回之前,調用方不能執行任何操作。如果系統調用可能很長(例如涉及文件IO或網絡IO),這可能是一件壞事(例如,想象一個沮喪的用戶在不響應的應用程序中敲擊「取消」按鈕,因爲該線程被阻塞等待來自網絡的未到達的分組)。爲了解決這個問題(在等待阻塞系統調用返回時執行有用的工作),可以使用線程 - 當一個線程被阻塞時,其他線程可以繼續執行有用的工作。
另一種方法是非阻塞系統調用。在這種情況下,系統調用立即返回(幾乎)。對於冗長的系統調用,系統調用的結果稍後會發送給調用者(例如,作爲某種事件或消息或信號),或者稍後由調用者查詢。這使您可以讓一個線程同時等待很多不同的冗長系統調用;並且避免了線程的麻煩(以及鎖定,競態條件,線程切換的開銷等)。但是,這也增加了獲取和處理系統調用結果的麻煩。
它是(幾乎總是)可能寫周圍阻塞系統調用一個無阻塞的包裝;包裝器派生一個線程並立即返回(幾乎),並且派生線程執行阻塞系統調用,並將系統調用的結果發送給原始調用者或將其存儲在原始調用者可以輪詢的地方。
它也(幾乎總是)可能寫圍繞非阻塞系統調用的阻擋封套;包裝器在進行系統調用並在返回之前等待結果。
無阻塞系統的關係調用和分階段操作?第二個只是第一個的一小部分?是否有其他類型的操作涉及非阻塞系統調用?或者它們是同一個事物?T提前hank! – Novemberland
我建議有在這個很短的文字讀: http://files.mkgnu.net/files/upstare/UPSTARE_RELEASE_0-12-8/manual/html-multi/x755.html 特別是你可以從中讀到爲什麼阻塞的系統調用是與線程擔心,不只是併發進程:
這是對於多線程應用程序來說尤其成問題,因爲 系統調用上的一個線程阻塞可能會無限期地延遲另一個線程的代碼的更新 。
希望它能幫助。
- 1. 這是什麼意思系統內存
- 2. 「系統語言」是什麼意思?
- 3. 「?」是什麼意思?調用jsp的標記是什麼意思?
- 4. 是什麼意思:是什麼意思?
- 5. 什麼是系統調用?
- 6. git統計數據是什麼意思?
- 7. 調用「旋轉」是什麼意思
- 8. 「BIOS中斷調用」是什麼意思
- 9. 這些window.external調用是什麼意思?
- 10. 什麼是故障屏蔽?
- 11. 分佈式系統中的術語「異構」是什麼意思?
- 12. Haskell類型系統中的`Num a => a`是什麼意思?
- 13. SMP系統的可擴展性是什麼意思?
- 14. 計算機系統的MIME類型是什麼意思?
- 15. 系統日誌中的WARN [PERIODIC-COMMIT-LOG-SYNCER]是什麼意思?
- 16. SourceForge中的「未知操作系統」是什麼意思?
- 17. 「文件系統輸出」對於時間-v是什麼意思?
- 18. UML:這種關係是什麼意思?
- 19. 負載係數0.75是什麼意思?
- 20. %{}是什麼意思?
- 21. '#'是什麼意思?
- 22. 「?」是什麼意思?
- 23. #{...}是什麼意思?
- 24. || =是什麼意思?
- 25. @是什麼意思
- 26. $$ $$是什麼意思?
- 27. `/ * @`是什麼意思?
- 28. 「=」是什麼意思
- 29. + =是什麼意思?
- 30. {..} [..]是什麼意思?
IS是指當一個用戶線程已用這種阻擋系統調用時,它會等待(這個線程被阻塞)和另一用戶線程可映射到內核將其映射到的前一個線程? – sam
我不知道你正在接受什麼課程,或者它想告訴你什麼,但我會這麼想。多對一多線程模型將多個用戶線程與單個內核線程相關聯。如果該內核線程處於阻塞系統調用中,則與其關聯的所有用戶線程也必須等待。對於一對一模型,這不是真的,因爲所有用戶線程都有自己的內核線程,所以如果一個內核線程被阻塞,另一個線程可以做其他事情。 –
我有幾乎相同的問題。如果它是多對一模式,並且用戶線程想要進行阻塞系統調用。所有其他線程是否也必須停止? (只能由內核線程進行系統調用?) – user5954246