# 鍵盤敲入 A 字母時,操作系統期間發生了什麼? 關於[8.1 鍵盤敲入 A 字母時,操作系統期間發生了什麼?](https://xiaolincoding.com/os/7_device/device.html)的總結,前面都介紹了,但是在最後總結操作系統發生了什麼的時候,我覺得有點不詳細,於是 ...
鍵盤敲入 A 字母時,操作系統期間發生了什麼?
關於8.1 鍵盤敲入 A 字母時,操作系統期間發生了什麼?的總結,前面都介紹了,但是在最後總結操作系統發生了什麼的時候,我覺得有點不詳細,於是寫一寫自己的補充和理解,不一定正確。
- 鍵盤敲擊之後,鍵盤控制器根據敲擊的鍵生成掃描碼,寫入寄存器。同時通過中斷控制器向CPU發出中斷請求。CPU接到中斷請求後即停止正在執行的程式,保存現場,轉入鍵盤中斷服務程式。
- 中斷服務程式從寄存器中讀出鍵盤掃描碼轉換成Ascii碼與掃描碼一起存入鍵盤緩衝區。然後即返回原程式運行。
而顯示是另外程式的事。有些程式選擇只讀不顯示,比如游戲控制。有的程式不要求輸入比如計算一百萬位圓周率,鍵盤輸入會一直存緩衝區,緩衝區(一般16個字元)滿了就丟棄。有的程式需要即時操作,在讀緩衝區之前會先清除緩衝區等你新鮮按鍵。比如賽車游戲,在開始載入時你瞎按了一些鍵。如果不清除,等賽車就位就可能先瞎轉一氣當一個程式需要鍵盤輸入時,即查詢鍵盤緩衝區,如果有按鍵即讀入,如果沒有就等待一直到鍵盤緩衝區中有新的輸入。鍵盤中斷與程式讀鍵盤類似生產者與消費者。瓜農(操作系統)聽到西瓜熟了的聲音(中斷)就去把瓜揀了放入倉庫。用戶(程式)想吃瓜就去倉庫,如果有就抱走,如果沒有就死等。如果西瓜成熟沒有聲音,瓜農就只好整天在瓜地轉悠(輪詢),這樣效率很低。
這時候你可能會想,輸入緩衝區只有一個,操作系統如何對應知道當前的輸入對應哪一個程式?
焦點和活動視窗: 操作系統會跟蹤當前的活動視窗,即用戶正在與之交互的視窗。這個視窗可能是用戶最後點擊的視窗,或者是用戶通過任務切換等方式設定的。操作系統知道哪個視窗是活動視窗,並因此決定將鍵盤輸入發送到這個視窗。
活動視窗或應用程式會擁有一個事件隊列。當鍵盤輸入發生時,操作系統會創建一個鍵盤事件,並將其放入活動視窗的事件隊列中。
應用程式通常在事件迴圈中不斷地檢查事件隊列。當應用程式發現有新的鍵盤事件時,它會從事件隊列中取出事件並執行相應的處理。這可能包括更新用戶界面、執行特定操作或進行其他適當的響應。