欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    鍵盤可以說是我們最常使用的輸入硬件設備了,但身為程序員的你,你知道「鍵盤敲入 A 字母時,操作系統期間發生了什么嗎」?

    那要想知道這個發生的過程,我們得先了解了解「操作系統是如何管理多種多樣的的輸入輸出設備」的,等了解完這個后發現新硬件多媒體視頻控制器,我們再來看看這個問題,你就會發現問題已經被迎刃而解了。

    正文設備控制器

    我們的電腦設備可以接非常多的輸入輸出設備,比如鍵盤、鼠標、顯示器、網卡、硬盤、打印機、音響等等,每個設備的用法和功能都不同,那操作系統是如何把這些輸入輸出設備統一管理的呢?

    為了屏蔽設備之間的差異,每個設備都有一個叫設備控制器( ) 的組件,比如硬盤有硬盤控制器、顯示器有視頻控制器等。

    計算機 I/O 系統結構

    因為這些控制器都很清楚的知道對應設備的用法和功能,所以 CPU 是通過設備控制器來和設備打交道的。

    設備控制器里有芯片,它可執行自己的邏輯,也有自己的寄存器,用來與 CPU 進行通信,比如:

    實際上,控制器是有三類寄存器,它們分別是狀態寄存器( )、 命令寄存器( )以及數據寄存器(Data ),如下圖:

    這三個寄存器的作用:

    CPU 通過讀、寫設備控制器中的寄存器來控制設備,這可比 CPU 直接控制輸入輸出設備,要方便和標準很多。

    另外, 輸入輸出設備可分為兩大類 :塊設備(Block )和字符設備( )。

    塊設備通常傳輸的數據量會非常大,于是控制器設立了一個可讀寫的數據緩沖區。

    這樣做是為了,減少對設備的操作次數。

    那 CPU 是如何與設備的控制寄存器和數據緩沖區進行通信的?存在兩個方法:

    I/O 控制方式

    在前面我知道,每種設備都有一個設備控制器,控制器相當于一個小 CPU,它可以自己處理一些事情,但有個問題是,當 CPU 給設備發送了一個指令,讓設備控制器去讀設備的數據,它讀完的時候,要怎么通知 CPU 呢?

    控制器的寄存器一般會有狀態標記位,用來標識輸入或輸出操作是否完成。于是,我們想到第一種輪詢等待的方法,讓 CPU 一直查寄存器的狀態,直到狀態標記為完成,很明顯,這種方式非常的傻瓜,它會占用 CPU 的全部時間。

    那我們就想到第二種方法 —— 中斷,通知操作系統數據已經準備好了。我們一般會有一個硬件的中斷控制器,當設備完成任務后觸發中斷到中斷控制器,中斷控制器就通知 CPU,一個中斷產生了,CPU 需要停下當前手里的事情來處理中斷。

    另外,中斷有兩種,一種軟中斷,例如代碼調用 INT 指令觸發,一種是硬件中斷,就是硬件通過中斷控制器觸發的。

    但中斷的方式對于頻繁讀寫數據的磁盤發現新硬件多媒體視頻控制器,并不友好,這樣 CPU 容易經常被打斷,會占用 CPU 大量的時間。對于這一類設備的問題的解決方法是使用 DMA( ) 功能,它可以使得設備在 CPU 不參與的情況下,能夠自行完成把設備 I/O 數據放入到內存。那要實現 DMA 功能要有 「DMA 控制器」硬件的支持。

    DMA 的工作方式如下:

    可以看到, CPU 當要讀取磁盤數據的時候,只需給 DMA 控制器發送指令,然后返回去做其他事情,當磁盤數據拷貝到內存后,DMA 控制機器通過中斷的方式,告訴 CPU 數據已經準備好了,可以從內存讀數據了。僅僅在傳送開始和結束時需要 CPU 干預。

    設備驅動程序

    雖然設備控制器屏蔽了設備的眾多細節,但每種設備的控制器的寄存器、緩沖區等使用模式都是不同的,所以為了屏蔽「設備控制器」的差異,引入了設備驅動程序。

    設備控制器不屬于操作系統范疇,它是屬于硬件,而設備驅動程序屬于操作系統的一部分,操作系統的內核代碼可以像本地調用代碼一樣使用設備驅動程序的接口,而設備驅動程序是面向設備控制器的代碼,它發出操控設備控制器的指令后,才可以操作設備控制器。

    不同的設備控制器雖然功能不同,但是設備驅動程序會提供統一的接口給操作系統,這樣不同的設備驅動程序,就可以以相同的方式接入操作系統。如下圖:

    前面提到了不少關于中斷的事情,設備完成了事情,則會發送中斷來通知操作系統。那操作系統就需要有一個地方來處理這個中斷,這個地方也就是在設備驅動程序里,它會及時響應控制器發來的中斷請求,并根據這個中斷的類型調用響應的中斷處理程序進行處理。

    通常,設備驅動程序初始化的時候,要先注冊一個該設備的中斷處理函數。

    我們來看看,中斷處理程序的處理流程:

    在 I/O 時,設備控制器如果已經準備好數據,則會通過中斷控制器向 CPU 發送中斷請求;

    保護被中斷進程的 CPU 上下文;

    轉入相應的設備中斷處理函數;

    進行中斷處理;

    恢復被中斷進程的上下文;

    通用塊層

    對于塊設備,為了減少不同塊設備的差異帶來的影響,Linux 通過一個統一的通用塊層,來管理不同的塊設備。

    通用塊層是處于文件系統和磁盤驅動中間的一個塊設備抽象層,它主要有兩個功能:

    Linux 內存支持 5 種 I/O 調度算法,分別是:

    第一種,沒有調度算法,是的,你沒聽錯,它不對文件系統和應用程序的 I/O 做任何處理,這種算法常用在虛擬機 I/O 中,此時磁盤 I/O 調度算法交由物理機系統負責。

    第二種,先入先出調度算法,這是最簡單的 I/O 調度算法,先進入 I/O 調度隊列的 I/O 請求先發生。

    第三種,完全公平調度算法,大部分系統都把這個算法作為默認的 I/O 調度器,它為每個進程維護了一個 I/O 調度隊列,并按照時間片來均勻分布每個進程的 I/O 請求。

    第四種,優先級調度算法,顧名思義,優先級高的 I/O 請求先發生, 它適用于運行大量進程的系統,像是桌面環境、多媒體應用等。

    第五種,最終期限調度算法,分別為讀、寫請求創建了不同的 I/O 隊列,這樣可以提高機械磁盤的吞吐量,并確保達到最終期限的請求被優先處理,適用于在 I/O 壓力比較大的場景,比如數據庫等。

    存儲系統 I/O 軟件分層

    前面說到了不少東西,設備、設備控制器、驅動程序、通用塊層,現在再結合文件系統原理,我們來看看 Linux 存儲系統的 I/O 軟件分層。

    可以把 Linux 存儲系統的 I/O 由上到下可以分為三個層次,分別是文件系統層、通用塊層、設備層。他們整個的層次關系如下圖:

    這三個層次的作用是:

    有了文件系統接口之后,不但可以通過文件系統的命令行操作設備,也可以通過應用程序,調用 read、write 函數,就像讀寫文件一樣操作設備,所以說設備在 Linux 下,也只是一個特殊的文件。

    但是,除了讀寫操作,還需要有檢查特定于設備的功能和屬性。于是,需要 ioctl 接口,它表示輸入輸出控制接口,是用于配置和修改特定設備屬性的通用接口。

    另外,存儲系統的 I/O 是整個系統最慢的一個環節,所以 Linux 提供了不少緩存機制來提高 I/O 的效率。

    鍵盤敲入字母時,期間發生了什么?

    看完前面的內容,相信你對輸入輸出設備的管理有了一定的認識,那接下來就從操作系統的角度回答開頭的問題「鍵盤敲入字母時,操作系統期間發生了什么?」

    我們先來看看 CPU 的硬件架構圖:

    CPU 的硬件架構圖

    CPU 里面的內存接口,直接和系統總線通信,然后系統總線再接入一個 I/O 橋接器,這個 I/O 橋接器,另一邊接入了內存總線,使得 CPU 和內存通信。再另一邊,又接入了一個 I/O 總線,用來連接 I/O 設備,比如鍵盤、顯示器等。

    那當用戶輸入了鍵盤字符,鍵盤控制器就會產生掃描碼數據,并將其緩沖在鍵盤控制器的寄存器中,緊接著鍵盤控制器通過總線給 CPU 發送中斷請求。

    CPU 收到中斷請求后,操作系統會保存被中斷進程的 CPU 上下文,然后調用鍵盤的中斷處理程序。

    鍵盤的中斷處理程序是在鍵盤驅動程序初始化時注冊的,那鍵盤中斷處理函數的功能就是從鍵盤控制器的寄存器的緩沖區讀取掃描碼,再根據掃描碼找到用戶在鍵盤輸入的字符,如果輸入的字符是顯示字符,那就會把掃描碼翻譯成對應顯示字符的 ASCII 碼,比如用戶在鍵盤輸入的是字母 A,是顯示字符,于是就會把掃描碼翻譯成 A 字符的 ASCII 碼。

    得到了顯示字符的 ASCII 碼后,就會把 ASCII 碼放到「讀緩沖區隊列」,接下來就是要把顯示字符顯示屏幕了,顯示設備的驅動程序會定時從「讀緩沖區隊列」讀取數據放到「寫緩沖區隊列」,最后把「寫緩沖區隊列」的數據一個一個寫入到顯示設備的控制器的寄存器中的數據緩沖區,最后將這些數據顯示在屏幕里。

    顯示出結果后,恢復被中斷進程的上下文。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有