网站首页 > 技术文章 正文
一、概念介绍
(1)阻塞(blocking)、非阻塞(non-blocking):可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了(进程或线程就阻塞在那了,不能做其它事情),否则就可以理解为非阻塞(在等待的过程中可以做其它事情)。
(2)同步(synchronous)、异步(asynchronous): 你总是做完一件再去做另一件,不管是否需要时间等待,这就是同步(就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,即此时不能做下一件事情);异步则反之,你可以同时做几件事,并非一定需要一件事做完再做另一件事(当一个异步过程调用发出后,调用者不能立刻得到结果,此时可以接着做其它事情)。同步简单理解成一问一答同步进行,异步可以简单理解为不必等一个问题有了答案再去问另一个问题,尽管问,有答了再通知你。
(3)阻塞和同步:
有人会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。
二、IO模型
针对网络IO的操作,可以分成两个阶段,准备阶段和操作阶段。
- 1,准备阶段是判断是否能够操作(即等待数据是否可用),在内核进程完成的;
- 2,操作阶段则执行实际的IO调用,数据从内核缓冲区拷贝到用户进程缓冲区。
比如对于一个read操作发生时,它会经历下面两个阶段:
A, 等待数据准备,数据是否拷贝到内核缓冲区;
B, 将数据从内核拷贝到用户进程空间
上面两点比较重要,注意理解。
《Unix网络编程卷1:套接字联网API》(即UNP)中第六章对unix 系统将IO模型分为五类:阻塞IO,非阻塞IO,IO复用,信号驱动,异步IO。
1、阻塞IO:在准备阶段即同步阻塞,应用进程调用I/O操作时阻塞,只有等待要操作的数据准备好,并复制到应用进程的缓冲区中才返回;
2、非阻塞IO:当应用进程要调用的I/O操作会导致该进程进入阻塞状态时,该I/O调用返回一个错误,一般情况下,应用进程需要利用轮询的方式来检测某个操作是否就绪。数据就绪后,实际的I/O操作会等待数据复制到应用进程的缓冲区中以后才返回;
3、IO复用:多路IO共用一个同步阻塞接口,任意IO可操作都可激活IO操作,这是对阻塞IO的改进(主要是select和poll、epoll,关键是能实现同时对多个IO端口进行监听)。此时阻塞发生在select/poll的系统调用上,而不是阻塞在实际的I/O系统调用上。IO多路复用的高级之处在于:它能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select等函数就可以返回。
4、信号驱动IO:注册一个IO信号事件,在数据可操作时通过SIGIO信号通知线程,这应该算是一种异步机制;
以上四种模型在第一阶段即判断是否可操作阶段各不相同,但一旦数据可操作,则切换到同步阻塞模式下执行IO操作,所以都算是同步IO。
5、异步IO: 应用进程通知内核开始一个异步I/O操作,并让内核在整个操作(包含将数据从内核复制到应该进程的缓冲区)完成后通知应用进程。
根据上面所说的IO操作的两个阶段,可以把上面的I/O模型进行如下归类:
a,阻塞IO:在两个阶段上面都是阻塞的;
b,非阻塞IO:在第1阶段,程序不断的轮询直到数据准备好,第2阶段还是阻塞的;
c,IO复用:在第1阶段,当一个或者多个IO准备就绪时,通知程序,第2阶段还是阻塞的,在第1阶段还是轮询实现的,只是所有的IO都集中在一个地方,这个地方进行轮询;
d,信号IO:当数据准备完毕的时候,信号通知程序数据准备完毕,第2阶段阻塞;
e,异步IO:1,2都不阻塞,异步IO模型 比如 windows之上的iocp,linux AIO,详情点这里;
结果如下图(图来自UNP)。
阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型,这三种模型的区别在于第一阶段(阻塞式I/O阻塞在I/O操作上,非阻塞式I/O轮询,
I/O复用阻塞在select/poll/epoll上),第二阶段都是一样的,即这里的阻塞不阻塞体现在第一阶段,从这方面来说I/O复用类型也
可以归类到阻塞式I/O,它与阻塞式I/O的区别在于阻塞的系统调用不同。而异步I/O的两个阶段都不会阻塞进程。
其中POSIX将IO只分成了同步IO、异步IO两种模型。
同步I/O操作:实际的I/O操作将导致请求进程阻塞,直到I/O操作完成。
异步I/O操作:实际的I/O操作不导致请求进程阻塞。
由此,前面分类中:阻塞式I/O,非阻塞式I/O,I/O复用,信号驱动I/O模型都属于同步I/O,因为第二阶段的数据复制都是阻塞的。
而只有前面定义的异步I/O模型与这里的异步I/O操作
总结
同步或者异步I/O主要是指访问数据的机制(即实际I/O操作的完成方式),同步一般指主动请求并等待I/O操作完毕的方式,I/O操作
未完成前,会导致应用进程挂起;而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO
完成的通知(异步的特点就是通知),这可以使进程在数据读写时也不阻塞。
阻塞或者非阻塞I/O主要是指I/O操作第一阶段的完成方式(进程访问的数据如果尚未就绪),即数据还未准备好的时候,应用进程
的表现,如果这里进程挂起,则为阻塞I/O,否则为非阻塞I/O。说白了就是阻塞和非阻塞是针对于进程在访问数据的时候,根据IO
操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,
而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
首先恭喜您,能够认真的阅读到这里,如果对部分理解不太明白,建议先将文章收藏起来,然后对不清楚的知识点进行查阅,然后在进行阅读,相应你会有更深的认知。如果您喜欢这篇文章【关注我】吧!!,需要相关的学习资料,请关注我之后私信【666】。
- 上一篇: 深入理解同步、异步、阻塞、非阻塞
- 下一篇: 「技术干货」一文总结网络IO之阻塞、非阻塞、同步、异步
猜你喜欢
- 2024-10-21 面试官:NIO非阻塞网络编程原理了解吗?一文深度讲解避坑
- 2024-10-21 Java阻塞队列中的异类,SynchronousQueue底层实现原理剖析
- 2024-10-21 超详细的I/O多路复用概念、常用I/O模型、系统调用等介绍
- 2024-10-21 非阻塞同步算法与CAS(比较和交换)无锁算法 - 美因茨
- 2024-10-21 为什么要学IO模型(同步阻塞,异步非阻塞)?
- 2024-10-21 非阻塞同步机制和CAS 治疗青光眼的药物中,降压机制是使阻塞房角开放的是
- 2024-10-21 一文彻底搞定(阻塞/非阻塞/同步/异步)网络IO、并发编程模型
- 2024-10-21 一文搞懂什么是阻塞IO、信号驱动IO、Reactor模型、零拷贝
- 2024-10-21 Java面试常见问题:阻塞与非阻塞,同步与异步
- 2024-10-21 聊聊Java BIO(同步阻塞IO)、NIO(非阻塞IO)、AIO(异步IO)
你 发表评论:
欢迎- 11-19零基础学习!数据分析分类模型「支持向量机」
- 11-19机器学习 | 算法笔记(三)- 支持向量机算法以及代码实现
- 11-19我以前一直没有真正理解支持向量机,直到我画了一张图
- 11-19研一小姑娘分享机器学习之SVM支持向量机
- 11-19[机器学习] sklearn支持向量机
- 11-19支持向量机
- 11-19初探支持向量机:用大白话解释、原理详解、Python实现
- 11-19支持向量机的核函数
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)