什麼是windows的IO
系統與外部裝置進行互動的操作對外部裝置的操作都稱為I/O操作
IO完成端口機制
提高效率windows是一個多任務多線程的作業系統多任務:執行多個程序
多線程:一個程序内執行多個線程
程序所代表的是目前程式的機關,線程所代表的是實際工作的勞工多核:多核作業系統下,可以讓每一個核心運作來運作一個線程,真正達到多任務并行處理單核:僞多任務外部裝置的瓶頸,會使線程挂起例如從外部裝置讀取需要2分鐘,那麼線程會被挂起,直到裝置讀取完畢才能進行下面的工作:會影響效率,IO完成端口機制可以幫助解決這個問題有IO處理請求的時候,會發送請求,不會等待,線程繼續做事情,裝置操作結束後,給線程一個通知,再回來做這件事情,相當于自己做了一個并行,不會導緻程式卡死能夠讓程式被挂起的時候來執行其它的一些操作
檔案核心對象的了解
IO操作都是基于裝置:除了記憶體之外的都可以認為是裝置記憶體是運作所有程式的載體标準IO操作檔案存儲在硬碟中,屬于檔案裝置目錄windows下包含着很多目錄,也屬于一個裝置邏輯磁盤驅動器系統中的分區,從作業系統的角度看,哪塊空間到哪塊空間是屬于C槽的實體磁盤驅動器一般一台電腦隻裝了一個磁盤,那麼就隻有一個實體磁盤
- windows可以将一塊實體磁盤分成邏輯磁盤,邏輯磁盤和目錄都是為了友善使用者的使用,在目錄下面,就是檔案(有一個檔案格式表,可百度檢視),在系統層面下,每一個檔案都是二進制資料的集合(二進制檔案)
- 廣義上的檔案的是由格式來區分:通過擴充名能夠知道編碼格式,才能正确的打開檔案
但是,檔案的最終意義是二進制的集合- 實體磁盤 -> 邏輯磁盤(可以跨實體磁盤) -> 分成一級級的目錄 -> 檔案
邏輯磁盤和目錄都是由作業系統做出來的,真實存在的隻是實體磁盤和檔案(檔案的概念也是虛拟出來的,其實就是二進制資料)檔案是由檔案系統維護的,檔案隻是一個記憶體區間,但是在邏輯上要組織成一個機關- 檔案核心對象:代表從A到B這塊區域
就像一個類(其實核心對象是一個結構體),這個對象指代了A到B這塊區域,都是一個個的對象,都儲存在檔案核心中,是以檔案核心對象,都是為了做一件事情,隻是為了指代出一些機關,或者指代類似于檔案的一些事物
每個裝置都有自己的一個對象
擷取對應的對象:處在核心态,沒辦法new出來,是以需要用API
使用核心對象,更多的是對檔案以及目錄裝置進行操作,增删改查,對邏輯磁盤的操作隻能做些格式化和大小更改,對實體磁盤的操作隻能是擷取分區等
所有的裝置類型講解
序列槽
并口
序列槽和并口是計算機和外部裝置進行互動的一種方式郵件槽但是是兩種不同的連接配接方式,相當于是一個接口,主要做信号互動,序列槽是單通道,并口是八通道,但并口并不一定比序列槽快,還要做排序什麼的命名管道通過網絡傳輸
可以進行一對多的通信
區域網路
匿名管道通過網絡傳輸
一對一的通信
區域網路
套接字本機通信:程序與程序是隔離的。之間的通信可以使用匿名管道,也可以使用scoket
一對一
封包或者資料流的傳輸
R3和R0檔案對象的互動
軟體->R3層->一根分離線 ->R0層 ->作用到一個個單獨的硬體中![]()
Poedu_Windows_IO操作 軟體使用R3層提供的一些API,打開檔案、讀取的操作過程軟體向R3層提出請求:打開檔案;R3判定請求是否符合要求,再到那條線(不會越過這條線),再通過R0層調用硬體中硬碟,取到這個檔案,R0層會有一個辨別(在記憶體中儲存一個檔案核心對象),然後向上傳回,傳回到軟體層,傳回的東西其實就是檔案核心對象,但是沒法越過那條線,是以沒法把東西直接給軟體層,是以需要兩個程序之間進行通信,通信的内容不能太大,是以會傳回一個編号,這個編号在R3層就是一個句柄(HANDLE),通過這個句柄就可以對檔案進行操作,操作後的内容放到一個記憶體共享區域,軟體再從這個共享區域中拿東西R3層的參數校驗,是為了保證請求能夠通過那條線的檢測
裝置的打開方式
檔案CreateFile:不止是建立,也會打開目錄參數:路徑名或UNC路徑(\)等
傳回檔案核心對象:HANDLE
CreateFile邏輯磁盤需要使用标志位 FILE_FLAG_BACKUP_SEMENTICSCreateFile(\?:):下劃線加一個盤符(比如C)實體磁盤CreateFile(//PHYSICALDRIVE?)序列槽問号是數字CreateFile(COM?)并口COM+序列槽編号CreateFile(LPT?)郵件槽伺服器LPT+并口編号CreateMailslot(.\mailslot\郵件槽名)郵件槽用戶端CreateFile(\servername(一般是UNC名)\mailslot\郵件槽名)命名管道伺服器CreateNamedPipe(.\pipe\管道名)命名管道用戶端CreateFile(\servername(一般是UNC名)\pipe\管道名)注意郵件和命名管道,使用的時候再看一遍
匿名管道
CreatePipe套接字Socket; accept