完成端口教程

来源:互联网 发布:快递派件软件 编辑:程序博客网 时间:2024/06/11 19:43

http://wenku.baidu.com/view/6197a98ecc22bcd126ff0c7b.html

http://wenku.baidu.com/view/9743f92758fb770bf78a5515.html

高伸缩性的应用的一个原则:

1.      创建更少的线程

消耗的资源少,每个线程会存储用户栈,线程上下文,内核栈等信息。

线程多占用cpu的调度,线程多会造成更多的上下文切换。线程上下文切换是很耗时间的。

IOCP allows an application to use a pool of threads that arecreated to process asynchronous I/O requests

TIPS:

1.      重叠I/O overlapped: 调用某个函数就立即返回做其他的动作

2.      设备: 指Windows 操作系统上允许通信的任何东西

3.      完成端口是一种windows内核对象,是用于异步方式的重叠I/O, 一定要加一个异步。不是重叠I/O就是完成端口。完成端口的特点是内部提供了线程池的管理,减少反复创建线程,减少线程的调度,从而提高性能。

4.      线程的数目是cpu数量的两倍,一般就够了。但如果程序没有太多的阻塞操作,就没必要启动太多的线程,因为阻塞的话会占用线程

5.      可以把完成端口看成系统维护的一个队列,操作系统把重叠IO操作完成的事件通知放到该队列里,由于暴露“操作完成”的事件通知,所以命名为完成端口

6.      CompletionKey是一个可以自己定义的参数,在合适的时候取出来

7.      凭借GetQueuedCompletionStatus来管理线程池。这个函数试图从指定的完成端口的I/O完成队列中提取记录。只有当重叠IO动作完成的时候,完成队列中才有记录。凡是调用这个函数的线程将被放入到完成端口的等待线程队列中,因此完成端口就可以在自己的线程池中帮助我们维护这个线程

8.      待线程队列: 维护线程

9.      IO完成队列: 存放了当前重叠IO完成的结果

10.  重叠IO的记录:一条记录有四个字段,前3个对应GetQueuedCompletionStatus,最后一个是错误信息

11.  处理数据的过程:当IO完成队列中出现了记录,完成端口将会检查等待线程队列,该队列都是通过函数GetQueuedCompletionStatus使自己加入队列中的,等待队列很简单,只保存了线程的ID。

12.  线程间传递信息

a.      _beginthreadex函数中的参数

b.      全局变量

c.       完成端口也可以用自己的方式:

1)     CompletionKey

保存在完成端口的设备表中,是和设备句柄一一对应的,可以将设备句柄相关数据保存到ComletionKey中,或者将ComletionKey表示为结构指针,这样就可以传递更加丰富的内容。这些内容只能在一开始关联完成端口的时候做,因此不能在以后动态改变。

2)     OVERLAPPED

Overlapped参数是在每次调用readFile这样的支持重叠io的函数时传递给完成端口,为调用IOCP机制所引用的OVERLAPPED结构。这个是用于传入被异步使用的内存buffer。注意这个数据必须是锁在内存中的。

对于参数传递需要非常了解,lpCompletionKey 就是"谁",lpOverlapped 就是"做了什么",lpCompletionKey, 这个是你将套接字与完成端口建立关系时提供给完成端口的上下文指针,从这个函数里,完成端口再提示给你。lpOverlapped,这个是与本次完成操作相关的上下文。completionkey是关于执行操作的那个句柄相关的信息(这是你自己指定的);overlapped是关于这个句柄执行的这次io相关的信息(这个也是你自己指定的)。

原创粉丝点击