看网络通信框架,netty, thrift,java nio等,最后都会通过select, poll, epoll或者socket等进行通信。查了些网页,总结一下。做个笔记

1. Socket单线程阻塞通信,一次只能处理一个请求

  缺点:性能低

  优点:简单

2. 来一个请求,起一个线程

  缺点:cpu可能会升的很厉害,上下问切换性能损失

   优点:效率高

3. 线程池

  优点:省去了初始化线程工作

  缺点:应该仍然有线程上下文切换

4. select/poll

  把要监听的文件,如socket,文件,等注册到select/poll。内核轮询所有的文件,如果有文件(linux所有设备都可以看作文件)可以操作,返回给用户空间。用户空间轮询文件,找出可以操作的文件。这里如何判断文件是否可读,可写,是有设备驱动程序提供函数判断。内核调用设备驱动程序

  优点:

    1. 可以单线程管理多个文件,没有线程上下文切换

  缺点:

    1. 可以监听文件个数有限制,有资料说是1024,好像可以修改这个限制

    2. 轮询所有文件,如果要监听文件变得很多,效率会下降很快

    3. 这是个系统调用,调用开始把要监听所有文件拷贝到内核,内核返回时,会把准备好的文件拷贝到用户空间。用户和内核空间不断切换,需要拷贝的内容很多。效率不高

5. epoll

  同select/poll一样,把需要监听的文件注册到epoll。epoll提供了,添加要监听的文件,删除不监听文件。这些文件一直在内核,不会大量从用户空间拷贝到内核空间。有文件可读,这里网上有资料说是函数回调,不是select采用的轮询,返回可以操作的文件给用户空间。这里只有少量拷贝

  优点:

    1. 用户空间到内核空间拷贝量较小

    2. 内核空间到用户空间拷贝量小

    3. 不是轮询,函数回调。随着监听文件数增多,性能不会下降很厉害

  缺点:

    1. 编写应该比较复杂

总结:

  1. 需要处理的连接不是很多可以考虑用线程池

  2. select/poll不一定效率比线程池性能高,如,连接数不是很多

  3. epoll可以处理连接数很多的情况

参考:

  1. https://segmentfault.com/a/1190000003063859

  2. https://blog.csdn.net/shuxiaogd/article/details/50366039

  3. https://www.zhihu.com/question/20122137

select, poll, epoll笔记的更多相关文章

  1. 笔记-select,poll,epoll

    笔记-select,poll,epoll 1.      I/O多路复用 I/O多路复用是指:通过一种机制或一个进程,可以监视多个文件描述符,一旦描述符就绪(写或读),能够通知程序进行相应的读写操作. ...

  2. Select/Poll/Epoll异步IO

    IO多路复用 同步io和异步io,阻塞io和非阻塞io分别是什么,有什么样的区别? io模式 对于一次io 访问(以read为例),数据会先拷贝到操作系统内核的缓冲区,然后才会从操作系统内核的缓冲区拷 ...

  3. select/poll/epoll on serial port

    In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port t ...

  4. Linux下select&poll&epoll的实现原理(一)

    最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的st ...

  5. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  6. 多进程、协程、事件驱动及select poll epoll

    目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---P ...

  7. Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO

    本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO   1.  多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...

  8. select,poll,epoll的归纳总结区分

    Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...

  9. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

随机推荐

  1. DRF 的解析器和渲染器

    一.解析器 解析器作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentT ...

  2. HttpClient 基于连接池的使用

    场景:调用外部系统接口的http请求 要求: 1:可能是http请求,也可能是https请求 2:需要加入连接池的概念,不能每次发起请求都新建一个连接(每次连接握手三次,效率太低) 准备使用httpc ...

  3. 深入解析Close()和Dispose()的区别

    很多人都认为Close()方法内部会调用Dispose()方法,所以并没有本质的区别!实际上这个看法不是很准确,对有 些类来说,的确Close()和Dispose()没有本质区别,但是对有些类来说并非 ...

  4. BZOJ3156 防御准备 斜率优化dp

    Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sampl ...

  5. [CSU1911]Card Game(FWT)

    [vjudge-CSU1911] FWT_or #include<cstring> #include<iostream> #include<algorithm> # ...

  6. 最少拦截系统(线性dp)

    某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于 ...

  7. 执行npm install 时会报 operation not permitted,unlink......错

    问题现象:在我这项目目录中执行这命令就会报这个错. 问题原因: 后来查了查,说是 npm 5.4.0版本确实会有这个问题. https://github.com/npm/npm/issues/1828 ...

  8. HDU - 3652 数位DP 套路题

    题意:统计能被13整除和含有13的数的个数 解法没法好说的..学了前面两道直接啪出来了 PS.HDU深夜日常维护,没法交题,拿网上的代码随便对拍一下,输出一致 #include<bits/std ...

  9. 螺旋队列(p98)

    先判断这个坐标代表的数位于哪一层,然后依据该层最大的数去计算这个坐标所代表的数. #include"iostream" #include"stdio.h" #i ...

  10. GreenPlum 大数据平台--非并行备份(六)

    一,非并行备份(pg_dump) 1) GP依然支持常规的PostgreSQL备份命令pg_dump和pg_dumpall 2) 备份将在Master主机上创建一个包含所有Segment数据的大的备份 ...