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