2013-10-11 79 views
17

「阻塞系統調用」是什麼意思?「屏蔽系統調用」是什麼意思?

在我的操作系統課程,我們正在研究多線程編程。我不能確定,當我在我的書閱讀「它可以允許另一個線程運行時一個線程進行攔截系統調用」是什麼意思

回答

20

一種阻塞系統調用是一個必須等​​到動作就可以完成。 read()就是一個很好的例子 - 如果沒有輸入準備好,它就會坐在那裏等待,直到有一些是(假如你沒有把它設置爲非阻塞,當然,在這種情況下,它不會是一個阻塞系統呼叫)。顯然,當一個線程正在等待一個阻塞的系統調用時,另一個線程可能不會做其他事情。

+0

IS是指當一個用戶線程已用這種阻擋系統調用時,它會等待(這個線程被阻塞)和另一用戶線程可映射到內核將其映射到的前一個線程? – sam

+0

我不知道你正在接受什麼課程,或者它想告訴你什麼,但我會這麼想。多對一多線程模型將多個用戶線程與單個內核線程相關聯。如果該內核線程處於阻塞系統調用中,則與其關聯的所有用戶線程也必須等待。對於一對一模型,這不是真的,因爲所有用戶線程都有自己的內核線程,所以如果一個內核線程被阻塞,另一個線程可以做其他事情。 –

+0

我有幾乎相同的問題。如果它是多對一模式,並且用戶線程想要進行阻塞系統調用。所有其他線程是否也必須停止? (只能由內核線程進行系統調用?) – user5954246

12

對於阻塞系統調用,在系統調用返回之前,調用方不能執行任何操作。如果系統調用可能很長(例如涉及文件IO或網絡IO),這可能是一件壞事(例如,想象一個沮喪的用戶在不響應的應用程序中敲擊「取消」按鈕,因爲該線程被阻塞等待來自網絡的未到達的分組)。爲了解決這個問題(在等待阻塞系統調用返回時執行有用的工作),可以使用線程 - 當一個線程被阻塞時,其他線程可以繼續執行有用的工作。

另一種方法是非阻塞系統調用。在這種情況下,系統調用立即返回(幾乎)。對於冗長的系統調用,系統調用的結果稍後會發送給調用者(例如,作爲某種事件或消息或信號),或者稍後由調用者查詢。這使您可以讓一個線程同時等待很多不同的冗長系統調用;並且避免了線程的麻煩(以及鎖定,競態條件,線程切換的開銷等)。但是,這也增加了獲取和處理系統調用結果的麻煩。

它是(幾乎總是)可能寫周圍阻塞系統調用一個無阻塞的包裝;包裝器派生一個線程並立即返回(幾乎),並且派生線程執行阻塞系統調用,並將系統調用的結果發送給原始調用者或將其存儲在原始調用者可以輪詢的地方。

它也(幾乎總是)可能寫圍繞非阻塞系統調用的阻擋封套;包裝器在進行系統調用並在返回之前等待結果。

+0

無阻塞系統的關係調用和分階段操作?第二個只是第一個的一小部分?是否有其他類型的操作涉及非阻塞系統調用?或者它們是同一個事物?T提前hank! – Novemberland