winsocket的IO模型能承载多大的访问量

2020-09-22 23:05发布

winsocket的IO模型能承载多大的访问量

winsocket的IO模型能承载多大的访问量

2条回答
@CcCc
2楼 · 2020-09-22 23:31

应用程序使用Winsock与传输协议驱动沟通时AFD.SYS负责缓冲区的管理。这就意味着当一个程序调用send或者WSASend发送数据时,数据将被复制到AFD.SYS它自己的内部缓冲区中(依赖SO_SNDBUF的设置)WSASend调用立即返回。然后AFD.SYS在程序后台将数据发送出去。当然,如果程序想要处理一个比SO_SNDBUF设置的缓冲区需求更大的发送请求,WSASend的调用就会阻塞直到所有的数据都被发送出去。

类似的,从远程客户端接收数据时,只要SO_RCVBUF设置的缓冲区还没有满,AFD.SYS就会将数据复制进它自己的缓冲区直到所有的发送都已完成。当程序调用recv或者是WSARecv,数据就从AFD.SYS的缓冲区复制到了程序提供的缓冲区中了。

使用Winsock的时候还会间接碰到另外两种资源的限制。第一个页面锁定的限制。注意重叠操作可能偶然性地以ERROR_INSUFFICIENT_RESOURCES调用失败,这基本上意味着有太多的发送和接收操作在等待中。另外一个限制是操作系统的非分页池(non-paged pool)的限制。


我想吃肉
3楼 · 2020-09-23 09:30

winsocket的同步阻塞结合多线程方便简单设计节点服务器,但是真要弄出个高效并发的服务器还得考虑下异步阻塞或非阻塞机制。winsocket引入了几个套接字I/O模型,分别如下:


1.select模型:避免了异步机制实时返回WSAEWOULDBLOCK 的错误(无功而返),该方法通过定义套接字、套接字集合变量,循环清除套接字集合变量、将套接字添加至集合,使用select函数选择符合参数规定条件的套接字,保留符合条件的套接字删除不符合条件的,依据其返回值判断所定义的套接字是否还在套接字集合里边,如果在则说明选到了符合条件的套接字,可对该套接字进行操作。


2.WSAAsyncSelect异步I/O模型:利用windows的消息机制,使用WSAAsyncSelect()函数,通过指定套接字上感兴趣的网络事件,一旦该网络事件发生,发送指定消息到窗体,窗体回调函数接受该消息并处理该套接字上的事件(连接请求、读取数据、发送数据、关闭套接字)。


3.WSAEventSelect事件选择模型:他和WSAAsyncSelect模型类似,他也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知,差别在于网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。


4.重叠I/O模型:重叠模型的基本原理是让应用程序使用一个重叠的数据结构,一次投递一个或者多个Winsock的I/O请求,针对那些提交的请求,在他们完成之后,用用程序可以为他们提供服务,有事件通知和完成例程(回调函数)两种方式。其步骤为:


事件通知方式:

1.定义变量. 包括套接字,重叠变量,事件数组.

2.创建监听套接字,绑定地址,在制定的端口上监听连接请求.

3.接受一个客服端的连接请求accept();

4.创建事件数组,初始化重叠结构,关联事件(重叠结构关联的事件),buffer初始化。

5.以WSAOVERLAPPED结构为参数,在套接字上投递WSARecv请求。

6.调用WSAWaitForMultipleEvents函数,等待重叠操作返回的结果。

7.使用WSAResetEvent函数重设当前这个用完的事件对象。

8.使用WSAGetOverlappedResult函数取得重叠调用的返回状态。

9.使用接受的数据,buffer结构里接受到了数据可使用。

10.回到第5,在套接字上继续投递WSARecv请求,重复步骤6-9.


完成例程处理(回调函数处理)方式:

1.新建一个监听套接字,在制定的端口监听客户端的连接请求。

2.接受一个客户端的连接请求,并返回一个会话套接字负责与客户端的连接请求。

