完成端口总结(一)

原创 2013年12月16日 00:36:57

这两天粗略的学习了完成端口的简单应用今天把他记下来!

IOCP(I/O CompletionPort) I/O完成端口;

IOCP模型属于一种通讯模型,适用于(能控制并发执行的)高负载服务器的一个技术。一种能够处理很多很多用户的数据交换的一个模型,主要还是异步I/O操作的模型,不过由于是内核操作,很多东西都是windows设计好的,最起码线程安全由系统负责。

主要的优点有:利于管理,分配线程,控制并发,最小化的线程上下文切换。优化线程调度,提高CPU和内存缓冲的命中率。可以帮助维护重复使用的内存池。去除删除线程创建/终结负担。

相对而言:IOCP是一种大规模连接,小数据传送。如果带宽够大,传数据只需几十个或者小于60个,就能搞定,那还不如用I/O事件选择。更快捷、还能保证安全。我们这里应用IOCP应用的是串型传输,可能影响速率,但是保证安全,完整传输。

首先说一下主要用到的API函数,当然主要是关于完成端口的:

最主要的一个函数CreateIoCompletionPort

HANDLE WINAPI  CreateIoCompletionPort(
__in HANDLE FileHandle,                 //关联文件句柄
__in_opt HANDLE ExistingCompletionPort, //已存在的文件句柄
__in ULONG_PTR CompletionKey,           //传送给处理函数的参数 ,是个结构体里面有Client的信息(SOCKET和地址)
__in DWORD NumberOfConcurrentThreads    //有多少个线程在访问这个消息队列
);

下一就是“完成”后的消息的队列,内核完成的操作都在里面,这是I/O操作,用的是异步通信,也就是内核处理数据,线程继续运行,最后完成该线程工作。

BOOL WINAPI GetQueuedCompletionStatus(
  __in          HANDLE CompletionPort,       // 已建立的文件句柄
  __out         LPDWORD lpNumberOfBytes,     //完成一次I/O操作后,接收实际传输的字节数
  __out         PULONG_PTR lpCompletionKey,  //完成端口里面的信息地址
  __out         LPOVERLAPPED* lpOverlapped,  //重叠结构内的信息地址
  __in          DWORD dwMilliseconds         //处理时间
);

剩下最后一个就是如何正确关闭I/O完成端口

BOOL WINAPI PostQueuedCompletionStatus(
  __in          HANDLE CompletionPort,
  __in          DWORD dwNumberOfBytesTransferred,
  __in          ULONG_PTR dwCompletionKey,
  __in          LPOVERLAPPED lpOverlapped
);

 

基本样例就是

PostQueuedCompletionStatus(m_hIOCompletionPort, 0, (DWORD) NULL, NULL);  

下面就是具体过程:

一、首先要建立一个完成端口:里面的参数可能都是0和-1,并且确定要创建的线程数(和自己的CPU有直接关系)

二、判断系统内到底多少个处理器

三、根据处理器数量创建线程

四、套接字操作,直接运行到监听完成。

五、使用accept函数,接受入站的连接请求。

六、创建数据结构主要用于容纳单句柄数据,我这里主要涉及到的有SOCKET和ClientAddr。还有重叠数据结构里面涉及到的有LPOVERLAPPED,缓存,类型

七、把ClientSkt和完成端口关联到一起。并且把单句柄数据结构传递进CreateIoCompletionPort();

八、使用重叠I/O,在套接字上投递一个或多个WSASend和WSARecv调用。

九、线程开始运行。如果线程结束,回收堆内存。由于使用的是全局堆栈内存,所以可以在其他地方回收内存。当GetQueueCompletionStatus值为0时,阻塞中,这种情况说的是前面没有运行过,如果在运行中出现为零就需要考虑回收资源。当然还有一种情况就是操作完成时,也要回收资源。

十、关闭I/O完成端口。

这些都是看书,直接总结的,有不足的地方,互相探讨

 

