天天看點

Poedu_Windows_IO操作

什麼是windows的IO

系統與外部裝置進行互動的操作
對外部裝置的操作都稱為I/O操作

IO完成端口機制

提高效率
windows是一個多任務多線程的作業系統

多任務:執行多個程序

多線程:一個程序内執行多個線程

程序所代表的是目前程式的機關,線程所代表的是實際工作的勞工
多核:多核作業系統下,可以讓每一個核心運作來運作一個線程,真正達到多任務并行處理
單核:僞多任務
外部裝置的瓶頸,會使線程挂起
例如從外部裝置讀取需要2分鐘,那麼線程會被挂起,直到裝置讀取完畢才能進行下面的工作:會影響效率,IO完成端口機制可以幫助解決這個問題
有IO處理請求的時候,會發送請求,不會等待,線程繼續做事情,裝置操作結束後,給線程一個通知,再回來做這件事情,相當于自己做了一個并行,不會導緻程式卡死
能夠讓程式被挂起的時候來執行其它的一些操作

檔案核心對象的了解

IO操作都是基于裝置:除了記憶體之外的都可以認為是裝置
記憶體是運作所有程式的載體
标準IO操作
檔案
存儲在硬碟中,屬于檔案裝置
目錄
windows下包含着很多目錄,也屬于一個裝置
邏輯磁盤驅動器
系統中的分區,從作業系統的角度看,哪塊空間到哪塊空間是屬于C槽的
實體磁盤驅動器
一般一台電腦隻裝了一個磁盤,那麼就隻有一個實體磁盤
  • windows可以将一塊實體磁盤分成邏輯磁盤,邏輯磁盤和目錄都是為了友善使用者的使用,在目錄下面,就是檔案(有一個檔案格式表,可百度檢視),在系統層面下,每一個檔案都是二進制資料的集合(二進制檔案)
  • 廣義上的檔案的是由格式來區分:通過擴充名能夠知道編碼格式,才能正确的打開檔案
    但是,檔案的最終意義是二進制的集合
  • 實體磁盤 -> 邏輯磁盤(可以跨實體磁盤) -> 分成一級級的目錄 -> 檔案
    邏輯磁盤和目錄都是由作業系統做出來的,真實存在的隻是實體磁盤和檔案(檔案的概念也是虛拟出來的,其實就是二進制資料)
    檔案是由檔案系統維護的,檔案隻是一個記憶體區間,但是在邏輯上要組織成一個機關
  • 檔案核心對象:代表從A到B這塊區域

    就像一個類(其實核心對象是一個結構體),這個對象指代了A到B這塊區域,都是一個個的對象,都儲存在檔案核心中,是以檔案核心對象,都是為了做一件事情,隻是為了指代出一些機關,或者指代類似于檔案的一些事物

    每個裝置都有自己的一個對象

    擷取對應的對象:處在核心态,沒辦法new出來,是以需要用API

    使用核心對象,更多的是對檔案以及目錄裝置進行操作,增删改查,對邏輯磁盤的操作隻能做些格式化和大小更改,對實體磁盤的操作隻能是擷取分區等

所有的裝置類型講解

序列槽

并口

序列槽和并口是計算機和外部裝置進行互動的一種方式
但是是兩種不同的連接配接方式,相當于是一個接口,主要做信号互動,序列槽是單通道,并口是八通道,但并口并不一定比序列槽快,還要做排序什麼的
郵件槽

通過網絡傳輸

可以進行一對多的通信

區域網路

命名管道

通過網絡傳輸

一對一的通信

區域網路

匿名管道

本機通信:程序與程序是隔離的。之間的通信可以使用匿名管道,也可以使用scoket

一對一

套接字
封包或者資料流的傳輸

R3和R0檔案對象的互動

Poedu_Windows_IO操作
軟體->R3層->一根分離線 ->R0層 ->作用到一個個單獨的硬體中
軟體使用R3層提供的一些API,打開檔案、讀取的操作
過程
軟體向R3層提出請求:打開檔案;R3判定請求是否符合要求,再到那條線(不會越過這條線),再通過R0層調用硬體中硬碟,取到這個檔案,R0層會有一個辨別(在記憶體中儲存一個檔案核心對象),然後向上傳回,傳回到軟體層,傳回的東西其實就是檔案核心對象,但是沒法越過那條線,是以沒法把東西直接給軟體層,是以需要兩個程序之間進行通信,通信的内容不能太大,是以會傳回一個編号,這個編号在R3層就是一個句柄(HANDLE),通過這個句柄就可以對檔案進行操作,操作後的内容放到一個記憶體共享區域,軟體再從這個共享區域中拿東西
R3層的參數校驗,是為了保證請求能夠通過那條線的檢測

裝置的打開方式

檔案
CreateFile:不止是建立,也會打開

參數:路徑名或UNC路徑(\)等

傳回檔案核心對象:HANDLE

目錄
CreateFile
需要使用标志位 FILE_FLAG_BACKUP_SEMENTICS
邏輯磁盤
CreateFile(\?:):下劃線加一個盤符(比如C)
實體磁盤
CreateFile(//PHYSICALDRIVE?)
問号是數字
序列槽
CreateFile(COM?)
COM+序列槽編号
并口
CreateFile(LPT?)
LPT+并口編号
郵件槽伺服器
CreateMailslot(.\mailslot\郵件槽名)
郵件槽用戶端
CreateFile(\servername(一般是UNC名)\mailslot\郵件槽名)
命名管道伺服器
CreateNamedPipe(.\pipe\管道名)
命名管道用戶端
CreateFile(\servername(一般是UNC名)\pipe\管道名)

注意郵件和命名管道,使用的時候再看一遍

匿名管道

CreatePipe
套接字
Socket; accept

繼續閱讀