windows 完成端口
2011-07-12 18:15
211 查看
在windows网络编程中,有一种完成端口iocp机制,用于处理客户端的连接,避免每当客户端进行连接就创建一
个线程,这样会导致服务器成千上万个线程,而完成端口很好的解决了这个问题。
自己的理解是:完成端口就是一个IO完成队列,在把服务socket和客户连接socket与这个完成端口绑定,客户端与这个服务socket发生的所有操作,都通过这个完成端口的消息来进行通知,所以里面包含了IO完成的消息通知,在工作线程里面通过对这些消息类型的判断,然后作出相应的处理。
使用完成端口,还可以使用并发线程(同时工作的线程,与线程切换不一样,这与cpu的数量有关系),这样会 使性能更加高效.
下面讲解完成端口的实现方式和工作机制:
完成端口主要有三个函数实现:
1. 这个函数有两个功能,创建一个完成端口,完成套接口与完成端口的绑定。
注:1. 如果是创建一个完成端口,前面三个参数设置成INVALID_HANDLE_VALUE, NULL,0就可以了。如果函
数执行成功,将返回完成端口IOCP句柄。
2. 如果是绑定一个套接口,可以在GetQueuedCompletionStatus(下面会讲这个函数),得到CompletionKey
这个参数。
3. 在绑定前,应该先调用WSAIoctl这个函数设置服务器套接字的工作模式。
4. 如果设置了同时工作线程数n,就启动n个工作线程。
2. 查看完成端口队列里面的消息通知,如果没有,就阻塞,如果有,就更具返回的一些状态作出相应的操
作。这个函数一般都工作在每个工作线程里面。GetQueuedCompletionStatus。
3. 第三个参数主要是用来与工作线程进行通信,主要是用来投递io消息,投递的参数可以在第二个函数里面得
到,然后作出判断,或者退出操作,PostQueuedCompletionStatus。
注意:本来这篇文章写好了的,但是没保存上,气死我了,没有办法又重新写,然自己又懒得不行,所以很多
解释得就不详细了,很多地方也写得很简略,囫囵吞枣吧。
补充:完成端口的使用就是在异步io的情况下使用的,避免多线程带来的开销,因为开启的
线程越多,必然会 导致效率的下降。而完成端口把对应所有socket的操作都放在一个线程
里面(具体开多少个并发线程,要看cp u的数量,一般是cpu的数量的两倍再加2),通过
在这个线程里面,使用完成端口的函数来获取状态后,再进 行相应的操作,这样可以有
效地减少线程数量,达到了性能的最大话,不过是在windows使用,linux怎么使用 还不
清楚。
个线程,这样会导致服务器成千上万个线程,而完成端口很好的解决了这个问题。
自己的理解是:完成端口就是一个IO完成队列,在把服务socket和客户连接socket与这个完成端口绑定,客户端与这个服务socket发生的所有操作,都通过这个完成端口的消息来进行通知,所以里面包含了IO完成的消息通知,在工作线程里面通过对这些消息类型的判断,然后作出相应的处理。
使用完成端口,还可以使用并发线程(同时工作的线程,与线程切换不一样,这与cpu的数量有关系),这样会 使性能更加高效.
下面讲解完成端口的实现方式和工作机制:
完成端口主要有三个函数实现:
1. 这个函数有两个功能,创建一个完成端口,完成套接口与完成端口的绑定。
HANDLE WINAPI CreateIoCompletionPort( __in HANDLE FileHandle, //套接口,需要进行重叠io的句柄,就是服务socket __in_opt HANDLE ExistingCompletionPort, //指向完成端口的句柄,iocp句柄 __in ULONG_PTR CompletionKey, //套接口数据 __in DWORD NumberOfConcurrentThreads //同时工作的线程,设置0为默认 );
注:1. 如果是创建一个完成端口,前面三个参数设置成INVALID_HANDLE_VALUE, NULL,0就可以了。如果函
数执行成功,将返回完成端口IOCP句柄。
2. 如果是绑定一个套接口,可以在GetQueuedCompletionStatus(下面会讲这个函数),得到CompletionKey
这个参数。
3. 在绑定前,应该先调用WSAIoctl这个函数设置服务器套接字的工作模式。
4. 如果设置了同时工作线程数n,就启动n个工作线程。
2. 查看完成端口队列里面的消息通知,如果没有,就阻塞,如果有,就更具返回的一些状态作出相应的操
作。这个函数一般都工作在每个工作线程里面。GetQueuedCompletionStatus。
3. 第三个参数主要是用来与工作线程进行通信,主要是用来投递io消息,投递的参数可以在第二个函数里面得
到,然后作出判断,或者退出操作,PostQueuedCompletionStatus。
注意:本来这篇文章写好了的,但是没保存上,气死我了,没有办法又重新写,然自己又懒得不行,所以很多
解释得就不详细了,很多地方也写得很简略,囫囵吞枣吧。
补充:完成端口的使用就是在异步io的情况下使用的,避免多线程带来的开销,因为开启的
线程越多,必然会 导致效率的下降。而完成端口把对应所有socket的操作都放在一个线程
里面(具体开多少个并发线程,要看cp u的数量,一般是cpu的数量的两倍再加2),通过
在这个线程里面,使用完成端口的函数来获取状态后,再进 行相应的操作,这样可以有
效地减少线程数量,达到了性能的最大话,不过是在windows使用,linux怎么使用 还不
清楚。
相关文章推荐
- Windows完成端口与Linux epoll技术简介
- Windows完成端口与Linux epoll技术简介
- Windows完成端口编程
- Windows下完成端口移植Linux下的epoll
- Windows完成端口与Linux epoll技术简介
- Windows下完成端口移植Linux下的epoll
- Windows完成端口与Linux epoll技术简介
- 【转】WINDOWS IO完成端口的一些内部细节理解
- Windows完成端口编程
- Windows完成端口与Linux epoll技术简介 1
- Windows完成端口与Linux epoll技术简介(能看懂)
- Windows下完成端口移植Linux下的epoll
- Windows完成端口与Linux epoll技术简介
- Windows完成端口编程
- Windows下性能最好的I/O模型——完成端口
- Windows下完成端口移植Linux下的epoll(转)
- Windows完成端口 IOCP模型(二)
- Windows系统编程之异步I/O和完成端口
- Windows下完成端口,线程池
- Windows完成端口编程