当前位置: 首页 > news >正文

织梦pc怎么做手机网站网站开发和运作的财务预算

织梦pc怎么做手机网站,网站开发和运作的财务预算,搭建wordpress博客,简述网站制作的流程同步、异步、阻塞和非阻塞是几种基本的sockets调用方式#xff0c;也是在进行网络编程时需要理解和区分的基本概念之一。关于这方面的文章和讨论相当丰富#xff0c;这里着重讨论其中两个比较容易混淆的两个#xff0c;即非阻塞与异步的关系。 先还是简单所列一下几中调用方… 同步、异步、阻塞和非阻塞是几种基本的sockets调用方式也是在进行网络编程时需要理解和区分的基本概念之一。关于这方面的文章和讨论相当丰富这里着重讨论其中两个比较容易混淆的两个即非阻塞与异步的关系。 先还是简单所列一下几中调用方式的常见解释 同步函数没有执行完不返回线程被挂起   阻塞没有收完数据函数不返回线程也被挂起   异步函数立即返回通过事件或是信号通知调用者   非阻塞函数立即返回通过select通知调用者 同步和阻塞是比较容易弄明白其含义的但在实际编程过程中异步与非阻塞的概念却并不能直观地区分于“通过事件或是信号通知调用者”与“通过select通知调用者”这种字面解释。   阻塞通信意味着通信方法在尝试访问套接字或者读写数据时阻塞了对套接字的访问。在 JDK 1.4 之前绕过 阻塞限制的方法是无限制地使用线程但这样常常会造成大量的线程开销对系统的性能和可伸缩性产生影响。java.nio 包改变了这种状况允许服务器有效地使用 I/O 流在合理的时间内处理所服务的客户请求。   没有非阻塞通信这个过程就像我所喜欢说的“为所欲为”那样。基本上这个过程就是发送和读取任何能够发送/读取的东西。如果没有可以读取的东西它就中止读操作做其他的事情直到能够读取为止。当发送数据时该过程将试图发送所有的数据但返回实际发送出的内容。可能是全部数据、部分数据或者根本没有发送数据。   阻塞与非阻塞相比确实有一些优点特别是遇到错误控制问题的时候。在阻塞套接字通信中如果出现错误该访问会自动返回标志错误的代码。错误可能是由于网络超时、套接字关闭或者任何类型的 I/O 错误造成的。在非阻塞套接字通信中该方法能够处理的唯一错误是网络超时。为了检测使用非阻塞通信的网络超时需要编写稍微多一点的代码以确定自从上一次收到数据以来已经多长时间了。   哪种方式更好取决于应用程序。如果使用的是同步通信如果数据不必在读取任何数据之前处理的话阻塞通信更好一些而非阻塞通信则提供了处理任何已经读取的数据的机会。而异步通信如 IRC 和聊天客户机则要求非阻塞通信以避免冻结套接字。   Java中的阻塞和非阻塞IO包各自的优劣思考   NIO 设计背后的基石反应器模式用于事件多路分离和分派的体系结构模式。 反应器Reactor用于事件多路分离和分派的体系结构模式   通常的对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。   一种常用做法是每建立一个Socket连接时同时创建一个新线程对该Socket进行单独通信采用阻塞的方式通信。这种方式具有很高的响应速度并且控制起来也很简单在连接数较少的时候非常有效但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费如果连接数较多将会出现资源不足的情况。   另一种较高效的做法是服务器端保存一个Socket连接列表然后对这个列表进行轮询如果发现某个Socket端口上有数据可读时读就绪则调用该socket连接的相应读操作如果发现某个 Socket端口上有数据可写时写就绪则调用该socket连接的相应写操作如果某个端口的Socket连接已经中断则调用相应的析构方法关闭该端口。这样能充分利用服务器资源效率得到了很大提高。   传统的阻塞式IO每个连接必须要开一个线程来处理并且没处理完线程不能退出。   非阻塞式IO由于基于反应器模式用于事件多路分离和分派的体系结构模式所以可以利用线程池来处理。事件来了就处理处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理假设当前有10000个连接非阻塞方式可能用1000个线程的线程池就搞定了而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。   为什么会这样下面就对他们做进一步细致具体的分析   首先我们来分析传统阻塞式IO的瓶颈在哪里。在连接数不多的情况下传统IO编写容易方便使用。但是随着连接数的增多问题传统IO就不行了。因为前面说过传统IO处理每个连接都要消耗 一个线程而程序的效率当线程数不多时是随着线程数的增加而增加但是到一定的数量之后是随着线程数的增加而减少。这里我们得出结论传统阻塞式IO的瓶颈在于不能处理过多的连接。   然后非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢非阻塞IO处理连接的线程数和连接数没有联系也就是说处理10000个连接非阻塞IO不需要10000个线程你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个连接发送请求到服务器服务器把这个连接请求当作一个请求事件并把这个事件分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。   转载声明 本文转自 http://blog.csdn.net/liuzhengkang/archive/2008/12/20/3562115.aspx     非阻塞 Socoket 编程   在互联网相当普及的今天在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。聊天室的实现方法有很多但都是利用所谓的“多用户空间”来对信息进行交换具有典型的多路I/O的架构。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。其架构如图一所示。这样的实现在用户的眼里就是聊天室内任何一个人输入一段字符之后,其他用户都可以得到这一句话。这种“多用户空间”的架构在其他多点通信程序中应用的非常广泛其核心就是多路I/O通信。多路I/O通信又被称为I/O多路复用I/OMultiplexing一般被使用在以下的场合客户程序需要同时处理交互式的输入和同服务器之间的网络连接时需要处理I/O多路复用问题客户端需要同时对多个网络连接作出反应这种情况很少见TCP服务器需要同时处理处于监听状态和多个连接状态的socket服务器需要处理多个网络协议的socket;服务器需要同时处理不同的网络服务和协议。聊天室所需要面对的情况正是第一和第三两种情况。我们将通过在TCP/IP协议之上建立一个功能简单的聊天室让大家更加了解多路I/O以及它的实现方法。我们要讨论的聊天室功能非常简单, 感兴趣的朋友可以将其功能扩展, 发展成一个功能比较完整的聊天室, 如加上用户认证, 用户昵称, 秘密信息, semote 等功能.首先它是一个 client/server 结构的程序, 首先启动 server, 然后用户使用 client进行连接. client/server 结构的优点是速度快, 缺点是当 server 进行更新时,client 也必需更新. 网络初始化首先是初始化 server, 使server 进入监听状态: (为了简洁起见,以下引用的程序与实际程序略有出入, 下同)sockfd socket( AF_INET,SOCK_STREAM, 0);// 首先建立一个 socket, 族为 AF_INET, 类型为 SOCK_STREAM.// AF_INET ARPA Internet protocols 即使用 TCP/IP 协议族// SOCK_STREAM 类型提供了顺序的, 可靠的, 基于字节流的全双工连接.// 由于该协议族中只有一个协议, 因此第三个参数为 0bind( sockfd, ( struct sockaddr *)serv_addr, sizeof( serv_addr));// 再将这个 socket 与某个地址进行绑定.// serv_addr 包括 sin_family AF_INET 协议族同 socket// sin_addr.s_addr htonl( INADDR_ANY) server 所接受的所有其他// 地址请求建立的连接.// sin_port htons( SERV_TCP_PORT) server 所监听的端口// 在本程序中, server 的 IP和监听的端口都存放在 config 文件中.listen( sockfd, MAX_CLIENT);// 地址绑定之后, server 进入监听状态.// MAX_CLIENT 是可以同时建立连接的 client 总数.server 进入 listen 状态后, 等待 client 建立连接。Client端要建立连接首先也需要初始化连接sockfd socket( AF_INET,SOCK_STREAM,0));// 同样的, client 也先建立一个 socket, 其参数与 server 相同.connect( sockfd, ( struct sockaddr *)serv_addr, sizeof( serv_addr));// client 使用 connect 建立一个连接.// serv_addr 中的变量分别设置为:// sin_family AF_INET 协议族同 socket// sin_addr.s_addr inet_addr( SERV_HOST_ADDR) 地址为 server// 所在的计算机的地址.// sin_port htons( SERV_TCP_PORT) 端口为 server 监听的端口.当 client 建立新连接的请求被送到Server端时, server 使用 accept 来接受该连接:accept( sockfd, (struct sockaddr*)cli_addr, cli_len);// 在函数返回时, cli_addr 中保留的是该连接对方的信息// 包括对方的 IP 地址和对方使用的端口.// accept 返回一个新的文件描述符.在 server 进入 listen 状态之后, 由于已有多个用户在线所以程序需要同时对这些用户进行操作并在它们之间实现信息交换。这在实现上称为I/O多路复用技术。多路复用一般有以下几种方法非阻塞通信方法将文件管道通过fcntl()设为非阻塞通信方式每隔一端时间对他们实行一次轮询以判断是否可以进行读写操作。这种方式的缺点是费用太高大部分资源浪费在轮询上。子进程方法应用多个子进程每一个对一个单工阻塞方式通信。所有子进程通过IPC和父进程进行通信。父进程掌管所有信息。这种方式的缺点是实现复杂而且由于IPC在各个操作系统平台上并不完全一致会导致可移植性降低。信号驱动SIGIO的异步I/O方法首先异步I/O是基于信号机制的并不可靠。其次单一的信号不足以提供更多的信息来源。还是需要辅助以其他的手段实现上有很高的难度。select ()方法在BSD中提供了一种可以对多路I/O进行阻塞式查询的方法——select()。它提供同时对多个I/O描述符进行阻塞式查询的方法利用它我们可以很方便的实现多路复用。根据统一UNIX规范的协议,POSIX也采用了这种方法因此我们可以在大多数操作系统中使用select方法。使用专门的I/O多路复用器在“UNIX? SYSTEM V Programmers Guide: STREAMS”一书中详细的说明了构造和使用多路复用器的方法。这里就不再详述了。 我们下面分别讨论多路I/O的两种实现方法:1. 非阻塞通信方法对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。缺省情况下, 文件描述符处于阻塞状态。在实现聊天室时, server 需要轮流查询与各client 建立的 socket,一旦可读就将该 socket 中的字符读出来并向所有其他client 发送。并且, server 还要随时查看是否有新的 client 试图建立连接,这样, 如果 server 在任何一个地方阻塞了, 其他client 发送的内容就会受到影响,得不到服务器的及时响应。新 client试图建立连接也会受到影响。所以我们在这里不能使用缺省的阻塞的文件工作方式而需要将文件的工作方式变成非阻塞方式。在UNIX下函数fcntl()可以用来改变文件I/O操作的工作方式函数描述如下fcntl( sockfd, F_SETFL, O_NONBLOCK);// sockfd 是要改变状态的文件描述符.// F_SETFL 表明要改变文件描述符的状态// O_NONBLOCK 表示将文件描述符变为非阻塞的.为了节省篇幅我们使用自然语言描述聊天室 server :while ( 1)    if 有新连接 then 建立并记录该新连接;    for ( 所有的有效连接)    begin        if 该连接中有字符可读 then        begin        读入字符串            for ( 所有其他的有效连接)            begin            将该字符串发送给该连接;            end;        end;    end;end.由于判断是否有新连接, 是否可读都是非阻塞的, 因此每次判断,不管有还是没有, 都会马上返回. 这样,任何一个 client 向 server 发送字符或者试图建立新连接,都不会对其他 client 的活动造成影响。对 client 而言, 建立连接之后, 只需要处理两个文件描述符, 一个是建立了连接的socket 描述符, 另一个是标准输入. 和 server 一样, 如果使用阻塞方式的话,很容易因为其中一个暂时没有输入而影响另外一个的读入.. 因此将它们都变成非阻塞的,然后client 进行如下动作:while ( 不想退出)begin    if ( 与 server 的连接有字符可读)    begin    从该连接读入, 并输出到标准输出上去.    End;    if ( 标准输入可读)    Begin    从标准输入读入, 并输出到与 server 的连接中去.    End;End.上面的读写分别调用这样两个函数:read( userfd[i], line, MAX_LINE);// userfd[i] 是指第 i 个 client 连接的文件描述符.// line 是指读出的字符存放的位置.// MAX_LINE 是一次最多读出的字符数.// 返回值是实际读出的字符数.write( userfd[j], line, strlen( line));// userfd[j] 是第 j 个 client 的文件描述符.// line 是要发送的字符串.// strlen( line) 是要发送的字符串长度.分析上面的程序可以知道, 不管是 server 还是 client, 它们都不停的轮流查询各个文件描述符, 一旦可读就读入并进行处理. 这样的程序, 不停的在执行, 只要有CPU 资源, 就不会放过。因此对系统资源的消耗非常大。server 或者 client 单独执行时,CPU 资源的 98% 左右都被其占用。极大的消耗了系统资源。select 方法因此虽然我们不希望在某一个用户没有反应时阻塞其他的用户但我们却应该在没有任何用户有反应的情况之下停止程序的运行让出抢占的系统资源进入阻塞状态。有没有这种方法呢现在的UNIX系统中都提供了select方法具体实现方式如下select 方法中, 所有文件描述符都是阻塞的. 使用 select 判断一组文件描述符中是否有一个可读(写), 如果没有就阻塞, 直到有一个的时候就被唤醒. 我们先看比较简单的 client 的实现:由于 client 只需要处理两个文件描述符, 因此, 需要判断是否有可读写的文件描述符只需要加入两项:FD_ZERO( sockset);// 将 sockset 清空FD_SET( sockfd, sockset);// 把 sockfd 加入到 sockset 集合中FD_SET( 0, sockset);// 把 0 (标准输入) 加入到 sockset 集合中然后 client 的处理如下:while ( 不想退出)select( sockfd1, sockset, NULL, NULL, NULL);// 此时该函数将阻塞直到标准输入或者 sockfd 中有一个可读为止// 第一个参数是 0 和 sockfd 中的最大值加一// 第二个参数是 读集, 也就是 sockset// 第三, 四个参数是写集和异常集, 在本程序中都为空// 第五个参数是超时时间, 即在指定时间内仍没有可读, 则出错// 并返回. 当这个参数为NULL 时, 超时时间被设置为无限长.// 当 select 因为可读返回时, sockset 中包含的只是可读的// 那些文件描述符.if ( FD_ISSET( sockfd, sockset))// FD_ISSET 这个宏判断 sockfd 是否属于可读的文件描述符从 sockfd 中读入, 输出到标准输出上去.}if ( FD_ISSET( 0, sockset))// FD_ISSET 这个宏判断 sockfd 是否属于可读的文件描述符从标准输入读入, 输出到 sockfd 中去.}重新设置 sockset. (即将 sockset 清空, 并将 sockfd 和 0 加入)}下面看 server 的情况:设置 sockset 如下:FD_ZERO( sockset);FD_SET( sockfd, sockset);for ( 所有有效连接)FD_SET( userfd[i], sockset);}maxfd 最大的文件描述符号 1;server 处理如下:while ( 1)select( maxfd, sockset, NULL, NULL, NULL);if ( FD_ISSET( sockfd, sockset))// 有新连接建立新连接, 并将该连接描述符加入到 sockset 中去了.}for ( 所有有效连接)if ( FD_ISSET ( userfd[i], sockset))// 该连接中有字符可读从该连接中读入字符, 并发送到其他有效连接中去.}}重新设置 sockset;}性能比较由于采用 select 机制, 因此当没有字符可读时, 程序处于阻塞状态,最小程度的占用CPU 资源, 在同一台机器上执行一个 server 和若干个client 时, 系统负载只有0.1左右, 而采用原来的非阻塞通信方法, 只运行一个 server, 系统负载就可以达到1.5左右. 因此我们推荐使用 select.参考文献[1] UNIX Network Programming Volume 1 W.Richard Stevens 1998 Prentice Hall[2] 计算机实用网络编程 汤毅坚 1993 人民邮电出版社[3] UNIX? SYSTEM V RELEASE 4 Programmers Guide:STREAMS ATT 1990 Prentice Hall[4] UNIX? SYSTEM V RELEASE 4 Network Programmers Guide ATT 1990 Prentice Hall所有源程序均登载在eDOC网站上如有需要可以去http://edoc.163.net下载 转载声明 本文转自 http://dev.gameres.com/Program/Control/noSocket.htm   转载于:https://www.cnblogs.com/springside4/archive/2010/09/19/2481764.html
http://www.zqtcl.cn/news/4149/

