背景
很多人在同步异步、阻塞非阻塞这2组概念上不能讲的很清楚,而且网络上也有几种完全不同的看法,总之这个部分有不少争议。
笔者也在这部分困惑过,花了一些时间去弄透这个问题,以下是个人理解的一些总结。希望能帮到大家。
1. 通用概念
例子:”我”烧水(注意:这里的主语是”我”,也就是我们讨论的who)
1.1. 同步异步
1.1.1. 例子
关注点:是否需要”我主动”去看水烧开没(注意,”我”和”主动”这两个词)
- 同步:“我”要主动看水烧开没
- 异步:不需要”我”主动去看水烧开,水壶响了通知”我”
1.1.2. 概念
抽象概念:事情执行者对事情结果的获取机制(who:事情执行者)
- 同步:事情执行者主动获取事情结果
- 异步:事情执行者被动获取事情结果
1.2. 阻塞非阻塞
1.2.1. 例子
关注点:水烧开前,”我”能不能去做其他事情
- 阻塞:
- 水没烧开,我一直等着(全程阻塞)
- 我去干其他事情了,但是隔一会儿来看一次水烧开没(来看的时候阻塞)
- 非阻塞:
水没烧开,”我”去拖地了,拖完地又看了会儿电视
1.2.2. 概念
抽象概念:事情执行者得到事情结果前能不能去做其他事情(who:事情执行者)
- 阻塞:事情执行者得到结果前不能去做其他事情
- 非阻塞:事情执行者得到结果前可以去做其他事情
1.3. 总结
- 同步一定是会发生阻塞的,只是阻塞的时间长短问题。
- 我主动看水烧开(同步),水烧开前我一直等着(阻塞):全程阻塞
- 我主动看水烧开(同步),隔一会儿来看水烧开(看的过程是阻塞):局部阻塞
- 异步一定是非阻塞的:
- 不需要我主动去看水烧开(异步),烧水过程中我可以去做任何事情(非阻塞)。
2. 网络编程层面
网络编程层面主要涉及的就是IO,所以,这里主要讲IO。这块儿其实在《UNIX网络编程卷1 第6章 IO复用》中讲的非常清楚了,建议大家看一下,我引用其中的一些关键点。具体的可以找书去看。
2.1. POSIX定义
- 同步I/O操作:导致请求进程阻塞,直到I/O操作完成;
- 异步I/O操作:不导致请求进程阻塞。
2.2. IO模型
根据POXIX的定义,下面图中的五种IO模型,其实前四种都是同步IO。
2.3. 总结
注意:这里的who是进程
2.3.1. 同步IO
- 进程主动查看关心的IO事件是否就绪,就绪时再执行相关操作
- 注意:进程的阻塞发生在select/epoll/poll等待事件时
- 进程主动执行读写
- 注意:进程的阻塞发生在数据未到达(设备未收到数据),或者未就绪(内核空间和用户空间的数据copy未完成)
2.3.2. 异步IO
异步IO是需要底层操作系统内核做支持的,比如linux的AIO, windows的IOCP。
- 进程不用主动去查看关心的IO事件,只需要把关心的IO事件、数据buffer以及要绑定的回调函数或者signal直接告诉内核,内核发现IO时间就绪时,直接调用回调函数或者发送绑定的signal
- 注意:IO事件相关的数据,由内核直接将数据copy到用户空间(异步读),或者从用户空间copy至内核空间(异步写)
- 进程被动执行数据操作
- 注意:进程收到内核通知后,在1中绑定的数据buffer里就已经有数据了,进程直接对数据进行相关处理即可。
相关推荐
异步的实现方式会有两种:异步阻塞、异步非阻塞;同理,同步也会有两种实现:同步阻塞、同步非阻塞。 阻塞与非阻塞的比较 阻塞和非阻塞是从程序(线程)等待消息通知时的状态角度来说的。阻塞是指调用结果返回之前...
在Java编程中,同步、异步、阻塞和非阻塞是四个重要的概念,它们涉及到多线程和并发处理,特别是在网络编程中尤为关键。理解这些概念有助于优化程序性能和提高资源利用率。 1. **同步**: 同步是编程中一种控制机制...
本文从阻塞与非阻塞、同步与异步的概念开始,引出了五种IO模型,并对select、poll、epoll的原理和对比进行了介绍。最后,文章还介绍了两种IO线程模型和Netty中的Reactor模型。 1. 阻塞与非阻塞、同步与异步概念 ...
异步Socket通信则通过非阻塞I/O模型解决了这个问题。在异步模式下,当发起一个Socket操作时,系统不会立即返回结果,而是允许程序继续执行其他任务,直到数据准备好或特定事件发生时,系统会通知程序。这种方式提高...
这些客户端库同样采用了异步非阻塞I/O模型,以适应Redis的单线程模型。它们会将请求打包成队列,然后在一个后台线程中发送到Redis,避免阻塞主线程。 PPT.pptx可能包含更深入的Redis线程模型讲解,例如如何利用事件...
Netty 底层基于 NIO(非阻塞I/O)库,允许开发者创建高效的并发服务器,同时处理大量并发连接。本文将深入探讨Netty的基础、进阶特性以及优化策略。 1. **NIO基础** - **三大组件**:在Java NIO中,主要包括`...
这类库通常提供高效的网络层支持,如异步非阻塞I/O,以适应游戏服务器高并发的需求。它们还可能包含了一些优化的序列化和反序列化机制,用于处理游戏数据的快速传输。 总的来说,"mmo_game_zinxV4.0"是一个集成了...
异步通信是一种非阻塞的通信方式,它允许程序在等待数据传输的同时执行其他任务。在C++中,可以使用`select()`、`poll()`或`epoll()`等系统调用来实现异步I/O。这些函数监控多个`socket`,当某个`socket`准备读写时...
- **性能优化**:合理设置Socket的缓冲区大小,避免阻塞等待,考虑使用非阻塞I/O或异步I/O模型提高效率。 - **安全性**:使用SSL/TLS加密通信,防止数据被窃听;验证客户端身份,防止恶意连接。 5. **设计与实现*...
Node.js的事件驱动模型和非阻塞I/O适合高并发场景,能更好地处理用户的请求和数据。 13. 淘宝首页的维护和更新:由于业务的多样性,首页需要对接多种系统,这导致了页面的接口众多。淘宝首页团队通过各种机制,如...
`kotlin_asyncronous`这个主题主要关注Kotlin语言中如何实现异步编程,以提高程序的并发性和非阻塞执行。本文将深入探讨Kotlin中的异步编程技术,包括协程(Coroutines)、通道(Channels)、以及相关的最佳实践。 ...
为了避免这些问题,我们需要合理设计同步策略,如使用公平锁或非阻塞算法。 在Java 5之后引入的并发集合,如`ConcurrentHashMap`, `CopyOnWriteArrayList`等,为并发编程提供了线程安全的数据结构,减少了对显式...
C++11的异步编程模型可以与epoll结合,实现非阻塞I/O操作。 实现Reactor模式的步骤大致如下: 1. **初始化Reactor**:创建epoll实例,注册初始的文件描述符,如服务器套接字等。 2. **注册事件处理器**:每个处理器...
这种非阻塞的事件处理方式提高了程序的并发性能。 3. **事件类型** Libevent 支持多种事件类型,包括读事件、写事件、信号事件、定时事件等。这些事件可以单独或组合使用,例如,通过定时事件实现心跳检测,通过...