1、阻塞与非阻塞服务器
一般的,对一个文件描述符指定的文件或设备, 有两种工做方式:阻塞与非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行都写时,若是当时没有东西可读,或者暂时不可写, 程序就会进入等待状态,直到有东西可读或可写为止,而对于非阻塞状态, 若是没有东西可读, 或者不可写, 读写函数立刻返回, 而不会等待异步
2、阻塞与非阻塞方式的作法:socket
一种经常使用作法是:每创建一个Socket连接时, 同时创建一个新线程对该Socket进行单独通讯(采用阻塞的方式通讯)。这种方式具备很高的响应速度,而且控制起来也很简单, 在连接数较少的时候很是有效, 可是若是对每个连接都产生一个线程,无疑是对系统资源的一种浪费, 若是连接数较多将会出现资源不足的状况函数
一种较高效的作法是:服务保持一个Socket连接列表, 而后对这个列表进行轮询, 若是发现某个Socket端口上有数据可读时(读就绪),则调用该socekt连接的相应读操做;若是发现某个socekt端口上有数据可写时(写就绪),则调用该socket连接的相应写操做;若是某个端口的Socket连接已将中断, 则调用相应阿析构方法关闭该端口。这样能充分利用服务器资源, 效率获得了很大提升线程
3、非阻塞式的核心优点事件
传统的阻塞式IO, 每一个连接必需要开一个线程来处理, 而且没处理完线程不能退出 非阻塞式IO, 居于反应器模式,用于时间多路分离和分派的体系结构模式, 因此能够利用线程池来处理。事件来了就处理, 处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接, 非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就须要开10000个来处理。若是连接较多将会出现资源不足的状况。非阻塞式核心有时就在这里资源
4、非阻塞式的核心优点分析效率
为何会这样,下面就对他们作进一步细致具体的分析: 首先,咱们来分析传统阻塞式IO的瓶颈在哪里。在连接很少的状况下, 传统IO编写容易方便使用。可是随着连接数的增多, 传统IO就不行了。由于前面说过, 传统IO处理每一个连接都要消耗一个线程, 而程序的效率当线程数很少时随着线程数的增长而增长, 可是到必定数量以后, 是随着线程数的增长而减小。这里咱们的出结论,传统阻塞式IO的瓶颈在于不能处理过多的连接 而后, 非阻塞式IO的出现目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞式IO处理连接的线程数和连接数是没有联系的,也就是说处理10000个连接非阻塞IO不须要10000个线程, 你能够用1000个也能够用2000个线程来处理。由于非阻塞式IO处理连击是异步的。当某个连接发送请求到服务器,服务器把这个连接请求看成一个请求"事件",并把这个"事件"分配给相应的函数处理。咱们能够把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就能够异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了线程池
5、总结请求
阻塞式IO 1 优势: 编写容易方便使用 2 缺点: 处理每一个连接都要消耗一个线程,当线程达到某个数目时,程序的效率会下降; 当连接较多将会出现资源不足的状况
非阻塞式IO 1 优势: 解决了传统阻塞式IO的瓶颈在于不能处理过多的连接