名词解释IOCP简介四-Read
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
该语句的作用是返回一个句柄,在为完成端口分配了一个套接字句柄后,用来对那个 端口进行标定(引用)。
函数功能:注意该函数实际用于两个明显有别的目的: 1. 用于创建一个完成端口对象。 2. 将一个句柄同完成端口关联到一起。
IOCP简介
IOCP的开发
1、CreateIoCompletionPort
最开始创建一个完成端口时,唯一感兴趣的参数便是 NumberOfConcurrentThreads(并发线程的数量);前面三个参数都会被忽略。 NumberOfConcurrentThreads参数的特殊之处在于,它定义了在一个完成端口上, 同时允许执行的线程数量。理想情况下,我们希望每个处理器各自负责一个线程的运 行,为完成端口提供服务,避免过于频繁的线程“场景”切换。若将该参数设为0Байду номын сангаас 表明系统内安装了多少个处理器,便允许同时运行多少个线程!可用下述代码创建一 个I/O完成端口:
IOCP简介
IOCP的应用
可以看出完成端口是到目前为止最为复杂的输入输出模式。然而,当一个 应用不得不同时处理大量的socket时,它也提供了使系统性能达到最佳的可 能性。只有在被迫面对几百甚至几千个并发的socket、你又希望在添加CPU 后可以获得更好的scale时,才被派上战场。关于完成端口,最重要的是记住 这一点:如果你为winnt/2000开发处理大量socket I/O 请求的高性能服 务,它是你的最佳选择 IOCP不仅仅在通信socket上,同时也可以用于其他方面,例如读写文件, 比如把文件句柄关联到完成端口上,产生一定量的工作器线程,读取文件不同 的部分实际读取数据是系统内部处理,只是读取完了通知一下,并且把相关I O数据填充到结构体中
内容介绍
IOCP的简介 IOCP的应用 IOCP名词解释 IOCP的开发
IOCP简介
名词解释
一、什么是完成包? 完成包,即IO Completion Packet,是指异步IO操作完毕后OS提交给应用层 的通知包。IOCP维护了一个IO操作结果队列,里面保存着各种完成包。应用层 调用GQCS(也就是GetQueueCompletionStatus)函数获取这些完成包。 二、最大并发线程数 在一个典型的IOCP程序里,会有一些线程调用GQCS去获取IO操作结果。最大 并发线程数指定在同一时刻处理完成包的线程数目。 该参数在调用CreateIoCompletionPort时由NumberOfConcurrentThreads 指定。 三、工作者线程 工作者线程一般指的就是调用GQCS函数的线程。要注意的是,工作者线程数 和最大并发线程数并不是同一回事。工作者线程由应用层显示创建 (_beginthreadex 之类)。工作者线程通常是一个循环,会不断地GQCS到完 成包,然后处理完成包。
因为IOCP是一个伸缩性很强的模型,随着CPU数量以及内存数量,服务端 将体现出更好的性能,多CPU可以同时让更多的工作者线程为完成通知提供服务, 不至于系统在处理完成通知的时候没有空余线程可用
IOCP简介
IOCP的开发
线程的调度过程 : 工作者线程以是否阻塞分为两种状态:运行状态和等待状态。当线程做一些阻塞操 作时(线程同步,甚至GQCS空的完成队列),线程处于等待状态;否则,线程处于 运行状态,另一方面,OS会始终保持某一时刻处于运行状态的线程数小于最大并发 线程数。每一个调用GQCS函数的线程OS实际上都会进行记录, 当完成队列里有完成包时,OS会首先检查当前处于运行状态的工作线程数是否小于 最大并发线程数,如果小于,OS会按照LIFO的顺序让某个工作者线程从GQCS返 回(此工作者线程转换为运行状态)。如何决定这个LIFO?这是简单地通过调用 GQCS函数的顺序决定的。 从这里可以看出,这里涉及到线程唤醒和睡眠的操作。如果两个线程被放置于同一 个CPU上,就会有线程切换的开销。因此,为了消除这个开销,最大并发线程数被 建议为设置成CPU数量。 从以上调度过程还可以看出,如果某个处于运行状态的工 作者线程在处理完成包时阻塞了(例如线程同步、其他IO操作),那么就有CPU资源 处于空闲状态。因此,我们也看到很多文档里建议,工作者线程数为(CPU数 *2+2)。 在一个等待线程转换到运行状态时,有可能会出现短暂的时间运行线程数超过最大 并发线程数,这个时候OS会迅速地让这个新转换的线程阻塞,从而减少这个数量。
IOCP简介
IOCP的开发
使用完成端口来开发一个echo服务器。大致如下: 1) 创建一个完成端口。第四个参数保持为0,指定在完成端口上,每个处理器一次 只允许执行一个工作者线程。 2) 判断系统内到底安装了多少个处理器。 3) 创建工作者线程,根据步骤2)得到的处理器信息,在完成端口上,为已完成的 I/O请求提供服务。 4) 准备好一个监听套接字,在端口5150上监听进入的连接请求。 5) 使用accept函数,接受进入的连接请求。 6) 创建一个数据结构,用于容纳“单句柄数据”,同时在结构中存入接受的套接字 句柄。 7) 调用CreateIoCompletionPort,将自accept返回的新套接字句柄同完成端 口关联到一起。通过完成键(CompletionKey)参数,将单句柄数据结构传递给 CreateIoCompletionPort。 8) 开始在已接受的连接上进行I/O操作。在此,我们希望通过重叠I/O机制,在新 建的套接字上投递一个或多个异步WSARecv或WSASend请求。这些I/O请求完 成后,一个工作者线程会为I/O请求提供服务,同时继续处理未来的I/O请求,稍 后便会在步骤3 )指定的工作者例程中,体验到这一点。 9) 重复步骤5 ) ~ 8 ),直至服务器中止。
套用一段《Win32多线程程序设计》里的话结尾:重叠IO可以让你要求操 作系统为你传送数据,并且再传送完毕时通知你,它使你的程序在IO进行过程 中仍然能够继续处理事务。事实上操作系统内部正是以线程来完成重叠IO。你 可以获得线程的所有利益,而不需付出什么痛苦代价。
IOCP简介
名词解释
五、线程池 准确的说,是你创建了多个线程,因为是IOCP帮助你调度的,所以可以理 解为IOCP线程池 六、FIFO(first in first out) 队列的方式,是先进先出的方式 七、LIFO (last in first out) IOCP线程池的调度原理其实是后进先出的方式。是指线程被激活的这种方 式。或许说线程切换的方式。
IOCP简介
IOCP的开发
完成端口的三个主要函数: 1、CreateIoCompletionPort 2、GetQueuedCompletionStatus
3、PostQueuedCompletionStatus
IOCP简介
IOCP的开发
1、CreateIoCompletionPort
函数原型:HANDLE CreateIoCompletionPort ( HANDLE FileHandle, // handle to file HANDLE ExistingCompletionPort, // handle to I/O completion port ULONG_PTR CompletionKey, // completion key DWORD NumberOfConcurrentThreads // number of threads to execute concurrently );
IOCP简介
名词解释
四、重叠IO/OVERLAPPED I/O 简单来讲就是不管前一次读入/接收操作有没有完成,继续的发送读入/接收 请求。当某个请求完成后,它会通过某种方式如回调函数、内核对象等通知我们, 我们再进行处理。 1、事件通知的重叠IO:事件通知的重叠IO的好处就是写程序的时候可以先一 股脑投递n个IO的请求,然后将每个OVERLAPPED结构与一个event对象 相关联,再交给操作系统让它自己慢慢处理去。然后投递完所有的请求之后等 待WaitForMultipleObjects返回(WaitForMultipleObjects返回了代 表所有的IO操作都已经完成了),然后依次调用GetOverlappedResult来 获得IO操作的信息(其实GetOverlappedResult也会等待IO操作完成, 不过到这里已经完成了)。当然GetOverlappedResult之前在等待IO操作 完成的时候程序还可以做些其他的事情。
内容介绍
IOCP的简介 IOCP的应用 IOCP名词解释 IOCP的开发
IOCP简介
IOCP的应用
先让我们看看对IOCP的评价: 1、I/O完成端口可能是Win32提供的最复杂的内核对象。 2、这是实现高容量网络服务器的最佳方法。 3、完成端口模型提供了最好的伸缩性。这个模型非常适用来处理数百乃至上 千个套接字。 4、它是唯一适用于高负载服务器[必须同时维护许多连接线路]的一个技术。 Completion ports利用一些线程,帮助平衡由I/O请求所引起的负载。这 样的架构特别适合用在SMP系统中产生的”scalable”服务器。 看来我们完全有理由相信IOCP是大型网络架构的首选。
IOCP简介
名词解释
四、重叠IO/OVERLAPPED I/O 2、而重叠IO的另外一种模式就是异步过程调用,异步过程调用有点类似于创 建线程函数createthread的做法,在读写操作的时候指定一个回调函数,读 取完毕之后程序自动从回调函数入口点来执行(支持重叠IO的读写操作函数如 readfile、WSARecv等都会有个参数指定回调函数入口点),这样把更多的 操作放到重叠IO的处理函数中,主函数就可以腾出更多的时间干正事。 不论是哪种模式,其实原理都是一样的,就是先把要读写的请求全部投递了, 然后主程序可以一边做该做的事情一边来等待IO的完成,IO完成以后 (WaitForMultipleObjects返回之后)再处理数据。
内容介绍
IOCP的简介 IOCP的应用 IOCP名词解释 IOCP的开发
IOCP简介
IOCP的开发
为什么使用IOCP: 使用IOCP,我们能够克服 一个线程 —— 一个客户端 问题。我们知道,假 如软件不是运行在一个真实的多处理器机器上,它的性能会严重下降。线程是系 统的资源,它们即不是无限的,也不便宜。 IOCP的简单模型: 是先把socket 和完成端口绑定之后,再创建一定的工作者线程,由于工作 者线程在get完成端口状态的时候会堵塞,等待完成通知,接下来主线程就可以 投递一个accept,这个时候主线程堵塞,直到有客户端连接,才返回,IOCP内 部会调用空闲工作者线程,把完成通知交给工作者线程,并由工作者线程处理并 投递下一个操作。
I/O完成端口 使用介绍
I/O Completion Port
产品研发部 郭磊
内容介绍
IOCP的简介 IOCP的应用 IOCP名词解释 IOCP的开发
IOCP简介
什么是iocp
IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一
iocp (I/O Completion Port ,I/O完成端口,简称iocp) 个异步I/O的API,它可以高效地将I/O事件通知给应用程序。 完成端口中所谓的[端口]并不是我们在TCP/IP中所提到的端口,可以说 是完全没有关系。IOCP只不过是用来进行读写操作,和文件I/O倒是有些类 似。既然是一个读写设备,我们所能要求它的只是在处理读与写上的高效。 一个完成端口其实就是一个FIFO的通知队列,由操作系统把已经完成的 重叠I/O请求的通知放入其中。当某项I/O操作一旦完成,某个可以对该操作 结果进行处理的工作者线程就会收到一则通知。例如一个套接字在被创建后, 可以在任何时候与某个完成端口进行关联。