3.为会话套接字关联一个WSAOVERLAPPED结构。

4.在套接字上投递一个异步WSARecv请求,方法是将WSAOVERLAPPED指定成为参数,同时提供一个完成例程。

5.在将falertable参数设为TURE的前提下,调用WSAWaitForMultipleEvents,并等待一个重叠I/O请求完成。重叠请求完成后, 完成例程会自动执行,而且WSAWaitForMultipleEvents会返回一个WAIT_IO_COMPLITION.在完成例程内,可随一个完成例程一道投递另一个重叠WSARecv请求。

6.检查WSAWaitForMultipleEvents是否返回WAIT_IO_COMPLIETION.

7.重复步骤 5--6.


重叠IO模型的缺点是为每一个IO请求都开了一个线程,当同时有成千上万个请求发生时,系统处理线程上下文切换是非常耗时的。所以这也就引出了先进的完成端口模型IOCP.用线程池来解决这个问题。


5.完成端口(IOCP)模型:

完成端口IO模型是应用程序使用线程池处理异步IO请求的一种机制。首先创建一个win32完成端口对象,再创建一定数量的工作线程,应用程序发出一些异步IO请求,当这些请求完成时,系统将把这些工作项目安排到完成端口,这样,在完成端口上等待的线程池便可以处理这些完成的IO,为已经完成的重叠IO请求提供服务。所谓的完成端口是一个windowsI/O结构,可以接受多种I/O对象的句柄,如文件对象,套接字对象等。

IOCP的基本步骤:

1.调用CreatIoCompletionPort函数,创建一个完成端口。忽略前三个参数,第四个参数为零,旨在创建一完成端口对象,同时指定在完成端口上,每个处理器一次只允许执行一个工作者线程。

2.判断系统内到底安装了多少个处理器。

3.创建工作者线程,在完成端口上,为已完成的IO请求提供服务(调用GetQueuedCompletionStatus()注意单句柄数据和单I/O操作数据的使用)。

4.监听套接字--->绑定---->监听

5.使用accept函数,接受进入的连接请求。

6.创建一个数据结构,用于容纳"单句柄数据",同时在结构中存入接受的套接字句柄。

7.再次调用CreatIoCompletionPort函数,将自accept返回的新套接字句柄同完成端口关联到一起。通过完成键(CompletionKey)参数,将单句柄数据结构传递给函数。

8.开始在已接受的连接上进行io操作。通过重叠io机制,在新建的套接字上投递一个或者多个异步WSARecv或者WSASend请求。这些io请求完成后,一个工作线程会为io请求提供服务。同时继续处理未来的io请求。

9.重复 5-- 8 至终止。分别于主线程循环阻塞accept() ;于工作线程循环阻塞GetQueuedCompletionStatus();


不停地发出异步的WSASend/WSARecv IO操作,具体的io处理过程由windows系统完成,WINDOWS系统完成实际的io处理后,把结果送到完成端口上。如果有多个io都完成了那么就在完成端口那里排成一个队列。在另外一个线程里从完成端口不断地取出io操作结果,然后根据需要在发出WSASend/WSARecv IO 操作。


IOCP模型最大的特色是:线程的服务单位被分割了,从传统的以用户为服务单位转为以IO操作为服务单位。


