epoll 和 iocp效能比較
每種作業系統(核心級)都會提供特有的i/o模型以提高效能。其中linux的epoll、bsd的kqueue、windows的iocp。它們都是在作業系統級別上提供支援並且完成相關功能。那麼問題來了:到底是epoll優於iocp 還是後者優於前者呢? 個人認為至少對於目前的我來說,這兩種模型都是非常優秀的(因為我也不知道誰更優秀)。個人認為不管是eopll還是iocp都具有各自獨特的優點,但是這並非左右了伺服器效能的因素。至少他們的工作機制不同,所以對於epoll或者iocp,各位自行判斷。知識補給
iocp不僅是負責i/o工作,也還有至少建立1個執行緒並使其負責全部i/o的前後處理。理解iocp的時候不要把目光著重集中到執行緒上,而是要注意一下兩點:首先介紹相關函式1、i/o是否是以非阻塞模式工作?
2、怎樣確定非阻塞模式的i/o是否完成了工作?
#include
handle createiocompletionport(handle filehandle,handle existingcompletionport,ulong_ptr completionkey,dword numberofconcurrentthreads);
filehandle:建立cp物件時傳遞 invalid_handle_value。
existingcompletionport:建立cp物件時傳遞null。
completionkey:建立cp物件時傳遞0。
numberofconcurrentthreads:分配給cp物件的用於處理i/o的執行緒數。如該引數為2時,則分配給cp物件的可以同時執行的執行緒數最多為2個。如果為0,則系統中的cpu個數就是可同時執行的最大執行緒數。
ps:該函式可以用於建立也可以用於連線。連線引數說明在下面filehandle:要連線到的cp物件套接字控制代碼
existingcompletionport:要連線套接字的cp物件控制代碼
numberofconcurrentthreads:無論傳遞何值,只要該函式的第二個引數非null就會自動忽略。
確認完成埠完成的i/o和執行緒的i/o處理;
#include
completionport:註冊有已經完成i/o資訊的cp物件控制代碼
dwmilliseconds:超時資訊,超過該指定時間後返回false並跳出函式。傳遞infinite時,程式將阻塞,知道已經有完成i/o資訊寫入cp物件。
*下面上主題菜,注意兩個結構體的定義,並且留意結構體是何時被分配空間、何時被傳遞、如何被使用的。
#include
#include
#include
#include
#include ;
#define buf_size 100
#define read 3
#define write 5
/*注意這兩個結構體是何時分配空間,如何被傳遞,如何被使用*/
typedef
struct per_handle_data, *lpper_handle_data;
typedef
wsabuf wsabuf_;
char buffer[buf_size];
int rwmode; // read or write;
}per_io_data, *lpper_io_data;
// 本應該為 dword 的型別,應該是api更新了,使用 unsigned
unsigned winapi echothreadmain (lpvoid lpcomport);
void error_handing (char *message);
int main ()
memset (&servadr, 0, sizeof (servadr));
servadr.sin_family = af_inet;
servadr.sin_addr.s_addr = inet_addr ("192.168.1.101");
servadr.sin_port = htons (9130);
bind (nservsock, (sockaddr*) &servadr, sizeof (servadr));
listen (nservsock, 5);
while ( 1 )
return0;}
// 由執行緒執行的函式
unsigned winapi echothreadmain (lpvoid lpcomport)
/*將伺服器收到的訊息傳送給客戶端*/
ioinfo->wsabuf_.len = bytetrans;
ioinfo->rwmode = write;
/*再次傳送訊息後接受客戶端訊息*/
ioinfo = (lpper_io_data) malloc (sizeof (per_io_data));
ioinfo->wsabuf_.len = buf_size;
ioinfo->wsabuf_.buf = ioinfo->buffer;
ioinfo->rwmode = read;
} else
}return0;}
void error_handing (char *message)
Socket傳輸案例(上) 服務端
這篇部落格呢主要是兩個手機進行 socket 通訊案例的分析 話說老娘也算寫了幾篇部落格,為什麼訪問量就是少的可憐呢 什麼是 tcp ip 協議,什麼是 socket 網路由下往上分為 物理層 資料鏈路層 網路層 ip協議 傳輸層 tcp協議 會話層 表示層和應用層 http協議 tcp tp協議簡...
HTTP服務端JSON服務端
最後更新日期 2014 5 18 author kagula 內容簡介 cppcms是個開源web開發框架,通過它可以很容易實現http服務和json服務,這裡介紹cppcms開發環境的搭建。寫乙個cppcms測試程式,它建立http服務,向瀏覽器返回hello,world頁面。cppcms依賴的一...
基於flask 與python服務端案例
第一點 flask的中文手冊,雖然flask已經不再年輕。簡介 flask 是乙個微型的 python 開發的 web 框架,基於werkzeug wsgi工具箱和jinja2 模板引擎。flask使用bsd授權。flask也被稱為 microframework 因為它使用簡單的核心,用extens...