IOCP线程池的开发-(1)
生活随笔
收集整理的這篇文章主要介紹了
IOCP线程池的开发-(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在以前的文章中,我已經描述了使用IOCP來編寫一個可以支持大量數據連接的網絡通信部分的內容。但是IOCP的作用僅限于用來編寫網絡通信嗎?答案是否定的。在《windows核心編程》一書中,作者也說明了“使用IO完成端口允許我們向一個設備同時發送多個IO請求,它允許一個線程發出IO請求,另一個線程對結果進行處理,這項技術具有高度的伸縮性和最佳的靈活性”(windows核心編程第297頁)。這就說明了IOCP不只是用來開發網絡代碼,只要是IO的投遞處理都可以用IOCP來處理。這樣的話我們就可以使用IOCP來開發我們的線程池了。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
?
為什么非要用IOCP來開發線程池呢?讓我們來分析一下線程池的作用,以及IOCP來開發線程池的好處。?
當我們做服務端開發的時候,經常需要對一些慢設備進行操作(例如數據庫,文件等等)。當我們只使用一個線程來處理慢設備的時候,會發現我們的程序運行起來CPU利用率過低,處理速度過慢。如果我們使用多線程同時來操作,就可以大大提高效率。但是我們自己寫多線程調度的時候卻存在2個難以處理的問題: 1:我們需要開多少個線程合適?因為我們知道過多的線程在CPU調度切換的時候會有相當大的消耗,從而造成效率的低下(一些初學者理解的線程越多速度越快的觀點是錯誤的)。 2:我們如何調度線程?當我們操作多線程的時候我們如何選取合適的線程來處理呢?如果只用一個指定的線程那自然不行(這樣的話和單線程沒有任何區別了)。那我們又如何選擇合適的線程呢?我想大家一定可以實現,但是實現的結果就是需要進行大量的判斷,然后來選擇合適的線程處理。這樣本身增加了編碼復雜度,而且降低了效率。(大道至簡,這句話用在開發上簡直是太精辟了)。 ? 而這兩個問題,IOCP卻恰恰已經為我們解決了。 1:IOCP在一臺機器上開的線程數量是有一定規定的。一般來說是CPU數量的*2 + 2。(有的書上說是*2)。 2:對于線程的調度,IOCP采用了后進先出的原則。例如當有A、B、C、D 4個等待線程隊列,那么當數據投遞過來以后IOCP會選擇最后一次調用GetQueuedCompletionStatus的線程去處理這個數據。例如最后調用GetQueuedCompletionStatus的線程為A,那么線程A會被喚醒。同理當線程A正在處于繁忙狀態時,則剩余的等待線程隊列中的最后一個調用GetQueuedCompletionStatus函數的線程會被喚醒,去進行處理。 ? 通過以上兩點來看,使用IOCP來編寫線程池對于開發服務端程序是非常有好處的。?
那么我們怎樣用IOCP來編寫線程池呢? 首先我們來分析一下IOCP在網絡通信過程中是如何實現的,這有助于我們用IOCP來編寫線程池。 ? 在網絡通信中,當我們使用IOCP來接收數據的時候,我們首先需要投遞一個WSARecv函數,用來通知系統我們已經投遞了接收請求,當系統接收到數據以后,會自動填充重疊結構,并從函數GetQueuedCompletionStatus返回這個重疊結構和數據的長度。而且我們也可以使用函數 PostQueuedCompletionStatus來投遞我們自己定義的消息。這一點在IOCP編寫線程池的時候尤為重要。?
下一篇將將如何實現IOCP線程池。總結
以上是生活随笔為你收集整理的IOCP线程池的开发-(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XP下安装SQL2000企业版本(转载)
- 下一篇: Expression Blend实例中文