PoEdu - Windows階段班 【Po學校】 Lesson004_003-1 IO操做

  • 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操做。設備概念:除了內存之外,均可以稱之爲設備 。
          • 常見外部設備有 1硬盤(文件)
        • 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層,要讀取的內核對象是哪一個?(句柄的意義) -->
                • 經過R3層的檢測 -->
                  • 來到R0層 -->
                    • 文件內核管理模塊,解讀句柄,獲取必要參數 -->
                      • 指向開闢的共享區域的文件所在,讓R3層讀取具體文件信息 <--||
      • 句柄: 表明了某個「內核對象」,內核對象是一類事務的抽象
    • 006 設備的打開方式 初步整理:

     

     

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