从养孩子谈谈 IO 模型(一)
同步/异步、阻塞/非阻塞 说的是一回事儿吗?
同步/异步、阻塞/非阻塞 你能通俗易懂的讲清楚吗?
Java 中的 BIO、NIO、AIO 你了解吗?
Socket 编程你还会吗?
Linux 操作系统的 IO 模型你能讲讲吗?
01. 生活中的同步/异步、阻塞/非阻塞
程序猿有了孩子之后,从原来的劈柴喂马周游世界,就变成了撸码喂娃家里蹲蹲。
说起喂娃,不得不提小猿给孩子热奶的事情。给孩子喂奶,有些时候喝着喝着就凉了,要时不时给孩子热一热。
起初,由于带娃没有经验,小猿直接把奶瓶放进一个自制的温奶器(盛满开水的大碗里),然后一直摸着奶瓶来确定是否热好了。
1. 对于温奶器来说,它是「同步」的;
2. 由于热奶的时候,小猿其它的什么事儿都干不了,小猿被温奶器「阻塞」;
3. 这种场景称之为「同步阻塞」。
不过,在小猿热奶时,孩子嗷嗷待哺,小猿也开始涨姿势啦,热奶的空档开始去抚慰孩子饥饿的心灵,时不时的去摸一下奶瓶有没有热好。
1. 对于温奶器来说,它是「同步」的;
2. 由于小猿在热奶的空档,可以抚慰孩子饥饿的心灵,小猿被温奶器「非阻塞」;
3. 这种场景称之为「同步非阻塞」。
不过自制的温奶器确实不太智能,尤其是当老人一人在家带娃的时候,于是寻找智囊团寻求高招。
这不,在邻居萝卜妈妈的建议下,购置了一款既能控制温度,又能响铃提醒的智能温奶器。小猿把奶瓶放进去,设置好温度,奶热好后会自动响铃提醒,但是小猿还是习惯性的直勾勾的盯着温奶器,你说小猿是不是有点犯傻。
1. 对于温奶器来说,奶温好后会通知小猿,它是「异步」的;
2. 小猿还是被温奶器「阻塞」;
3. 这种场景称之为「异步阻塞」。
不过,小猿在怎么犯傻充楞,也抵不住孩子因饥饿而哇哇的哭声。于是小猿在智能温奶器温奶的空档,便开始跟孩子做小游戏、读读小猪佩奇,当听到智能温奶器的响铃提醒时,再去拿温好的奶喂孩子。
1. 对于温奶器来说,奶温好后会通知小猿,它是「异步」的;
2. 由于小猿在热奶的空档,可以陪孩子做游戏、读小猪佩奇,小猿被温奶器「非阻塞」;
3. 这种场景称之为「异步非阻塞」。
我们把小猿视作调用者,把温奶器视作被调用者,进行简单归档一下。
同步、异步说的是温奶器(被调用者)。同步指的是被调用者做完事情之后再返回的机制;异步指的是被调用者先返回,然后再做事情,做完之后再通知调用者的机制。
阻塞、非阻塞说的是小猿(调用者)。阻塞指的是调用者在等待消息时,其它什么都不做;非阻塞指的是调用者在等待消息时,去干了别的事情。
02. 业务研发中的同步、异步
不可缺失的注册场景。在注册环节,要进行姓名、证件号码的二要素实名认证,要等待实名认证 API 的响应结果,才能进行后续的注册环节,所以此种业务场景可以认为是同步设计。
如果做过支付相关的业务时,充值、提现等等很多涉及到 Money 的业务场景,API 调用时一般会返回处理中,那么调用者可以去做别的事情,可以依赖于相应的查询接口进行轮询;不过被调用者在业务处理完成后,一般也会再通知调用者处理之后的结果。此种业务场景的设计,可以认为是异步设计。
简单归纳一下,纯属一家之言,不喜也请喷。
同步设计,Moudle1 调用 Moudle2,Moudle2 的处理是同步的,在处理完之前不会告诉 Moudle1,只有处理完之后才会告诉 Moudle1。
异步设计,Moudle1 调用 Moudle2,Moudle2 的处理是异步的,Moudle2 在接到请求后,先告诉 Moudle1 已经接到请求,然后异步去处理,处理完再通过通知的方式通知 Moudle1。
03. Java 中的 IO(BIO、NIO、AIO)
IO 顾名思义就是 input(输入),output(输出)。
在业务研发中,只要定义好输入输出,其它一切只是时间问题 —— 个人愚论。
在 Java 中 IO 模型有三种,分别是 BIO(同步阻塞 IO)、NIO(同步非阻塞 IO)、AIO(异步非阻塞 IO)。
聪明的你肯定会发现,在 Java 中的确是不存在,像小猿那种傻傻盯着智能温奶器,其它啥事儿也不干的异步阻塞的傻模型。
那么,Java 中的 BIO、NIO、AIO 说的是什么呢?Linux 操作系统的 IO 模型说的又是什么呢?下期我们将结合代码进行讲解。咱们且听下次分解。
从养孩子谈谈 IO 模型(一)的更多相关文章
- 从春节送祝福谈谈 IO 模型(二)
上期结合程序员小猿用温奶器给孩子热奶的故事,把面试中常聊的“同步.异步与阻塞.非阻塞有啥区别”简单进行普及. 不过,恰逢春节即将到来,应个景,不妨就通过实现新春送祝福的需求,深入了解一下 Java I ...
- 从 Linux 操作系统谈谈 IO 模型(终)
Linux 为什么要区分内核空间与用户空间? Linux 操作系统的 IO 模型有哪几种?有啥区别? 常说的阻塞现象,到底是咋回事? 网络编程研发时,那块到底耗时最多,代码是否还有优化空间? 前几期的 ...
- 从 Socket 编程谈谈 IO 模型(三)
快过年啦,估计很多朋友已在摸鱼的路上.而我为了兄弟们年后的追逐,却在苦苦寻觅.规划,导致文章更新晚了些,各位猿粉谅解. 上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让 BIO.NIO 编程过程 ...
- 聊聊Netty那些事儿之从内核角度看IO模型
从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)
统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- Linux下常见的IO模型
前言 阻塞IO(blocking IO) 非阻塞IO(nonblocking IO) IO复用(IO multiplexing) 异步IO(asynchronous IO (the POSIX aio ...
- IO模型
前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...
随机推荐
- Java 8 Optional 良心指南,建议收藏
想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案.作为一名 Java 程序员,我真的是烦透了 Null ...
- SpringBoot框架——从SpringBoot看IoC容器初始化流程之方法分析
目录 一.概观Spring Boot 二.Spring Boot应用初始化 2.1 初始化入口 2.2 SpringApplication的run方法 2.3 方法分析 三.容器创建与初始化 3.1 ...
- ggplot2(11) 总结回顾&案例练习
从2020年2月20到2月27日,3月13日到2020年3月16日,学习了ggplot2:数据分析与图形艺术(哈德利·威克姆 著 统计之都 译),历时12天.另外,3月6日到3月9日参加了美赛,也用到 ...
- 初识JVM:(一)JVM工作原理和流程
本文主要参考:http://blog.csdn.net/CSDN_980979768/article/details/47281037?locationNum=7&fps=1 声明:主要用于个 ...
- Button相关设置
2020-03-11 每日一例第4天 1.添加按钮1-6,并修改相应的text值: 2.窗体Load事件加载代码: private void Form1_Load(object sender, Ev ...
- Spring中的JdbcTemplate的使用
一.jdbcTemplate的作用 它就是用于和数据库交互的,实现对表的crud.与dbutils相似 二.JdbcTemplate的使用 <dependency> <groupId ...
- Mac OS X 10.13上 安装odoo 11.0开发环境
0.准备假设homebrew已经安装好没安装的需要先安装,见下面链接http://brew.sh/ 1.安装PostgreSQL$ brew tap homebrew/services$ brew i ...
- Linux 中useradd命令的使用
Linux 系统中通常都是root用户具有超级权限,超级用户root一般是不需要创建的,然而很多时候root用户不是任何人都可以使用的,毕竟最高权限的用户,任意使用的话,会对系统造成很多不必要的破坏. ...
- React && ReactDOM
如果你是 React 的初学者,一定会对 React 和 ReactDOM 感到迷惑.为什么要分成两个包呢?害得我还要引入两次,说好的减轻开发人员负担呢,这丫的在搞什么飞机.带着这个疑问,我们一起来康 ...
- Uniapp使用GoEasy实现websocket实时通讯
Uniapp作为近来最火的移动端开发技术,一套代码,可以打包成Android/iOS app和各种平台的小程序,可谓是没有最方便只有更方便. GoEasy上架DCloud Uniapp插件市场已经有一 ...