rt

解决方案 »

  1.   

    http://blog.csdn.net/windcsn/archive/2005/07/20/429652.aspx
      

  2.   

    阻塞和非阻塞是对应面向连接和非面向连接的,互联网上跑的协议tcp/udp都是以ip层协议做为基础的,而ip层协议是非面向连接的,而协议栈实现tcp和udp的原理不同,拿tcp来说,对于数据它需要收到包1以后,然后收包2,如果这时候包3到了包2没有到他是不会处理包3的,于是包3还要重新发,对于
    udp协议他是把所有的包收到以后检测缺少哪一个,所以针对不同的网络状况(速度和连通性)不同的协议有各自的优势,而楼主说的:使用非阻塞套接字 比使用 阻塞套接字 性能要好 效率要高是针对特定的应用,性能和效率也是相对的,可能服务器需要同时处理N的请求和传输,如果打开一个进程或线程处理一个会话(阻塞套接字),很可能由于资源不够用而造成性能降低,而如果用非阻塞方式,则可以减少资源占用,从而性能得到提高。
      

  3.   

    看到一本书里说“非阻塞套接字能更好的在非占先的Windows环境下工作” ,但是没有解释。请问为什么说
    “非阻塞套接字能更好的在非占先的Windows环境下工作”?????
      

  4.   

    贴出 windcsn(向所有的朋友学习!) 提供的 http://blog.csdn.net/windcsn/archive/2005/07/20/429652.aspx
    影响网络应用程序性能的因素
    ==================== 
    随着网络的发展,越来越多的应用程序需要依赖于网络,所以网络的性能直接影响到我们应用程序的性能。那么都有那些因素影响到网络程序的性能来?我们以Windows平台上的应用程序来分析,首先将影响因素分为两个部分:基础网络部分,应用程序的网络驱动部分。基础网络部分指物理的网络结构和链路,主要有下面几个方面的因素:网络的速率和带宽。这是一个根本的问题,如果网络的基础设施不够快的话,那么其他都面谈。
    通讯计算机之间的距离和路由。最基本的知识,在LAN内的应用程序就能够跑的飞快,因为基本上LAN的计算机第一个条件满足了,而且距离短,且路由跳数少,但对于WAN的应用程序来说距离和路由是决定程序性能的很重要的方面,一般来说距离越远,信息的传输延迟时间越长,而路由的跳数基本上与距离有关,但路由的路径却可以确定,那么选择一个好的路由(时延最小的)是必要的。时延的大小可以通过tracert或其他的工具来测量。
    计算机的处理能力。一般情况下,CPU频率高的计算机处理起来要比CPU低的高,特别对于需要高速传输数据的应用程序,某个CPU频率可能是处理流量的极限,但使用相对频率高的CPU可能轻松处理。另外CPU的频率高低对程序的影响在发送和接收端都存在,如果接收端不能很快的从缓冲区中把数据取出来,那么发送端必然会收到0窗口的报告,从而停止等待对方的窗口恢复(TCP),造成本来可以利用的带宽被浪费。
    那么在给定的基础网络部分之上怎么样尽量利用其发挥最大的性能着就属于网络应用程序本身编写的责任了,这也是很有讲究的,下面基本方面可以参考:使用阻塞套接字。阻塞套接字可能会对应用程序的性能造成影响,在阻塞套接字时,程序必须等待SOCKET处理完毕或者出错后才返回,这段时间CPU就无聊的等待,对于非阻塞可以在这段时间做一些数据准备工作,一旦SOCKET可以用就立即发送数据,并行性更好。
    频繁的调用send和recv。如果发送很很小的数据包且流量很大的时候(例如:每秒30000个150字节的包),而一次只发送一个包,就可能导致每秒中要调用30000次send函数,这个代价很大,因为每次调用send都要从用户态到核心态的switch,所以这个时候应该尽量减少send的调用次数,例如使用WSASend或用一个更大的发送缓冲区。对于recv也是同样的结果,最好使用一个较大的缓冲区来接收,然后使用内存COPY。实践发现,内存COPY比调用send或recv耗费的CPU时钟周期要少的多。
    频繁的出错。对于在套接字不可用的时候调用send或recv函数,只会导致出错,而每出错一次就浪费一定的CPU周期,这个代价比较大,所以尽量保证每次调用send或recv的时候都能够正确,因此应该在调用他们之前使用select函数来检查一下(对于非阻塞),在出错之后也要检查等待可用后再调用。
    不必要的网络数据量。网络传输数据的时候即使一个无用的字节也是负担,特别对于WAN,所以在自己定义数据包的时候应该尽量采用最小化的原则,例如,使用bit可以完成的就不要使用一个字节,使用一个字节完成的就不要用两个字节(当然最小也的一个字节),这个可以参考TCP/IP各类协议定义的时候采用的格式,非常精简。
      

  5.   

    请问为什么说
    “非阻塞套接字能更好的在非占先的Windows环境下工作”?????
      

  6.   

    他的意思是说,非强占的操作系统可以提供线程调度,这样,当你的网络不可用的时候,可以抓紧着段时间来干其他的事情,例如数据准备,检查,如果是强占式,一旦某个进程占有了CPU不放,直到执行完成,这个就不好办了,那么你的程序如果没有事先占有CPU,你就的等别人了,或者你必须等网络。。
      

  7.   

    无论在哪里非阻塞都应该比阻塞更好。特别是在只有进程的某些Unix里面,如果阻塞了,那么整个进程就全完了,要等待这个阻塞操作结束或者超时。对于Windows来说还好点,多线程下面仅仅是阻塞一个线程而已……非阻塞在单socket的情况下操作起来比阻塞要复杂点,但是对于多个socket并且要求实时性比较高的场合下基本上阻塞就不能用。譬如,socket A先进行了一个阻塞操作,那么不超时/不结束调用的话,代码的控制权不会返回,那么B socket上面就算有数据需要被接受并且处理,由于已经阻塞在A上面了,此时没有办法去处理B上面的数据。而非阻塞的时候调用立即返回,B就可以被处理。
      

  8.   

    select其实局限比较大,Unix下面经典实现是一个32bit的位向量,也就是说最多监视32个文件描述符,Windows下面好像是64个吧,记不清了……虽说处理性能还可以,但是存在了一个硬限制,束手束脚……