完成端口学习笔记(一):完成端口+控制台 实现文件拷贝

最近在整理手里一个项目的后台服务端归档程序,重新梳理了一下有关“完成端口”的知识,发现还是有很多模棱两可的地方,下面记录一下再次学习的点滴,博文中以一个简单的控制台文件拷贝程序来演示了“完成端口”的内...
  • zssureqh
  • zssureqh
  • 2013年12月08日 20:03
  • 4283

IOCP相关的一些总结

1:在IOCP中投递WSASend返回WSA_IO_PENDING的时候,表示异步投递已经成功,但是稍后发送才会完成。这其中涉及到了三个缓冲区。 网卡缓冲区,TCP/IP层缓冲区,程序缓冲区。 情...
  • mandytong
  • mandytong
  • 2015年08月18日 17:02
  • 509

完成端口高效的三个原因

最近看了点完成端口的内容,一点心得记录如下:1.避免了select的查询,可以从socket直接定位到完成端口。想象同时上千个连接的程序中,别的模型里只能通过select的方式对所有的socket链接...
  • fatacy
  • fatacy
  • 2007年05月23日 19:01
  • 1707

完成端口学习笔记(二):完成端口实现机制的仿真

上一篇关于“完成端口”的文章中,我们讲解了在同一个控制台程序中完成本地文件的拷贝,利用的是ReadFile和WriteFile两个API函数。本篇将讲解一下怎样利用完成端口来完成网络文件的拷贝,即通过...
  • zssureqh
  • zssureqh
  • 2014年01月04日 17:59
  • 4646

windows Socket编程之完成端口模型

上篇介绍了重叠IO模型,它已经把我们的等待数据到来和拷贝数据到我们程序的缓冲区这个时间全部交给了操作系统去完成了,它已经很完善了。但是,如果我们想要把服务端的性能做的更好一点的话,它还是有点不足的,比...
  • Timmiy
  • Timmiy
  • 2016年08月17日 15:09
  • 1268

Windows核心编程(十一)I/O完成端口

1、串行模型:一个线程等待一个客户(通常是通过网络)发出请求,当请求到达时,线程会被唤醒并对客户请求进行处理。 并发模型:一个线程等待一个客户请求,并创建一个新的线程来处理请求。 2、完成端口背后...
  • woshibendangao
  • woshibendangao
  • 2014年04月01日 15:21
  • 712

windows完成端口学习总结(一)

近来仔细学习了windows的5种网络I/O模型,阻塞、选择、异步选择、事件选择都还比较好理解,编写程序也不是很难,但是完成端口模型就比较麻烦了,需要考虑很多的线程间同步问题,诸多异常情况的处理,主动...
  • mymodian
  • mymodian
  • 2014年03月22日 23:07
  • 958

关于windows完成端口(IOCP)的一些理解

本人很多年前接触完成端口以来,期间学习和练习了很多次,本以为自己真正地理解了其原理,最近在看网狐的服务器端源码时又再一次拾起完成端口的知识,结果发现以前理解的其实很多偏差,有些理解的甚至都是错误的。网...
  • analogous_love
  • analogous_love
  • 2017年07月06日 16:22
  • 1374

Windows网络编程 — UDP完成端口的实现

在Winwos下共有5种I/O模型,可让Winsock应用程序对I/O进行管理,它们包括:   select(选择); WSAAsyncSelect(异步选择模型); WSAEven...
  • mycoolx
  • mycoolx
  • 2010年10月19日 18:04
  • 4630

C++完成端口组件实现

在windows平台上,处理众多的TCP连接的机制中效率最高的是完成端口模型,关于完成端口模型的介绍可参照《Win32 多线程程序设计》(侯捷翻译)和《windows网络编程》。异步机制是完成端口的基...
  • zhuweisky
  • zhuweisky
  • 2005年07月01日 15:59
  • 3935
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:完成端口总结(一)
举报原因:
原因补充:

(最多只允许输入30个字)