完成端口与线程池的问题?为什么完成端口是win

2025-03-30 01:20:02 0

完成端口与线程池的问题?为什么完成端口是win

本文目录

完成端口与线程池的问题

1、一般式cpu个数的2倍+2。2、select可以传入参数进行组合,包括FD_READ、FD_WRITE等。3、并不完全需要,大数据量频繁收发可采用独立线程的方式。4、可以。5、理论可以支持2048个线程,但是根据具体应用不会开很多。监听线程,和收发线程就够了,还有一些额外的针对不同逻辑的工作线程。

为什么完成端口是win

1. 完成端口的实质个人感觉完成端口就是一个“闹钟”,它可以被当做任何事情的提醒设备。比如说,(没有试过)ReadFile可以异步操作,可以将这个异步操作的完成这个事件的提醒交给完成端口来完成。所以,原文中所使用的完成端口,只是将这个“闹钟”用在了网络传输的提醒上。这也就说明了,尽管我们可以使用完成端口来完成各种提醒,但是主框架仍然是Socket那套流程。为了更清晰地表达,请看下面的描述(从上往下)。这是作者的代码的API调用流程。其实我不太喜欢作者的第三部分的那些流程图,因为其中用了太多的自定义函数而掩盖了底层的API调用。现在我把他还原。初始化库,WSAStart()创建完成端口,CreateIoCompletionPort(-1,...);创建工作线程,CreateThread()创建listen socket,WSASocket绑定listen socket 至完成端口,CreateIoCompletionPort(socket, …)listen socket与本地端口绑定 ,bind()开始监听,listen()向listen socket投递accept请求,AcceptEx()干其他事情或者等待结束命令通信结束,通知Worker线程们退出,PostQueuedCompletionStatus()至于Working 线程的做法和原先一样。 可以看到,尽管我们说完成端口的性能是最好的,然而它只是一个时间走得特别准的“闹钟”而已。 网络编程的基本框架还是原来的那套。2. 关于Accept投递和WSARev投递整偏博文里我看得最头痛的就是这个“投递”。它到底是什么?刚才说了,这里只是把完成端口作为“提醒”机制。具体来说,就是listen之后,通常的调用是如下面所示的While(1){Socket = Accept();_beginthreadex(…); // 传入socket}只不过,这样的调用就是阻塞型调用。而使用完成端口的话,就是将这个Accept(当然,源代码中使用更复杂的AcceptEx,其实差不多的)的调用(其实在内部,就相当于一个要求被accept的请求)委托给完成端口,然后主线程马上返回,并且让后者来提醒之前已经创建好的、在线程函数中调用了GetQueuedCompletionStatus函数的某个线程。当然,至于是哪个线程拿到了,那就是系统调度问题,这对我们来说是黑盒的。这就是那个AcceptEx投递的含义了。说得通俗点,所谓的Accept投递,就是告诉完成端口,“我——listen socket,向你提交一个请求,如果你有客户端的连结请求了,请立即告诉我”。所以可以说,AcceptEx投递就是listen socket的一个IO请求而已。同样的道理,如果我们不是让完成端口去通知Accept完成,而是去让它通知Receive操作完成,那就是原文中的“投递WSARev操作”了。显然,这是两种操作。3. 关于工作线程中的一些关键点 那么作者在“详细”那一节第六步中说的那个难点是怎么回事呢?我的理解是这样的。负责监听完成端口的线程(就是之前已经创建好的、在线程函数中调用了GetQueuedCompletionStatus函数的某个线程),它们是在GetQueuedCompletionStatus返回之前是不知道到底是那个操作被“闹钟”了,再加上之前说过的,具体是哪个线程被“闹钟”是我们所不知道的。所以说,你根本就无法判断某个线程会被用做干嘛。所以就需要一种机制来分别了。作者采用的方法是,自定义一些说明性的信息,然后在投递的时候附带送过来,这样在接受的时候就可以通过这些附加信息加以区别了。这就是那个PER_SOCKET_CONTEXT和PER_IO_CONTEXT的作用了。具体来说,如果是为投递Accept而准备的闹钟,那么某个线程GetQueuedCompletionStatus返回之后,将会获得和Accept投递有关的Socket和此请求的附加信息。和accept投递有关的socket是哪个呢?自然是用于做listen的那个socket(GetQueuedCompletionStatus函数的第三个参数返回它的上下文——其实就是一个和它相匹配的补充性结构,那是在将socket和完成端口绑定时传入的第三个参数)。注意到一个socket上面可以有很多个请求(类比一个客户端/服务器连结上可以发送多次数据,每一次发送数据都需要通过一个“发送数据请求”),从而在listen socket上面,我们之前投递了多个acceptEx请求,那么到底是哪个请求到来了呢?其实对于AcceptEx请求而言,哪一个并不那么重要,反正大家的工作都是创建一个客户端/服务器连结socket,然后进行通信。然而如果真的重要了,那么就需要这个值了(比如说不同连结需要不同操作之类)。具体来说,GetQueuedCompletionStatus倒数第二个参数OVERLAPPED*,返回的就是和这个请求相关的信息。它其实就是我们在投递这个请求的时候所附加给完成端口的说明性材料。注意看,这是一个OVERLAPPED结构指针,应该和我们自定义的PER_IO_CONTEXT没有关系。实则不然,回顾CIOCPModel::_PostAccept里面AcceptEx调用的最后一个参数实际上是,&pAcceptIoContext-》m_Overlapped。也就是说这里传回来的是PER_IO_CONTEXT的第一个成员m_Overlapped的地址。通过位于_WorkThread函数中的风骚宏CONTAINING_RECORD就能够得到这个PER_IO_CONTEXT的首地址啦。另外,如果投递的是WSARev请求呢?这个附加信息怎么穿进去?一样的啦,就是通过WSARev函数的OVERLAPPED结构体参数。这个结构体的实际作用,就是在异步IO操作之后,提供给你一些信息的。我们可以通过继承这个结构(或者和这里的做法一致——采用风骚宏CONTAINING_RECORD)来拓展它,让它包含我们需要的信息。接下去的事情就好办了,根据自定义结构PER_IO_CONTEXT的成员m_OpType了解一些信息,知道这个回应,到底是listen socket的accept请求的回应(ACCEPT_POSTED)还是真正的客户端/服务器连结socket的发送或者接收请求的回应(RECV_POSTED和SEND_POSTED)。如果是对accept请求的回应,那么返回的socket context和io context都是这个accept请求的,所以作者强调在_DoAccept中是一定不能够动这两个结构的。然而,如果是普通连结的发送/接收请求的回应,那么当然就是另外一回事情了。

IOCP是什么

IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select()或是其它异步方法不同的是,一个套接字有什么关系。估计这个端口也迷惑了不少人。IOCP只不过是用来进行读写操作,和文件I/O倒是有些类似。既然是一个读写设备,我们所能要求它的只是在处理读与写上的高效。

完成端口,到底一个CPU 建几个线程

接下来看看完成端口(Completion Ports )其实可以把完成端口看成系统维护的一个队列,操作系统把重叠IO操作完成的事件通知放到该队列里,由于是暴露 “操作完成”的事件通知,所以命名为“完成端口”(Completion Ports)。一个socket被创建后,可以在任何时刻和一个完成端口联系起来。一般来说,一个应用程序可以创建多个工作线程来处理完成端口上的通知事件。工作线程的数量依赖于程序的具体需要。但是在理想的情况下,应该对应一个CPU创建一个线程。因为在完成端口理想模型中,每个线程都可以从系统获得一个“原子”性的时间片,轮番运行并检查完成端口,线程的切换是额外的开销。在实际开发的时候,还要考虑这些线程是否牵涉到其他堵塞操作的情况。如果某线程进行堵塞操作,系统则将其挂起,让别的线程获得运行时间。因此,如果有这样的情况,可以多创建几个线程来尽量利用时间。总之,开发一个可扩展的Winsock服务器并非十分困难的。主要是开始一个监听socket,接收连接,并且进行重叠发送和接收的IO操作。最大的挑战就是管理系统资源,限制重叠Io的数量,避免内存危机。遵循这几个原则,就能帮助你开发高性能,可扩展的服务程序。socket的接收缓冲,因为接收事件仅仅在AcceptEx调用中发生。保证每个socket都有一个接收缓冲不会造成什么危害。一旦客户端/服务器在最初的一次请求(由AcceptEx完成)之后进行交互,发送更多的数据,那么取消接收缓冲更是一个很不好的做法。除非你能保证这些数据都是在每个连接的重叠IO接收里完成的 。

向左转|向右转

完成端口的重叠I/O

首先来看看重叠I/O(Overlapped I/O):重叠I/O(Overlapped I/O)机制允许发起一个操作,然后在操作完成之后接受到信息。对于那种需要很长时间才能完成的操作来说,重叠IO机制尤其有用,因为发起重叠操作的线程在重叠请求发出后就可以自由的做别的事情了。在WinNT和Win2000上,提供的真正的可扩展的I/O模型就是使用完成端口(Completion Port)的重叠I/O。

完成端口与线程池的问题?为什么完成端口是win

本文编辑:admin

本文相关文章:


VC++中如何用多线程?VC++多线程的参数问题

VC++中如何用多线程?VC++多线程的参数问题

本文目录VC++中如何用多线程VC++多线程的参数问题vc 多线程,单步调试VC++中如何用多线程你说的是MFC吗?MFC可以用AfxBeginThread函数创建线程,可以把ThreadProc声明为类的静态成员函数,你会单线程下载页面,

2025年3月30日 07:00

java线程(如何学习Java多线程)

java线程(如何学习Java多线程)

本文目录如何学习Java多线程java多线程同时执行一个方法的时候为什么number和number2最后的值会不一样如何学习Java多线程JAVA中的多线程使用十分广泛,很多的JAVA框架都使用到了多线程,比如spring,mybatis,

2025年3月25日 12:20

进程和线程是什么?什么是进程什么是线程

进程和线程是什么?什么是进程什么是线程

本文目录进程和线程是什么什么是进程什么是线程程序,进程和线程的区别多线程的执行效率一定高于单线程吗进程和线程是什么首先来一句概括的总论:进程和线程都是一个时间段的描述,是CPU工作时间段的描述。下面细说背景:CPU+RAM+各种资源(比如显

2025年3月6日 08:50

ccriticalsection(MFC多线程写文件出现数据混乱)

ccriticalsection(MFC多线程写文件出现数据混乱)

本文目录MFC多线程写文件出现数据混乱ccriticalsection 用法 为什么是未定义标识符MFC多线程写文件出现数据混乱写文件很快的不太极端追求高实时性,不需要开新线程去写,可能还因为创建新线程还花更多的开销另外多线程执行顺序确实不

2025年3月6日 05:30

java UDP编程 两个客户端是怎么互相通讯的,类似qq那样的 客户端创建时要指定端口吗 开n个窗口要n个端口吗?关于c#中UDP编程

java UDP编程 两个客户端是怎么互相通讯的,类似qq那样的 客户端创建时要指定端口吗 开n个窗口要n个端口吗?关于c#中UDP编程

本文目录java UDP编程 两个客户端是怎么互相通讯的,类似qq那样的 客户端创建时要指定端口吗 开n个窗口要n个端口吗关于c#中UDP编程推荐关于UDP协议的Java编程的书用java的Udp写聊天程序,为什么不能实现一个端口号同时向两

2025年3月5日 06:50

java 多线程面试(面试问 关于JAVA多线程,从哪些方面回答呢)

java 多线程面试(面试问 关于JAVA多线程,从哪些方面回答呢)

本文目录面试问 关于JAVA多线程,从哪些方面回答呢java 线程面试题java面试中经常被问到的问题有哪些java多线程runnable和thread的区别 面试题面试的时候都会问到多线程的问题,但实际很多项目并不会涉及到,那么java中

2025年2月19日 18:00

更多文章:


discuz7 2(DISCUZ7 论坛首页里 右边怎么出现热门主题还有最新主题啊)

discuz7 2(DISCUZ7 论坛首页里 右边怎么出现热门主题还有最新主题啊)

本文目录DISCUZ7 论坛首页里 右边怎么出现热门主题还有最新主题啊discuz如何使用DISCUZ7 论坛首页里 右边怎么出现热门主题还有最新主题啊进入系统后台----点击最上边的“工具”---左边的“数据调用”------选择“数据调

2025年3月6日 19:30

maven仓库在哪里(mongo maven远程仓库的路径在哪)

maven仓库在哪里(mongo maven远程仓库的路径在哪)

本文目录mongo maven远程仓库的路径在哪什么是Maven仓库eclipse怎么设置maven仓库地址如何修改maven默认仓库的路径maven本地仓库是怎么找到的maven mirrorOf 镜像仓库ID在哪里设置的怎么自定义mav

2025年3月13日 05:10

throttlestop中文对照(throttlestop重装系统了还在嘛)

throttlestop中文对照(throttlestop重装系统了还在嘛)

本文目录throttlestop重装系统了还在嘛throttlestop6.0汉化版怎么设置最好throttlestop重装系统了还在嘛安装操作系统仅对硬盘进行操作ThrottleStop中文版是一款CPU监控软件,在软件中可以看到CPU目

2025年2月9日 01:50

关闭445端口最简单方法(如何关闭445端口 win10)

关闭445端口最简单方法(如何关闭445端口 win10)

本文目录如何关闭445端口 win10怎么关闭445端口445端口怎么关闭 最全关闭445端口方法大全操作系统怎么关闭445端口如何关闭445端口 win101、首先打开Win10防火墙,然后点击进入左侧的“高级设置”,如下图所示。2、打开

2025年2月24日 13:00

distribute什么意思(distributed是什么意思)

distribute什么意思(distributed是什么意思)

本文目录distributed是什么意思attribute, contribute, distribute区别distribute在句中是什么意思distribute是什么意思distributed是什么意思distributed将…分类(

2025年3月29日 03:00

apache tomcat官网下载(如何安装Apache Tomcat并使用Tomcat发布网站)

apache tomcat官网下载(如何安装Apache Tomcat并使用Tomcat发布网站)

本文目录如何安装Apache Tomcat并使用Tomcat发布网站急~~在线等怎样在Apache下载tomcat5.5.9如何安装Apache Tomcat并使用Tomcat发布网站1. 1打开浏览器输入网址apache.org 2点击“

2025年4月3日 02:50

drawable是什么意思(drawablehdpi什么意思)

drawable是什么意思(drawablehdpi什么意思)

本文目录drawablehdpi什么意思android怎么获取res——Drawable的图片数量drawablehdpi什么意思我就是来拿你的20分的。给不给分,随缘吧。道教佛教认为由于外界事物的刺激而使身心受到感触叫作“缘”,因其缘而发

2025年3月15日 14:30

epoll原理(select poll和epoll的区别)

epoll原理(select poll和epoll的区别)

本文目录select poll和epoll的区别nginx 怎么开启epollepoll下ET模式为何一定要用要用非阻塞的模式~比较说明nginx epoll模式和apache worker模式的区别怎么通俗理解python epollng

2025年3月25日 18:50

collection官网(gucci官网中国官方网)

collection官网(gucci官网中国官方网)

本文目录gucci官网中国官方网为什么有些东西在ssense forzieri luisaviaroma 在官网却没有舰娘Collection苹果版下载地址卡地亚官网怎么查编号collectionlstoalps是什么牌子香奈儿包包的官网g

2025年3月14日 01:40

公司简介模板免费(钢材公司简介范文)

公司简介模板免费(钢材公司简介范文)

本文目录钢材公司简介范文咨询公司简介怎么写 范文怎么写公司简介建筑劳务公司简介范文6篇创业公司应该怎么写公司简介公司简介ppt模板,要求高大上单位简介怎么写模板钢材公司简介范文大有钢材贸易有限公司是一家经营优质钢材的综合贸易公司,与国内外各

2025年3月28日 20:50

tcpip协议包括哪两个核心协议(TCP/IP网络体系结构中,各层内分别有什么协议,每一种协议的作用是什么)

tcpip协议包括哪两个核心协议(TCP/IP网络体系结构中,各层内分别有什么协议,每一种协议的作用是什么)

本文目录TCP/IP网络体系结构中,各层内分别有什么协议,每一种协议的作用是什么TCP/IP协议包含哪些常用协议TCP/IP网络体系结构中,各层内分别有什么协议,每一种协议的作用是什么一、TCP/IP网络体系结构中,常见的接口层协议有:Et

2025年3月3日 08:00

oracle公司简介(oracle版本简介)

oracle公司简介(oracle版本简介)

本文目录oracle版本简介oracle(甲骨文)公司的产品(简单明了)和简介,关于甲骨文公司oracle版本简介Oracle公司是全球最大的信息管理软件及服务供应商,成立于1977年,总部位于美国加州 Redwood shore。2000

2025年3月25日 21:10

sftp工具(Linux终端常用远程连接工具有哪些)

sftp工具(Linux终端常用远程连接工具有哪些)

本文目录Linux终端常用远程连接工具有哪些哪些远程操作软件比较好用Linux终端常用远程连接工具有哪些先给大家介绍下面几款常用的Linux终端远程连接工具,欢迎补充!1、xshell介绍:xshell是一个非常强大的安全终端模拟软件,它支

2025年3月5日 19:10

borderbox(为什么bootstrap采用border-box盒模型)

borderbox(为什么bootstrap采用border-box盒模型)

本文目录为什么bootstrap采用border-box盒模型border-box;是什么意思border-box有什么用为什么bootstrap采用border-box盒模型CSS中有一种基础设计模式叫盒模型,盒模型定义了Web页面中的元

2025年2月10日 03:40

phone什么意思汽车上(汽车蓝牙是哪个键,英文缩写,怎么打开)

phone什么意思汽车上(汽车蓝牙是哪个键,英文缩写,怎么打开)

本文目录汽车蓝牙是哪个键,英文缩写,怎么打开音箱上的PHONE是什么意思汽车androidphone怎么关闭汽车上蓝牙一般的缩写形式汽车蓝牙是哪个键,英文缩写,怎么打开车载蓝牙的英文为Car Bluetooth Phone,缩写CBP。其除

2025年2月12日 21:20

命令模式类图(写出五种命令模式中各种命令之间的切换方式)

命令模式类图(写出五种命令模式中各种命令之间的切换方式)

本文目录写出五种命令模式中各种命令之间的切换方式命令模式的模式分析命令模式的实例解析Java中有多少种设计模式请简单画一下三种常见设计模式的类图linux系统的命令模式与图形界面模式的区别设计模式中命令模式和迭代器模式的区别、对比命令模式中

2025年2月18日 01:50

女生网名ended是什么意思?为什么ended 是过去式

女生网名ended是什么意思?为什么ended 是过去式

本文目录女生网名ended是什么意思为什么ended 是过去式ended ends 和end有什么区别、在什么句子里用 比如: 表演end 这样是对的吗 还是说表演ends 还是endedis ended和has ended 有什么区别en

2025年3月2日 18:10

ps反选的快捷键是什么(什么是反选Ctrl+J)

ps反选的快捷键是什么(什么是反选Ctrl+J)

本文目录什么是反选Ctrl+Jps反向选择选区的快捷键是什么什么是反选Ctrl+J检查涂匀后,退出蒙板 这是指从快速蒙板模式中切换到普通模式,快速蒙板建立选取比较方便。羽化2像素 就要在选择-羽化菜单中进行羽化,设置为2像素。反选可以用快捷

2025年2月27日 03:50

optimized defaults(BIOS里 这两个选项是干什么的 load optimized defaults 和load Standard Defaults)

optimized defaults(BIOS里 这两个选项是干什么的 load optimized defaults 和load Standard Defaults)

本文目录BIOS里 这两个选项是干什么的 load optimized defaults 和load Standard DefaultsBIOS设置中点了Load Optimized Defaults 如何恢复Load Optimized

2025年3月16日 03:30

svn链接怎么用(linux下使用svn,怎样用tortoiseSVN链接服务器)

svn链接怎么用(linux下使用svn,怎样用tortoiseSVN链接服务器)

本文目录linux下使用svn,怎样用tortoiseSVN链接服务器SVN服务器项目如何与本地项目同步、关联linux下使用svn,怎样用tortoiseSVN链接服务器启动svn建立启动svn的用户:useradd svnrootpas

2025年3月12日 14:50

近期文章

java 数组(Java数组)
2025-04-05 09:40:02
mfc指的是什么?mfc是什么
2025-04-05 09:30:02
本站热文

harbor,port,pier的区别?谁能解释“harbour“(港口)与“pier“(码头)的区别
2025-02-22 17:40:03 浏览:18
ibatis foreach(ibatis 批量update操作)
2025-02-10 23:40:06 浏览:7
endless rain(endless rain表达什么情感)
2025-02-14 06:00:02 浏览:6
标签列表

热门搜索