聊聊IOCP,聊聊非同步程式設計

2022-01-15 21:26:33 字數 1122 閱讀 1144

io完成埠(io completion ports)在多核計算機的並行非同步io請求方面提供了一種高效的執行緒模型。當程序建立乙個io完成埠時,系統建立乙個相關聯的佇列,其唯一目的是服務與那些請求。io完成埠通常和預先分配的執行緒池配合,相比於乙個乙個建立執行緒,這使其更快更高效。iocp在程序之間並不共享,乙個iocp及其控制代碼只和建立它的程序關聯,但是乙個程序中的多個執行緒可共享。iocp最關鍵的地方就是,iocp在io請求和接收動作完成之後,啟用執行緒池中的任意執行緒繼續操作,而不是在io請求和接受完成之後,啟用原等待中的執行緒。這樣的好處是防止等待執行緒閒置,和必須啟用/切換到原等待執行緒的開銷。

非同步io在於執行緒非阻塞,提高cpu利用率,增加伺服器吞吐量,助我們承受更大的併發。在windows下使用iocp,可以直接使用c#非同步程式設計await/async。雖然c#可以直接操作win32api,但.net平台已提供好非同步io的操作封裝,只需要簡單的語法,即可完成非同步磁碟io,非同步http請求,非同步socket,基於.net框架現有的條件,也很容易做關聯式資料庫,redis,elasticsearch,mongodb的非同步讀寫。所以推薦在windows下的io盡可能使用iocp。iocp本質上解決的問題就是cpu和io速度極大的不對等。

簡單寫了個api介面,用於證明在非同步io操作的時候,執行緒並不阻塞等待io結束,而是將請求交給驅動後返回執行緒池,繼續工作。

圖中**操作是先記錄當前請求處理中的執行緒id,然後請求乙個10s返回的網路介面。用http客戶端併發請求圖中該介面後,我們稍後給出執行緒行為的結論。 我們都知道,如果說服務端執行緒是io阻塞的,第一次請求,如果記錄了執行緒id為1,那麼在10s內,該執行緒一直在阻塞等待,所以10s內不會再出現該執行緒id被記錄到日誌中。 事實上結論是:

可以看到在同一秒甚至同一毫秒內,乙個執行緒同時處理了多次http請求。另外可以確定的乙個事實是,io前和io後,執行緒可能是不一樣的,也可能是一樣的。

python iocp 聊聊IOCP,聊聊非同步程式設計

前言 io完成埠 io completion ports 在多核計算機的並行非同步io請求方面提供了一種高效的執行緒模型。當程序建立乙個io完成埠時,系統建立乙個相關聯的佇列,其唯一目的是服務與那些請求。io完成埠通常和預先分配的執行緒池配合,相比於乙個乙個建立執行緒,這使其更快更高效。iocp在程...

聊聊 聊天工具

公司搬家後,對網路的限制越來越嚴格,只允許訪問網頁,主流的聊天工具msn,qq都在禁止之列,雖然一片 聲,卻無濟於事。還好還有google的gtalk,在公司的網路高壓政策下還有一條出路,只是gtalk的朋友比較少,大部分客戶都在qq,msn上,客戶紛紛打 來問怎麼不上網了?真不知如何給客戶解釋公司...

聊聊CHM工具

最近想把我們的知識沉澱做成類似於手冊一樣的東西,經過討論決定先做成chm格式。所以上網找資料,下面的資訊已經和全面了,希望能和大家分享 常用chm工具 quickchm 是乙個多語版chm製作軟體,支援大部分chm的功能設定,而且外接語言包,可以很容易支援更多語言。是真正的所見即所得 wysiwyg...