题外话:我们现在要仔细的说一说I/O多路复用机制,因为这个说法实在是太通俗了,通俗到一般人都不懂是什么意思。博主打一个比方:小曲在S城开了一家快递店,负责同城快送服务。小曲因为资金限制,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递。

经营方式一
客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送快递。慢慢的小曲就发现了这种经营方式存在下述问题

  • 几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递

  • 随着快递的增多,快递员也越来越多,小曲发现快递店里越来越挤,没办法雇佣新的快递员了

  • 快递员之间的协调很花时间

综合上述缺点,小曲痛定思痛,提出了下面的经营方式

经营方式二
小曲只雇佣一个快递员。然后呢,客户送来的快递,小曲按送达地点标注好,然后依次放在一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。

对比
上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢。在上述比喻中:

  • 每个快递员------------------>每个线程

  • 每个快递-------------------->每个socket(I/O流)

  • 快递的送达地点-------------->socket的不同状态

  • 客户送快递请求-------------->来自客户端的请求

  • 小曲的经营方式-------------->服务端运行的代码

  • 一辆车---------------------->CPU的核数

于是我们有如下结论
1、经营方式一就是传统的并发模型,每个I/O流(快递)都有一个新的线程(快递员)管理。
2、经营方式二就是I/O多路复用。只有单个线程(一个快递员),通过跟踪每个I/O流的状态(每个快递的送达地点),来管理多个I/O流。

下面类比到真实的redis线程模型,如图所示

参照上图,简单来说,就是。我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
需要说明的是,这个I/O多路复用机制,redis还提供了select、epoll、evport、kqueue等多路复用函数库,大家可以自行去了解。

转载于:https://www.cnblogs.com/zuichuyouren/p/11122674.html

非阻塞I/O多路复用机制相关推荐

  1. Redis非阻塞I/O多路复用机制

    小曲在S城开了一家快递店,负责同城快送服务.小曲因为资金限制,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递. 经营方式一 客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送 ...

  2. 网络传输中的两个阶段、阻塞IO、非阻塞IO和多路复用

    今天学习了网络传输中的两个阶段.阻塞IO.非阻塞IO和多路复用 一.网络传输中的两个阶段 分别是 waitdata 和 copydata send就是copydata recv是waitdata和co ...

  3. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

  4. 网络编程06-服务器编程非阻塞IO、多路复用

    目录 一.服务器编程中四种高性能IO模型 1.阻塞IO 2.非阻塞 IO 3.多路复用 4.信号驱动 二.阻塞IO 三.非阻塞IO 1.阻塞IO与非阻塞IO之间的差异 2.如何给文件描述符设置非阻塞属 ...

  5. 阻塞IO、非阻塞IO和多路复用IO

    1.阻塞IO模型   最传统的一种IO模型,即在读写数据过程中会发生阻塞现象.   当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户 ...

  6. Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制

    三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0);       //获取文件的Mode值     fcntl(sockfd, F ...

  7. 阻塞IO 非阻塞IO IO多路复用 异步IO 区别

    Linux中五种IO模型:阻塞IO模型.非阻塞IO模型.IO复用模型.信号驱动IO模型.异步IO模型 linux的内核将所有外部设备都看作一个文件来操作,针对一个文件的读写会调用内核提供的系统命令,返 ...

  8. 嵌入式驱动初级-阻塞与非阻塞

    文章目录 前言 一.五种IO模型 二.阻塞与非阻塞 三.多路复用 四.信号驱动 前言 记录嵌入式驱动学习笔记 一.五种IO模型 当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 ...

  9. 网络IO之阻塞、非阻塞、同步、异步总结

    1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详 ...

最新文章

  1. LeetCode 41. First Missing Positive--Python 解法--数学题-找到不存在的最小正整数-O(1)空间复杂度
  2. ner pytorch project code
  3. 极力推荐python初学者使用wingIDE
  4. 递归删除N天前的文件夹及子文件夹下的特定文件
  5. docker与虚拟机的对比
  6. [leetcode] 62 Unique Paths (Medium)
  7. php 上传加水印,php 图片上传加水印(自动增加水印)
  8. spark 数据存储
  9. 【JavaScript脚本】——T1基本语法
  10. 2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用
  11. linux下Qt cannot find -lGL错误的解决方法
  12. 代码chaid_R或Python中的CHAID决策树
  13. 单机类似节奏大师游戏源码项目
  14. Thinkphp金融超市贷超平台源码带三级分销
  15. Win7启动慢,元凶竟是闲置eSATA接口,快下补丁
  16. regester正则用法_Regester(正则表达式测试器)官方版
  17. FlashFXP,小编带你认识什么是FlashFXP软件
  18. Linux常用命令汇总 - 近乎全量命令!
  19. 禁用计算机的声卡设备,电脑声音被禁用了怎么办
  20. SpringMVC在web.xml中配置DispatcherServlet拦截了静态资源访问

热门文章

  1. cocoapods的安装(这真是一个神奇的东西,每次安装的方法都不一样,而且很容易出现各种各样的错误)...
  2. Elasticsearch 搜索不到数据问题(_mapping 设置)
  3. 基于sqlite数据库的C语言编程
  4. c# datatable用法总结
  5. 第一次使用 Blog
  6. Unity4.6证书激活问题
  7. iOS 数据持久化-- FMDB
  8. LeetCode题解-3-Longest Substring Without Repeating Characters
  9. PHP中面向对象的图片处理类
  10. 函数的二义性与函数对象的传递问题(通过实现vector的to_string示例)