关于同步、异步与阻塞、非阻塞的理解 - Rabbit_Dale - 博客园1、前言 前一段时间出去面试,被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步、异步属于两个进程中间的协作关系,例如使用浏览器访问一个网https://www.cnblogs.com/Anker/p/5965654.html简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别 - 大数据从业者FelixZh - 博客园POSIX 同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。
https://www.cnblogs.com/felixzh/p/10345929.html
×操作系统中的IO 简述
IO (Input/Output,输入/输出)即:×× 数据的读取(接收)或写入(发送)操作 ××
通常用户进程中的一个完整IO分为两阶段:
1.用户进程空间<–>内核空间
2.内核空间<–>设备空间(磁盘、网络等)。
IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。
LINUX中进程无法直接操作I/O设备,其必须通过系统调用请求kernel来协助完成I/O动作;内核会为每个I/O设备维护一个缓冲区。
对于一个输入(读取到内存 比如读取数据到我们程序malloc的buffer中)操作来说,进程IO系统调用后,内核会先看缓冲区中有没有相应的缓存数据,没有的话再到设备中读取,因为设备IO一般速度较慢,需要等待;内核缓冲区有数据则直接复制到进程空间。
所以,对于一个网络输入(读取网络资源)的操作,通常包括两个部分
- 等待网络数据到达网卡 --> 读取到内核空间 (这个过程就是准备数据)
- 从内核缓冲区复制数据到进程空间
- 然后具体的用户函数,把结果返回。
IO 操作发生时一般涉及两个对象,一个是调用这个IO的 进程 (or 线程) ,另一个就是系统内核 (kernel)
×IO执行的两个阶段
在Linux中,对于一次读取IO的操作,数据并不会被直接拷贝到程序的程序缓冲区。
通常包括两个不同阶段:
(1)等待数据准备好,到达内核缓冲区;
(2)内核向进程复制数据。
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所有等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。
举个例子:就以TCP传输为例子。
1.第一个阶段就是等待客户端的数据通过网络到达服务端的内核tcp接收缓冲区
2.第二个阶段就是我们应用程序调用read读取内核tcp接收缓冲区的数据
我们区分阻塞式IO和非阻塞式IO就是通过IO的执行的两个阶段是否阻塞来区分的
为了更好的理解五种IO模型,我们先来说一下几个概念:同步,异步,阻塞和非阻塞。
同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,调用者会轮询查看结果。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。
异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者。
阻塞与非阻塞与等待消息通知时的状态有关。
阻塞
阻塞