2017-02-14 24 views
1

考慮多核CPU中的以下情況,爲了簡單起見,可以堅持使用Linux內核。操作系統中的兩個I/O阻塞進程和鍵盤事件

wait_char() 
{ 
    while (1) 
    { 
     ch = readchar(); 
     putchar(ch); 
    } 
} 
  1. 我打開兩個終端A和B,並運行在wait_char()代碼中的每個
  2. 兩個處理A和處理B被阻擋,並把在I/O隊列等待鍵盤中斷來。比方說,A是超前B在該隊列
  3. 現在我選擇具體終端B和輸入從我的鍵盤鍵
  4. CPU運行在內核模式中的鍵盤中斷服務程序
  5. 當然,我會看到輸入鍵在控制檯中回顯。

現在內核怎麼知道它是B(誰在I/O隊列中落後)?

+0

我會猜測,因爲我不是100%確定。 bash將把「fork」和「execv」分配給你輸入的程序。子進程和父進程共享'PD'表中的所有條目,包括'stdin'和'stdout'。如果你在你運行程序A的第一個打開的bash中輸入你的密鑰,並在那裏輸入你的輸入,那麼bash會中斷,這樣操作系統會處理這個輸入。只有程序A和那個bash收到了這個輸入。不是程序B /第二次打開bash。 –

回答

0

進程不在隊列中等待I/O。當您在終端B上輸入內容時,設備驅動程序知道它來自終端B.設備可能會觸發中斷。然後OS將數據發送給在終端B上具有待處理讀請求的任何人。

如果你有兩個從終端B讀取的進程,那麼它是隨機的,哪一個獲得該字符。