Windows編程 Lesson004_003-1 IO操做編程
- 001 什麼是Windows的IO:(Input / Output)
- 從編程語言角度來看IO操做有:標C中的printf與scanf就是IO操做、C++中有cout與cint也是IO操做,打開文件等都是IO操做。
- windows平臺上的IO有幾類:
- 1 操做文件
- 2 外部設備操做,對於全部「設備」的操做,都是IO操做。設備概念:除了內存之外,均可以稱之爲設備 。
- 3 網絡通訊
- 002 完成端口機制
- 完成端口機制 由來:
- windows是 「多任務,多線程」的操做系統,在多核CPU上,windows操做系統有完善的並行處理機制,經過多核,並行多線程執行程序; 現在計算機的瓶頸,不在是CPU的速度,或內存速度,或內存大小等因素,瓶頸在於「外部設備(硬盤)」之上。IO操做外部設備,特別是硬盤文件的IO操做上,外部設備響應速度跟不上,線程會被掛起;爲了不這種IO操做上的瓶頸,就有了「完成端口機制」。
- 完成端口機制 流程:
- 當有IO請求發起,「完成端口機制」是先接收到請求,不去等待外部設備的IO操做完成,而是直接返回,先去處理其它任務;直到IO操做完成後發起通知,纔去處理IO完成後的任務。
- 003 文件內核對象的理解
- IO操做:
- 1 與文件之間的IO操做
- 2 和目錄之間的IO操做
- 3 與邏輯磁盤之間的IO操做
- 4 與物理磁盤之間的IO操做
- 5 串口IO操做
- 6 並口IO操做
- 7 郵件槽IO操做 (少見)
- 8 命名管道IO操做
- 9 匿名管道IO操做
- 10 套接字IO操做
- 11 控制檯IO操做 (少見)
- 設備的抽象概念:文件、目錄、邏輯磁盤、物理磁盤、串口、並口、等,均可以當作」設備「;
- 文件格式
- 文件內核的由來:
- 文件、目錄、邏輯磁盤,本質上是windows爲了方便管理,爲用戶虛擬出來的二進制數據。二進制數據有了一些」文件「的屬性後,它就是文件,文件屬性設置了屬於哪一個」目錄「,就有了目錄;目錄創建之初,設置屬性屬於哪一個」邏輯磁盤「,就有了邏輯分區。這一套」文件「管理機制,由windows操做系統來維護管理:」文件內核對象「是最爲關鍵所在。
- 磁盤上的文件,本質上是一段存放在磁盤扇區上的二進制數據,打開了文件,這段」二進制數據「就要加載進內存,那麼問題來了:操做系統如何肯定」二進制數據「的大小?或者說:從哪裏起始,加載進入內存,又在在哪裏肯定邊界?——用C++的面向對象來理解:操做系統能夠設計一個專門的類(或結構體),來處理初始化」二進制數據「,使其構形成爲文件。實際上windows操做系統上,設計了專門的結構體,來處理文件的初始化。而這些結構體都保存在內核裏面,因此「文件類」產生的對象,就是「文件內核對象」。
- 內核當中存在的類或結構體,咱們不能直接new出一個對象,windows操做系統提供了系列win32API 來獲取文件內核對象。
- 004 全部的設備類型的講解
- 串口、並口 :兩種不一樣的接口,表明兩種不一樣的通訊方式。串口是經過電話線發送型號,單通道;並口是8通道。
- 郵件槽 : 局域網中, 一對多的服務或傳輸方式。
- 管道 : 命名管道,局域網中一對一的傳輸方式。匿名管道,主要用於本機之間通訊。
- 本機之間爲何還要匿名管道呢?實際上,本機中,進程與進程之間隔離,相對獨立,匿名管道就提供了通訊傳輸的渠道。
- 固然也能夠採用套接字Socket通訊。
- 套接字 Socket: 報文或數據流傳輸,經過網絡。
- 005 R3層和R0層文件對象的交互

- 文件對象交互流程:
- APP應用程序-->
- "打開並讀取磁盤文件xxx.txt" -->
- 調用win32API函數 -->
- 經過R3層檢測 -->
- R0層找到文件所在 -->
- 文件內核管理 加載文件到內存 -->
這裏會根據文件類型來決定,是否讀取文件。
- 構造「文件內核對象」 (內核對象表明文件所在空間) -->
-
-
-
-
-
-
-
-
-
- 以「文件內核對象」來作標識標記 ,存放在內存中 -->
此時會有文件的系列信息表生成,把信息表裏的部分數據傳遞出去,內核對象不對暴露出去,只有經過驗證事後,才能操做內核對象,內核層纔是安全的。
- 內存中有了文件內核對象,則返回用戶層R3層,通知用戶,打開成功 <--||
-
- 文件打開成功 -->
- 經過R3層,通知API函數 -->
- 返回的是「文件內核對象」的句柄 -->
並不會返回「文件內核對象」自己,由於R0層和R3層是中斷的(不在一個位面)。只能是額外的開闢一塊區域,R0層把參數傳到這塊區域後,R3層來讀取。R3層能得到的,只是「文件內核對象」的一個編號,這個編號就是「句柄」,它對應了文件內核對象的所在。
- 得到文件內核對象的句柄後,再次發起「讀取」文件的請求 -->
- 告訴R3層,要讀取的內核對象是哪一個?(句柄的意義) -->
-
-
-
-
-
-
- 來到R0層 -->
- 文件內核管理模塊,解讀句柄,獲取必要參數 -->
- 指向開闢的共享區域的文件所在,讓R3層讀取具體文件信息 <--||
- 句柄: 表明了某個「內核對象」,內核對象是一類事務的抽象
- 006 設備的打開方式 初步整理:

- 文件 CreateFile(路徑名或UNC路徑)
- 目錄 CreateFile(路徑名或UNC路徑)
- 須要FILE_FLAG_BACKUP_SEMANTICS標誌
- 邏輯磁盤 CreateFile(\\.\?:)
- 物理磁盤 CreateFile(\\.\PHYSICALDRIVE?)
- 固定格式:\PHYSICALDRIVE?
- "?" 這裏表明物理磁盤的編號,通常爲數字。
- 串口 CreateFile(COM?)
- 並口 CreateFile(LPT?)
- 郵件槽服務器 CreateMailslot(\\.\mailslot\郵件槽名)
- 郵件槽客戶端 CreateFile(\\servername\mailslot\郵件槽名)
- 命名管道服務器 CreateNamePipe(\\.\pipe\管道名)
- 命名管道客戶端 CreateFile(\\servername\pipe\管道名)
- 匿名管道 CreatePipe
- 套接字 Socket , accept