相关问题推荐

  • 什么是大数据时代?2021-01-13 21:23
    回答 100

    大数据(big data)一词越来越多地被提及,人们用它来描述和定义信息爆炸时代产生的海量数据,而这个海量数据的时代则被称为大数据时代。随着云时代的来临,大数据(Big data)也吸引了越来越多的关注。大数据(Big data)通常用来形容一个公司创造的大量非结...

  • 回答 84

    Java和大数据的关系:Java是计算机的一门编程语言;可以用来做很多工作,大数据开发属于其中一种;大数据属于互联网方向,就像现在建立在大数据基础上的AI方向一样,他两不是一个同类,但是属于包含和被包含的关系;Java可以用来做大数据工作,大数据开发或者...

  • 回答 52
    已采纳

    学完大数据可以从事很多工作,比如说:hadoop 研发工程师、大数据研发工程师、大数据分析工程师、数据库工程师、hadoop运维工程师、大数据运维工程师、java大数据工程师、spark工程师等等都是我们可以从事的工作岗位!不同的岗位,所具备的技术知识也是不一样...

  • 回答 29

    简言之,大数据是指大数据集,这些数据集经过计算分析可以用于揭示某个方面相关的模式和趋势。大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。大数据的特点:数据量大、数据种类多、 要求实时性强、数据所蕴藏的...

  • 回答 14

    tail -f的时候,发现一个奇怪的现象,首先 我在一个窗口中 tail -f test.txt 然后在另一个窗口中用vim编辑这个文件,增加了几行字符,并保存,这个时候发现第一个窗口中并没有变化,没有将最新的内容显示出来。tail -F,重复上面的实验过程, 发现这次有变化了...

  • 回答 18

    您好针对您的问题,做出以下回答,希望有所帮助!1、大数据行业还是有非常大的人才需求的,对于就业也有不同的岗位可选,比如大数据工程师,大数据运维,大数据架构师,大数据分析师等等,就业难就难在能否找到适合的工作,能否与你的能力和就业预期匹配。2、...

  • 回答 17

    最小的基本单位是Byte应该没多少人不知道吧,下面先按顺序给出所有单位:Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB,按照进率1024(2的十次方)计算:1Byte = 8 Bit1 KB = 1,024 Bytes 1 MB = 1,024 KB = 1,048,576 Bytes 1 GB = 1,024 MB = 1,048,576...

  • 回答 33

    大数据的定义。大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法通过人脑甚至主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。大数据是对大量、动态、能持续的数据,通过运用新系统、新工具、新...

  • 回答 5

    MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的版本:针对不同的用户,MySQL分为两种不同的版本:MySQL Community Server社区版本,免费,但是Mysql不提供...

  • mysql安装步骤mysql 2022-05-07 18:01
    回答 2

    mysql安装需要先使用yum安装mysql数据库的软件包 ;然后启动数据库服务并运行mysql_secure_installation去除安全隐患,最后登录数据库,便可完成安装

  • 回答 5

    1.查看所有数据库showdatabases;2.查看当前使用的数据库selectdatabase();3.查看数据库使用端口showvariableslike'port';4.查看数据库编码showvariableslike‘%char%’;character_set_client 为客户端编码方式; character_set_connection 为建立连接...

  • 回答 5

    CREATE TABLE IF NOT EXISTS `runoob_tbl`(    `runoob_id` INT UNSIGNED AUTO_INCREMENT,    `runoob_title` VARCHAR(100) NOT NULL,    `runoob_author` VARCHAR(40) NOT NULL,    `submission_date` DATE,    PRI...

  • 回答 9

    学习多久,我觉得看你基础情况。1、如果原来什么语言也没有学过,也没有基础,那我觉得最基础的要先选择一种语言来学习,是VB,C..,pascal,看个人的喜好,一般情况下,选择C语言来学习。2、如果是有过语言的学习,我看应该一个星期差不多,因为语言的理念互通...

  • 回答 7

    添加语句 INSERT插入语句:INSERT INTO 表名 VALUES (‘xx’,‘xx’)不指定插入的列INSERT INTO table_name VALUES (值1, 值2,…)指定插入的列INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)查询插入语句: INSERT INTO 插入表 SELECT * FROM 查...

  • 回答 5

    看你什么岗位吧。如果是后端,只会CRUD。应该是可以找到实习的,不过公司应该不会太好。如果是数据库开发岗位,那这应该是不会找到的。

  • 回答 7

    查找数据列 SELECT column1, column2, … FROM table_name; SELECT column_name(s) FROM table_name 

没有解决我的问题,去提问