文档章节

阻塞与非阻塞socket的有缺点

雪之丞
 雪之丞
发布于 2014/10/21 10:14
字数 1155
阅读 205
收藏 1

一、阻塞与非阻塞

通常的,对一个文件描述符指定的文件或设备, 有两种工作方式:阻塞与非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行都写时,如果当时没有东西可读,或者暂时不可写, 程序就会进入等待状态,直到有东西可读或可写为止,而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待

二、阻塞与非阻塞方式的做法:

一种常用做法是:每建立一个Socket链接时, 同时建立一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单, 在链接数较少的时候非常有效, 但是如果对每一个链接都产生一个线程,无疑是对系统资源的一种浪费, 如果链接数较多将会出现资源不足的情况

一种较高效的做法是:服务保持一个Socket链接列表, 然后对这个列表进行轮询, 如果发现某个Socket端口上有数据可读时(读就绪),则调用该socekt链接的相应读操作;如果发现某个socekt端口上有数据可写时(写就绪),则调用该socket链接的相应写操作;如果某个端口的Socket链接已将中断, 则调用相应阿析构方法关闭该端口。这样能充分利用服务器资源, 效率得到了很大提高

三、非阻塞式的核心优势

传统的阻塞式IO, 每个链接必须要开一个线程来处理, 并且没处理完线程不能退出 非阻塞式IO, 居于反应器模式,用于时间多路分离和分派的体系结构模式, 所以可以利用线程池来处理。事件来了就处理, 处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个链接, 非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果链接较多将会出现资源不足的情况。非阻塞式核心有时就在这里

四、非阻塞式的核心优势分析

为什么会这样,下面就对他们做进一步细致具体的分析: 首先,我们来分析传统阻塞式IO的瓶颈在哪里。在链接不多的情况下, 传统IO编写容易方便使用。但是随着链接数的增多, 传统IO就不行了。因为前面说过, 传统IO处理每个链接都要消耗一个线程, 而程序的效率当线程数不多时随着线程数的增加而增加, 但是到一定数量之后, 是随着线程数的增加而减少。这里我们的出结论,传统阻塞式IO的瓶颈在于不能处理过多的链接 然后, 非阻塞式IO的出现目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞式IO处理链接的线程数和链接数是没有联系的,也就是说处理10000个链接非阻塞IO不需要10000个线程, 你可以用1000个也可以用2000个线程来处理。因为非阻塞式IO处理连击是异步的。当某个链接发送请求到服务器,服务器把这个链接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了

五、总结

阻塞式IO 1 优点: 编写容易方便使用 2 缺点: 处理每个链接都要消耗一个线程,当线程达到某个数目时,程序的效率会降低; 当链接较多将会出现资源不足的情况

非阻塞式IO 1 优点: 解决了传统阻塞式IO的瓶颈在于不能处理过多的链接

本文转载自:http://www.cnblogs.com/sunada2005/p/3591378.html

上一篇: HTTP服务器
雪之丞
粉丝 13
博文 219
码字总数 51065
作品 0
浦东
程序员
私信 提问
11.python并发入门(part14阻塞I/O与非阻塞I/O,以及引入I/O多路复用)

一、初步了解什么是I/O模型。 1.回顾,用户态与内核态。 操作系统位于应用程序和硬件之间,本质上是一个软件,它由内核以及系统调用组成。 内核:用于运行于内核态,主要作用是管理硬件资源。...

苏浩智
2017/05/19
0
0
网络通信基础重难点解析 05 :socket 的阻塞模式和非阻塞模式

版权声明:欢迎关注我的微信公众号:「easyserverdev」,中文名:『高性能服务器开发』。 https://blog.csdn.net/analogous_love/article/details/88720858 socket 的阻塞模式和非阻塞模式 ...

analogous_love
03/21
0
0
使用select+非阻塞socket写的网络数据转发程序

使用select+非阻塞socket写的网络数据转发程序 从实践之中,我又学到东西了!使用select的时候,无论是使用非阻塞还是阻塞socket,调用recv和send函数返回0都意味着socket被远程关闭!!! ...

IMGTN
2012/11/27
0
0
第三章 - 通道

3 - Socket通道 新的socket通道类可以运行并且是的。这两个性能可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性。本节中我们会看到,再也没有为每个socket连接使用一个线...

jEpac
2016/08/27
3
0
Linux下阻塞与非阻塞IO

阻塞:顾名思义,就是指在执行设备操作时若不能获得资源则挂起操作,直到满足可操作的条件后再进行操作,被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件满足。 非阻塞:...

技术小阿哥
2017/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊Elasticsearch的MonitorService

序 本文主要研究一下Elasticsearch的MonitorService MonitorService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/MonitorService.java public class MonitorServic......

go4it
42分钟前
3
0
二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
55分钟前
3
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
今天
5
0
Guava RateLimiter限流源码解析和实例应用

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高...

算法之名
今天
13
0
国产达梦数据库与MySQL的区别

背景 由于项目上的需要,把项目实现国产化,把底层的MySQL数据库替换为国产的达梦数据库,花了一周的时间研究了国产的数据库-达梦数据库,它和MySQL有一定的区别,SQL的写法也有一些区别。 ...

TSMYK
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部