相关文章:

  • 营销型网站是啥意思深圳建网站哪个公司好
  • 江苏省住房保障建设厅网站企业网站开发报价单
  • 06628网页制作与网站建设网站后台链接怎么做
  • 网站排名超快网店运营培训哪里好
  • 福田企业建站推广服务公司成都idc机房托管
  • 陶哲轩wordpress乐云seo模板网站建设
  • 外国排版网站企业官网的意义
  • 响应式网站源码.net网站英文版是怎么做的
  • wordpress站点全屏高端文化网站
  • 如何进行网上品牌建设seo百度快速排名软件
  • 国外做电商网站有哪些南昌网站建设制作公司
  • 网站上存储播放视频怎么做特殊字体生成器
  • 发布网站后不可能存在的文件夹是做产品类网站有哪些
  • 天津网站开发建设公司彩票网站建设 极云
  • 松江网站建设多少钱wordpress xydown插件
  • 成都建设网站报价网页链接
  • 建设银行官网招聘网站短视频营销优势
  • o2o网站建设多少钱中国建设银行曲江支行网站
  • 怎么样管理网站wordpress 4.7 教程
  • 物流公司网站怎么做做招聘网站需要哪些手续
  • 东莞规划局官方网站网站建设商城建设
  • 怎样创建网站桌面快捷方式网站程序如何上传
  • 18.ppt网站是谁做的德持建设集团有限公司网站
  • 广东智能网站建设费用网站开发就业
  • 北京网站seo收费标准运营工资一般多少
  • 网站站点建设的端口php7跨设备网站开发pdf
  • 自媒体123网站广州本地生活app
  • 微网站的建设第一步是什么做网站的经历感想
  • jsp做网站用到什么技术网上注册营业执照
  • 微信的官方网站怎么做重庆seo博客推广