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

题外话:我们现在要仔细的说一说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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows平台WebRTC编译-VS2017

转载网站:https://blog.jianchihu.net/webrtc-build-vs2017.html 在音视频领域,想深入研究的话,必定会接触WebRTC。WebRTC是一个庞大的工程,就像是音视频领域的百科全书,音视频采集,编解码,传输…

Hadoop--初识Hadoop

什么是Hadoop? 搞什么东西之前,第一步是要知道What(是什么),然后是Why(为什么),最后才是How(怎么做)。但很多开发的朋友在做了多年项目以后,都习惯…

VS2019编译 当前最新版chromium

VS2019编译 当前最新版chromium 之前编译过webrtc和chromium, 由于长时间没用,被我删除了, 最近在最新版本的google浏览器上遇到了播放器兼容性问题,老版本的google浏览器是没问题,IE, 火狐浏览器也没问题&#xff0…

37signals为何砍掉中层?个人点评,高素质人才队伍工作,靠的是全体发挥综合能力,而不是靠......

为什么80%的码农都做不了架构师?>>> 37signals为何砍掉中层? 分享到 本文来源于:中欧商业评论 作者:潘芸 发表于:2013-08-21 11:09:41 http://www.cyzone.cn/a/20130821/244571.html 37signals有多位程序员&#…

ExtAspNet学习-利用AppBox框架快速创建项目(五)—完成项目含源代码

我们前边四个部分已经完成了框架需要的基础配置&#xff0c; 现在我们来完成项目 1、Subsonic 配置&#xff0c;首先在OraSurvey.DAO中添加App.config配置相关信息 View Code 1 <?xml version"1.0" encoding"utf-8" ?> 2 <configuration> 3…

linux+apache+mysql+php

linuxapachemysqlphp设置mysqll测试1网站注意&#xff1a;在安装或者测试的时候出现乱码的话&#xff0c;可以修改浏览器的编码一项将其改为适合的编码输入站点http://服务器地址/ecshop url会自动跳转到服务器地址/ecshop/install/index.php安装过程中会提示目录文件不可写&am…

android4.0.3 修改启动动画和开机声音

1. Linux 系统启动&#xff0c;出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片)&#xff1b;2. Android平台启动初始化&#xff0c;出现"A N D R I O D"文字字样画面&#xff1b;3. Android平台图形系统启动&#xff0c;出现含闪动的ANDROID字样…

VMWare虚拟机NAT模式静态IP联网配置

使用静态IP&#xff0c;而不选用DHCP的主要原因是避免每次重启计算机后&#xff0c;虚拟机系统的IP发生变化&#xff0c;导致常常需要修改宿主机器远程连接虚拟机服务(例如Mysql) 环境 项目版本号VmwareVmware Workstation Pro 15UbuntuUbuntu 18.04.2 LTS关键配置 虚拟网络编辑…

ffmpeg调整缩放裁剪视频的基础知识(转)

源网址&#xff1a;ffmpeg调整缩放裁剪视频的基础知识 - yongfengnice - 博客园 1. resize and scale video 调整视频的大小和尺寸 1-1.调整视频大小(resize)是改变视频的宽度和高度。 使用-s参数实现&#xff0c;语法&#xff1a;ffmpeg -i input_file -s wxh output_fi…

Babel+vscode实现APICloud开发中兼容ES6及以上代码

本文出自APICloud官方论坛&#xff0c; 感谢论坛版主 penghuoyan 的分享。 使用APICloud开发时&#xff0c;考虑到兼容问题一直使用ES5开发&#xff0c;时间越久感觉越落后&#xff0c;整理了一个兼容ES6的开发环境&#xff0c;供大家参考。 步骤1&#xff1a; 安装Node开发环境…

如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置(三)

在 如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置&#xff08;二&#xff09; 文中末尾&#xff0c;出现下图报错&#xff1a; 一般情况下&#xff0c;按上篇提到的hvremote.wsf 脚本配置说明文件HVRemote Documentation操作后&#xff0c;不会出现此报错&#xff0…

Liferay中使用portlet:resourceURL触发serveResource()方法调用的细节

引入&#xff1a;大家在Portlet 开发中经常用到<portlet:resourceURL>&#xff0c;而大体上都会去调用相应的serveResource()方法&#xff0c;这个过程虽然大家都清楚&#xff0c;但是能弄明白这个过程细节的&#xff0c;我相信全世界不超过100人&#xff0c;至少我去年就…

使用ESP定律_手工脱壳

ESP定律脱壳一般的加壳软件在执行时&#xff0c;首先要初始化&#xff0c;保存环境&#xff08;保存各个寄存器的值&#xff09;&#xff0c;一般利用PUSHAD&#xff08;相当于把所有寄存器都压栈&#xff09;&#xff0c;当加壳程序的外壳执行完毕以后&#xff0c;再来恢复各个…

Sliverlight MD5

突然想在WP上用MD5 &#xff0c;c#的MD5方法在SL下是不能用的额 搜索下MSDN&#xff0c;找到解决方法&#xff1a; http://archive.msdn.microsoft.com/SilverlightMD5 下载那两个类添加到工程中&#xff0c;然后添加代码: 1: protected string GetMD5Hash(string input) 2: { …

apache-apollo启动报错

启动Apollo后&#xff0c;进入网页版管理中心后报错&#xff1a;500: Server Error https://127.0.0.1:61681/console/index.html 网页抓包 报错&#xff1a;{"code":"500: Internal Server Error","message":"java.lang.IllegalArgumentEx…

android 标签对应的代码怎么写alignParentRight、marginRight

2019独角兽企业重金招聘Python工程师标准>>> android:layout_alignParentRight"true" LayoutParams lp new LayoutParams(mp); lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 转载于:https://my.oschina.net/zhangjie830621/blog/158899

[Winodows Phone 7控件详解]容器控件

在Windows Phone7中存在着多个容器控件&#xff0c;这些控件主要是用来界面的布局设置&#xff0c;以及包容多个控件时的布局设置。 一.Grid控件&#xff1a;主要用于界面的布局&#xff0c;这个和web page里的很相似&#xff0c;可以通过网格布置规划界面&#xff0c;也可以嵌…

C++ Template

引言 模板&#xff08;Template&#xff09;指C程序设计设计语言中采用类型作为参数的程序设计&#xff0c;支持通用程序设计。C 的标准库提供许多有用的函数大多结合了模板的观念&#xff0c;如STL以及IO Stream。 函数模板 在c入门中&#xff0c;很多人会接触swap(int&, …

Oracle--plsql异常处理

•什么是异常?Oracle中出现错误的情形通常分为编译时错误&#xff08;compile-timeerror&#xff09;和运行时错误(run-time error)&#xff0c;异常是在PL/SQL执行过程中出现的警告或错误。•异常是如何触发的?–发生了一个 Oracle 错误时–使用RAISE语句显式触发•如何处理…

再谈SQL Server中日志的的作用

简介 之前我已经写了一个关于SQL Server日志的简单系列文章。本篇文章会进一步挖掘日志背后的一些概念&#xff0c;原理以及作用。如果您没有看过我之前的文章&#xff0c;请参阅&#xff1a; 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事…