异步处理碰到ios 并发和异步现象处理

您所在的位置: &
0.2.4 处理多个并发连接――通向异步套接字API 之路
0.2.4 处理多个并发连接――通向异步套接字API 之路
毛姝雯/田剑 译
人民邮电出版社
《网络游戏核心技术与实战》第0章[快速入门]网络游戏编程,本章首先介绍一下网络编程和游戏编程的基本概念,对开发网络游戏来说,它们是非常重要的。本章将按照如下顺序进行讲解。本节为大家介绍处理多个并发连接――通向异步套接字API 之路。
0.2.4 处理多个并发连接&&通向异步套接字API 之路
从现在开始就要进入本章的核心内容了。代码清单0.1 所示的ECHO 服务器存在一个很大的缺陷。由于accept() 函数在&新的连接请求到来前一直等待着&,所以read() 函数在接收新的连接请求前不会再被第2 次调用。这就导致为了调用read() 函数,必须每次接收新的连接。
此外还有一个问题。read() 函数在客户端发来数据之前也会&等待&,所以在开始读取数据前,accept() 函数也不会调用第2 次。也就是说,在接收了客户端发来的一次新的连接请求后,在数据到达之前无法再接收其他连接请求。
为多个客户端同时提供服务的网络游戏在这种情况下是不可能实现的。为了解决这个问题,必须要处理多个并发连接,为此,需要同时控制多个套接字。方法大致有如下这些。
A 每次连接时启动一个进程
B 实行异步的多重输入输出(多重I/O)
C 使用线程并行进行同步处理
虽然在inetd(Internet 超级服务器)和从很早开始就在Web 中使用的CGI(CommonGateway Interface,通用网关接口)中都采用了方法A,但是在网络游戏中,需要多个用户(连接)实时共享同一个游戏状态,所以不能使用这种方式。可以在方法B 和方法C中选择。
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
本书从游戏策划与编程、系统架构、服务器运维、开发团队管理等方
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
作者丁兴良先生在长期咨询、培训的实战操作基础之上,
《天际骑士:军用直升机百科大全》是一本学习和研究直
21世纪的顾客越来越倾向于寻求个性化的消费体验,他们
本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部构造,包含了非常全面的编程参考。它提
51CTO旗下网站处理大并发之一 对异步非阻塞的理解
转载自:http://blog.csdn.net/feitianxuxue/article/details/8936802
&&& 在研究nginx和node.js的时候常会遇到异步、非阻塞等,之前自己也经常使用epoll,对其同步与阻塞,异步与非阻塞有了一定的认识,现对参考资料总结下。
&&& 首先讨论下使用事件驱动,异步编程的优点:
&&& 充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。其非常适合于后端的网络服务编程。
&&& 在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。其nginx和node.js处理并发都是采用的事件驱动异步非阻塞模式。其中nginx中处理并发用的是epoll,poll,queue等方式,node.js使用的是libev,它们对大规模的HTTP请求处理的都很好。
&&& 《node.js开发指南》是这样定义的:线程在执行中如果遇到(I/O&操作)如磁盘读写或网络通信,通常要耗费较长的时间,这时操作系统会剥夺这个线程的&CPU&控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为&阻塞。当&I/O&操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种&I/O&模式就是通常的同步式&I/O(Synchronous&I/O)或阻塞式&I/O(Blocking&I/O)。
&&& 非阻塞是这样定义的,当线程遇到&I/O&操作时,不会以阻塞的方式等待&I/O&操作的完成或数据的返回,而只是将&I/O&请求发送给操作系统,继续执行下一条语句。当操作系统完成&I/O&操作时,以事件的形式通知执行&I/O&操作的线程,线程会在特定时候处理这个事件。
对比阻塞与非阻塞
&&& 阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。
&&& 非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的&CPU&核心利用率永远是&100%,I/O&以事件的方式通知。
&&& 在阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞时还有其他线程在工作,多线程可以让&CPU&资源不被阻塞中的线程浪费。
&&& 而在非阻塞模式下,线程不会被&I/O&阻塞,永远在利用&CPU。多线程带来的好处仅仅是在多核&CPU&的情况下利用更多的核。
&&& 来看看《深入浅出Node.js》对异步I/O的解释,在操作系统中,程序运行的空间分为内核空间和用户空间。我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务。
&&&&I/O的阻塞与非阻塞的解释
&&& 阻塞模式的I/O会造成应用程序等待,直到I/O完成。同时操作系统也支持将I/O操作设置为非阻塞模式,这时应用程序的调用将可能在没有拿到真正数据时就立即返回了,为此应用程序需要多次调用才能确认I/O操作完全完成。
&&& I/O的同步与异步I/O的同步与异步出现在应用程序中。如果做阻塞I/O调用,应用程序等待调用的完成的过程就是一种同步状况。相反,I/O为非阻塞模式时,应用程序则是异步的。
&&& 参照《node.js入门经典》中对同步的解释,同步的代码意味着每一次执行一个操作,在一个操作完成之前,代码的执行会被阻塞,无法移到下一个操作上。也就是说代码的执行会在函数返回前停止。直到函数返回后,代码才会继续执行。
相反,异步就意味着函数的执行无需等待某个操作的结果就可以继续执行,其操作的结果会在事件发生时由回调来处理。
异步I/O优缺点
&&& 使用同步IO,它的优点是可以使程序调试方便,但是它的缺点也是明显的,程序的执行过程中如果入到一些耗时的IO操作,程序的执行都要等待该IO的完成,在这个等待的过程中,程序无法充分利用CPU,导致了CPU的闲置,为了充分利用CPU,和IO并行操作,常用的方法有2中:
&&& (1)多线程单进程
&&& 多线程的设计之处就是为了在共享的程序空间中,实现并行处理任务,从而达到充分利用CPU的效果。
&&& 多线程缺点:
&&& 其一、执行时(线程切换)上下文交换的开销较大,一个线程大约需要2M的内存空间,占用资源较大。
&&& 其二、状态同步(锁)的问题,它也使得程序的编写和调用复杂化。
&&& (2)单线程多进程
&&& 为了避免多线程造成的使用不便问题,有的语言选择了单线程保持调用简单化,采用启动多进程的方式来达到充分利用CPU和提升总体的并行处理能力。它的缺点在于业务逻辑复杂时(涉及多个I/O调用),因为业务逻辑不能分布到多个进程之间,事务处理时长要远远大于多线程模式。
异步I/O与轮询技术
&&&&当进行非阻塞I/O调用时,要读到完整的数据,应用程序需要进行多次轮询,才能确保读取数据完成,以进行下一步的操作。轮询技术的缺点在于应用程序要主动调用,会造成占用较多CPU时间片,性能较为低下。现存的轮询技术有以下这些:&read、select、poll、epoll、pselect、kqueue&
&&& read是性能最低的一种,它通过重复调用来检查I/O的状态来完成完整数据读取。
&&& select是一种改进方案,通过对文件描述符上的事件状态来进行判断。
&&& 操作系统还提供了poll、epoll等多路复用技术来提高性能。
&&& 轮询技术满足了异步I/O确保获取完整数据的保证。但是对于应用程序而言,它仍然只能算时一种同步,因为应用程序仍然需要主动去判断I/O的状态,依旧花费了很多CPU时间来等待。上一种方法重复调用read进行轮询直到最终成功,用户程序会占用较多CPU,性能较为低下。而实际上操作系统提供了select方法来代替这种重复read轮询进行状态判断。select内部通过检查文件描述符上的事件状态来进行判断数据是否完全读取。但是对于应用程序而言它仍然只能算是一种同步,因为应用程序仍然需要主动去判断I/O的状态,依旧花费了很多CPU时间等待,select也是一种轮询。
理想的异步I/O模型
&&& 理想的异步I/O应该是应用程序发起异步调用,而不需要进行轮询,进而处理下一个任务,只需在I/O完成后通过信号或是回调将数据传递给应用程序即可。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:556286次
积分:6716
积分:6716
排名:第2012名
原创:173篇
转载:80篇
评论:51条
(3)(3)(1)(2)(3)(2)(4)(10)(1)(1)(1)(1)(6)(5)(1)(4)(1)(2)(1)(2)(1)(2)(1)(1)(2)(5)(5)(5)(3)(8)(6)(10)(16)(12)(4)(5)(10)(6)(7)(4)(12)(16)(8)(22)(24)(5)更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
收藏成功,可进入查看所有收藏列表
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看:
并发|并发机制|并发教程—异步事件处理的两种方法
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/164eL4
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/164eL4
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
爸爸去哪儿2游戏 立即参与
并发|并发机制|并发教程—异步事件处理的两种方法
播放量数据:
你可能还想订阅他们:
&正在加载...
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"&
&a href="javascript:void(0);"&
&span>{{start}}-{{end}}&/span&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"&
&a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《》剧集:
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入300字
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制CUDA编程接口:异步并发执行的概念和API
 作者: yyfn风辰 编辑:
  【IT168技术】本文主要描述了支持系统中不同层次的异步并发执行的概念和API。  相关阅读:            1.主机和设备间异步执行  为了易于使用主机和设备间的异步执行,一些函数是异步的:在设备完全完成任务前,控制已经返回给主机线程了。它们是: 内核发射; 设备间数据拷贝函数; 主机和设备内拷贝小于64KB的存储器块时; 存储器拷贝函数中带有Async后缀的; 设置设备存储器的函数调用。  程序员可通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用所有运行在系统上的应用的异步内核发射。提供这个特性只是为了调试,永远不能作为使软件产品运行得可靠的方式。 当应用通过CUDA调试器或CUDA profiler(cuda-gdb, CUDA Visual Profiler, Parallel Nsight)运行时,所有的内核发射都是同步的。  2.数据传输和内核执行重叠  一些计算能力1.1或更高的设备可在内核执行时,在分页锁定存储器和设备存储器之间拷贝数据。应用可以通过检查asyncEngineCount 设备属性查询这种能力,如果其大于0,说明设备支持数据传输和内核执行重叠。这种能力目前只支持不涉及CUDA数组和使用cudaMallocPitch()分配的二维数组的存储器拷贝( 见前文,可阅读&相关阅读&中的文章)。  3. 并发内核执行  一些计算能力2.x的设备可并发执行多个内核。应用可以检查concurrentKernels属性以查询这种能力)(后续文章将介绍),如果等于1,说明支持。 设备最大可并发执行的内核数目是16。 来自不同CUDA上下文的内核不能并发执行。 使用了许多纹理或大量本地存储器的内核和其它内核并发执行的可能性比较小。  4. 并发数据传输  在计算能力2.x的设备上,从主机分页锁定存储器复制数据到设备存储器和从设备存储器复制数据到主机分页锁定存储器,这两个操作可并发执行。 应用可以通过检查asyncEngineCount 属性查询这种能力,如果等于2,说明支持。  5. 流  应用通过流管理并发。流是一系列顺序执行的命令(可能是不同的主机线程发射)。另外,流之间相对无序的或并发的执行它们的命令;这种行为是没有保证的,而且不能作为正确性的的保证(如内核间的通信没有定义)。  ①创建和销毁  可以通过创建流对象来定义流,且可指定它作为一系列内核发射和设备主机间存储器拷贝的流参数。下面的代码创建了两个流且在分页锁定存储器中分配了一个名为hostPtr的浮点数组。cudaStream_t stream[<span style="color: #];for (int i = <span style="color: #; i & <span style="color: #; ++i)cudaStreamCreate(&stream[i]); float* hostPcudaMallocHost((void**)&hostPtr, <span style="color: # * size);&  下面的代码定义的每个流是一个由一次主机到设备的传输,一次内核发射,一次设备到主机的传输组成的系列。for (int i = <span style="color: #; i & <span style="color: #; ++i){cudaMemcpyAsync(inputDevPtr + i * size, hostPtr + i * size,size, cudaMemcpyHostToDevice, stream[i]);MyKernel&&&<span style="color: #0, <span style="color: #2, <span style="color: #, stream[i]&&& (outputDevPtr + i * size, inputDevPtr + i * size, size);cudaMemcpyAsync(hostPtr + i * size, outputDevPtr + i * size, size, cudaMemcpyDeviceToHost, stream[i]);}  每个流将它的hostPtr输入数组的部分拷贝到设备存储器数组inputdevPtr,调用MyKernel()内核处理inputDevPtr,然后将结果outputDevPtr传输回hostPtr同样的部分。后文描述了例子中的流如何依赖设备的计算能力重叠。必须注意为了使用重叠hostPtr必须指向分页锁定主机存储器。  调用cudaStreamDestroy()来释放流。for (int i = <span style="color: #; i & <span style="color: #; ++i)&cudaStreamDestroy(stream[i]);&  cudaStreamDestroy()等待指定流中所有之前的任务完成,然后释放流并将控制权返回给主机线程。
第1页:第2页:
处理 SSI 文件时出错
已有条评论
处理 SSI 文件时出错
处理 SSI 文件时出错

我要回帖

更多关于 ajax异步 并发数量 的文章

 

随机推荐