連接:程序員
http://blog.csdn.net/elssann/archive/2004/10/25/150088.aspx編程
原文:網絡
在VC版的網絡編程區,基本上天天均可以看到大量關於IOCP(完成端口)的帖子和討論,不少人比較反感IOCP,特別是一些一直在UNIX下寫程序的人。就我我的的見解來講,IOCP是一個設計得很巧妙的東西,是目前WINDOWS下編寫高效IO程序的惟一選擇。至少目前爲止,我在UNIX下或者LINUX下都沒看到相似的模型,就模型的先進性來講,我認爲IOCP多是領先的,問題在於WINDOWS的線程性能不夠好,加上本質上是一個基於GUI的操做系統,別的方面劣勢抵消了IOCP帶來的優點,好比WINDOWS下的線程切換速度就沒LINUX下快,這是由於WINDOWS下定時的時間精度所肯定的。
IOCP從本質上來講,沒什麼複雜的,拋開異步IO(這個是系統自己的IO,至少我無法實現),咱們能夠本身設計一個相似這樣的東西,並且很是之簡單。用過IOCP的人都應該熟悉這兩個函數:PostQueueCompletionStatus, GetQueueCompletionStatus。用第一個函數Post給IOCP的數據,能夠用第二個函數Get出來,其實咱們就能夠用一個信號量加一個隊列和一個臨界區就能夠實現,隊列爲空的時候,信號量爲0,Get函數用WaitForSingleobject阻塞在信號量上,往隊列裏Post數據的時候,先將數據插入到隊列尾,而後Release一個信號量,那邊阻塞住的Get函數從WaitForSingleObject那裏返回,返回後就從隊列裏取一個數據,就如此簡單。
在UNIX/LINUX下,也有這種東西,就是消息隊列,System V和Posix都有消息隊列,幾乎和PostQueueCompletionStatus, GetQueueCompletionStatus如出一轍,稍微有點不一樣的地方,就是UNIX/LINUX下的消息隊列都帶有一個優先級。對Posix消息隊列來講,返回的老是優先級最高的消息,而對System V來講,是任意的。如今最新的LINUX下的異步IO(這裏我要特別強調一下異步IO和非阻塞IO的區別,異步IO就是把IO提交給系統,讓系統替你作,作完了再用某種方式通知你;非阻塞IO就是你要經過某種方式不定時地向系統詢問你是否能夠開始作某個IO,當能夠開始後,仍是要本身來完成IO)聽說性能很強,不過我沒用過,昨天晚上我在考慮,是否能夠用異步IO加上消息隊列在LINUX下實現一個相似WINDOWS下的IOCP的東西,這樣對於不少從WINDOWS下轉過來的程序員就會上手很快。目前EPOLL根據個人這幾天研究,發現EPOLL實質上就是POLL的演化,用非阻塞IO來實現的,總感受不是很舒服,畢竟異步IO是系統來完成IO,確定高效得多。異步