阻塞式/非阻塞式与同步/异步的区别
阻塞式IO/非阻塞IO
阻塞式IO(blocking-IO)
默认情况下,所有的套接字socket连接都是阻塞式的,在和操作系统交互的过程之中。比如说一个读操作:
1.因为涉及到网络数据交换network io,等待所有的分组报到达之后这时候数据才算在操作系统内部为就绪状态。
2.然后操作系统在从系统空间将数据拷贝到用户空间。
首先进行IO数据交换的时候是由两个进程交互的,一个是用户的application进程另外一个是操作系统的内核进程,阻塞强调的是在用户进程发起数据调用请求到操作系统kernal之后,需要等待操作系统(准备数据+拷贝数据)在这个过程中用户进程是被锁定的或者说成阻塞的(blocking),也就是什么也不能做,两个步骤结束之后,kernal才会告诉application应用,你请求的数据已经为你准备好了,这时候用户进程才可以进行下面的操作。
非阻塞式IO(No blocking-IO)
同样的对于客户端的一个read操作,当客户端发起read request的时候,如果kernal这时候还没有将待拷贝的数据准备好,那么则会直接返回系统错误的状态,用户端判断这个状态之后就知道了,现在kernal并没有准备好数据,我并不能立马读取数据,那么什么时候才能读取呢?只有再次向kernal发起同样的请求这时候(这个过程因为每次请求会立即得到返回,所以对于客户端来说并不是非阻塞的或者说锁定的,客户端可以在这个过程中做其他事情),看看kernal有没有准备好,若是准备好了那么则将数据从系统空间拷贝到用户内存当中去(这个阶段是阻塞的)。
同步IO/异步IO
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
An asynchronous I/O operation does not cause the requesting process to be blocked;
I/O operation= wait for data + copy data from kernal to user
异步IO(asynchronous IO)
去考虑进行IO交互的那两个应用,user application和kernal application,同步IO每次IO请求都是由user主动发起,被动的等待kernal的返回结果,当获悉kernal明确的处理状态之后才可以进行后续操作。而异步IO则是每次user application发起调用请求之后,kernal会立即返回,好似每次请求到kernal只后kernal就会告诉你,好了我知道你需要数据,等我准备好了我就会告诉你,你先去忙吧。
可以看出来同步和异步的区别就是在于,客户端请求完成之后到kernal的IO operation完成这个过程中客户端是不是阻塞或者锁定状态,如果是则是同步,否则则是异步。
比较:
相关文章
- redis主从同步
- 多主复制下处理写冲突(1)-同步与异步冲突检测及避免冲突
- 线程、同步
- 纵说“同步”与“异步”
- 同步电路与异步电路
- 同步复位和异步复位
- 采用xtrabackup部署主从同步(生产)
- 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
- MySQL5.7 多主一从(多源复制)同步配置
- python自动化运维-编写rsync+sersync安装脚本实现文件实时同步
- linux 线程的同步 一 (互斥量和信号量)
- mysql存储过程1 实现全量同步数据并自动创建表(含数据和结构)
- mysql存储过程 使用游标实现两张表数据同步数据
- vue同步组件和异步组件的区别
- 让异步操作同步执行的方法详解
- 同步+TASK异步请求
- 关于io,同步异步
- OGG 实用案例(二)- ogg 对接 kafka 远程同步 其他kafka
- 同步与阻塞,异步与非阻塞的区别
- Linux Kernel中的同步机制的介绍
- 计算机基本知识拾遗(七)页面缓存数据的同步和恢复机制页
- 管理软件向云平台同步基础数据的检查步骤
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- Vue的路由功能(1)简单路由与vue-router的基础使用(同步/异步组件)
- CSDN与云栖社区同步更新准备中