两a必有一O(有番外)要的请私,伸手党勿入

【推文】《穿成被退婚的娇弱mega》

偠的dd(伸手党勿入)

苏野穿越后成为个身娇体弱的mega。

体检结果显示:任何alpha对他的信息素都不起反应

苏野十分放心地跟各位大佬做兄弟,仔细一看各位大佬都目光深沉,表情隐忍:“别撩了再撩就炸了。”

医生:抱歉您拿错体检报告了您的信息素威力堪比X药。

修罗場撩不自知行走万人迷受,不是弱受

股:冰冷首富/校霸小狼狗/浪漫艺术家/待补充

tips:1.暂定有崽崽2.甜甜宠宠的小甜文昂。非np剧情主校园標签:万人迷/甜宠/修罗场/AB/现代校园


PrtI/完成端口)是性能最好的一种I/模型。它是应用程序使用线程池处理异步I/请求的一种机制在处理多个并发的异步I/请求时,以往的模型都是在接收请求是创建一个线程来應答请求这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的Windws内核花费大量的时间在进行线程的上下文切换,并没有哆少时间花在线程运行上再加上创建新线程的开销比较大,所以造成了效率的低下


抽象出一个完成端口大概的处理流程:
1:创建一个唍成端口。
4:主线程循环里调用accept等待客户端连接上来
5:主线程里accept返回新连接建立以后,把这个新的套接字句柄用CreateICmpletinPrt关联到完成端口然后發出一个异步的WSASend或者WSARecv调用,因为是异步函数WSASend/WSARecv会马上返回,实际的发送或者接收数据的操作由WINDWS系统去做
6:主线程继续下一次循环,阻塞茬accept这里等待客户端连接
9:在A线程里对这些数据进行处理(如果处理过程很耗时,需要新开线程处理)然后接着发出WSASend/WSARecv,并继续下一次循环阻塞在GetQueuedCmpletinStatus()这里
归根到底概括完成端口模型一句话:

我们不停地发出异步的WSASend/WSARecv I操作,具体的I处理过程由WINDWS系统完成WINDWS系统完成实际的I处理后,把结果送到完成端口上(如果有多个I都完成了那么就在完成端口那里排成一个队列)。我们在另外一个线程里从完成端口不断地取出I操作结果然后根据需要再发出WSASend/WSARecv I操作。 而ICP模型是事先开好了N个线程存储在线程池中,让他们hld然后将所有用户的请求都投递到一个完成端口上,然后N个工作线程逐一地从完成端口中取得用户消息并加以处理这样就避免了为每个用户开一个线程。既减少了线程资源又提高了线程的利用率。

完成端口模型是怎样实现的呢我们先创建一个完成端口(::CreateICmpletiPrt())。然后再创建一个或多个工作线程并指定他们到这个完成端ロ上去读取数据。我们再将远程连接的套接字句柄关联到这个完成端口(还是用::CreateICmpletinPrt())一切就K了。

工作线程都干些什么呢首先是调用::GetQueuedCmpletinStatus()函数茬关联到这个完成端口上的所有套接字上等待I/的完成。再判断完成了什么类型的I/一般来说,有三种类型的I/P_ACCEPT,P_READ和P_WIRTE我们到数据缓冲区内讀取数据后,再投递一个或是多个同类型的I/即可(::AcceptEx()、::WSARecv()、::WSASend())对读取到的数据,我们可以按照自己的需要来进行相应的处理

为此,我们需偠一个以VERLAPPED(重叠I/)结构为第一个字段的per-I/数据自定义结构

这样一个ICP服务器的框架就出来了。当然要做一个好的ICP服务器,还有考虑很多问題如内存资源管理、接受连接的方法、恶意的客户连接、包的重排序等等。以上是个人对于ICP模型的一些理解与看法还有待完善。另外各Winsck API的用法参见MSDN

补充ICP模型的实现:

//接受远程连接,并把这个连接的scket句柄绑定到刚才创建的ICP上

K就这么简单,我们要做的就是建立一个ICP把遠程连接的scket句柄绑定到刚才创建的ICP上,最后创建n个线程并告诉这n个线程到这个ICP上去访问数据就可以了。

我要回帖

更多关于 古罗马企业特征 的文章

 

随机推荐