一、概念:
1.1、開啟裝置的操作會向作業系統傳送請求,createfile函式會直接返回,而不會去等待操作完成。
1.2、此時作業系統會發現這個請求,然後作業系統會來進行實際的操作,當操作完成之後,
1.3、會設定一些標誌,也就是通知。
1.4、在作業系統進行實際操作的時候,我可以來做一些想要做的操作,當通知來了的時候,i/o完成。
1.5、這使得我們無須等待createfile操作的完成,就能進行其他的操作。
1.6、為什麼會產生阻塞?
1.6.1、程序:程式執行的一塊空間,儲存(乙個)。
1.6.2、執行緒:程式實際執行的單位,工作,和 cpu 打交道的是執行緒(多個)。
1.7.1、typedef
struct
ulong_ptr internal;
ulong_ptr internalhigh;
union ;
pvoid pointer;
};handle hevent;
1.8.1、使用裝置核心物件。
if (!bret && getlasterror() ==error_io_pending)
1.8.2、使用事件核心物件。
1.8.2.1、唯一的只有乙個。
1.8.2.2、所謂的核心物件都是獨立於我們的程式的,它們是屬於作業系統的。
char readbuffer[maxbyte] = ;};readov.offset = 0
;readov.hevent = createevent(nullptr, true, false, _t("
readevent
")); //
建立了乙個事件核心物件。
readfile(hfile, readbuffer, maxbyte, nullptr, &readov); //
會直接傳送乙個請求,然後繼續往下執行。
char writebuffer[10] = ;
};writeov.offset = 0
;writeov.hevent = createevent(nullptr, true, false, _t("
writeevent
")); //
建立了乙個事件核心物件。
writefile(hfile, writebuffer, strlen(writebuffer), nullptr, &writeov); //
會直接傳送乙個請求,然後繼續往下執行。
//其他執行緒:
2] = ;
0] =readov.hevent;
1] =writeov.hevent;
while (true
)}
1.8.3、可提醒i/o。
1.8.3.1、傳送請求 -> 做自己的事情 -> 判斷請求是否完成。 非同步i/o
1.8.3.2、傳送請求 -> 完成後,作業系統提醒我。這種方式明顯的比上面的方式要好。當然這樣能不能做到呢?
1.8.3.4、可提醒i/o就是基於apc機制來做的非同步i/o操作。但並不是太好用。
1.8.3.5、雖然說可提醒i/o並不好用,但是apc機制還是很好用的。
1.8.3.6、當我們的執行緒處在可提醒狀態的話呢,執行緒就會去執行apc的**函式。
1.8.4、i/o完成埠。
1.8.4.1、概述:最為方便,也是最為科學的一種方式。
檔案IO之非同步訊號通知 signal
1.實現非同步訊號的步驟 1 在應用程式中註冊訊號sigio的處理函式 2 設定處理sigio訊號程序id,即指定訊號由哪個程序來接收 3 將檔案io模式設定為非同步模組 fasync模式 4 在驅動中與接收訊號的程序進行關聯 5 當驅動準備好資料後,向應用傳送訊號通知 2.應用程式 註冊訊號處理方...
python非同步io讀檔案 python之非同步IO
我們知道,cpu的速度遠遠快於磁碟 網路等io。在乙個執行緒中,cpu執行 的速度極快,然而,一旦遇到io操作,如讀寫檔案 傳送網路資料時,就需要等待io操作完成,才能繼續進行下一步操作。這種情況稱為同步io。在io操作的過程中,當前執行緒被掛起,而其他需要cpu執行的 就無法被當前執行緒執行了。因...
非同步IO之 APC
主題 使用readfileex和writefileex實現複製檔案的功能。1.getthreadiopendingflag 這個函式的功能是檢查執行緒還有沒有未完成的io在底層等待處理,這個等待處理和apc佇列中是否還有未處理的項是沒有關係的。2.只要apc開始執行,可定會將佇列清空才回讓等待函式返...