2017-07-28 57 views
0

我已經讀過關於用戶空間和內核空間以及程序的執行路徑如何從用戶空間到內核空間的內容,我想這是一個例子,如果我的程序像這樣運行程序訪問內核空間時會發生什麼

Poco::Net::SocketAddress sender; 
char buffer[64000]; 
. 
. 
. 
socket.receiveFrom(buffer, sizeof(buffer), sender); 

由於這次調用需要訪問網卡,我認爲它應該進入內核空間。

我的問題是: 因爲程序會發生什麼事讓socket.receivefrom(...)調用

  1. 是否線程進入睡眠狀態,並放棄它的核心,因爲它會 到內核空間只有被喚醒時,字符緩衝區已經 書面
  2. 是否線程直接到內核空間,然後回來給用戶空間寫入的字符緩衝區
+0

查看https://unix.stackexchange.com/questions/370975/does-a-context-switch-occurs-when-an-interrupt-is-fired –

回答

0
    0後
  1. 否。該線程在內核權限(x86中的環0)上執行內核代碼。內核中的線程可能會進入「休眠」狀態(即,CPU可能會去執行一個不同的程序,或者會閒置,這取決於調度程序決定的內容)。但是,如果數據已經從網卡上獲得,它可能根本無法進入睡眠狀態。從用戶的角度來看,您知道當通話返回時,您的數據已經存入緩衝區,並且您可能預計該通話需要一段時間。

  2. 這取決於調度程序。您可能會隨時獲得中斷並執行其他操作。但是,一般來說,是的,你轉到內核後面。

相關問題