`
xiaoyu966
  • 浏览: 258155 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

聊聊同步异步、阻塞非阻塞

阅读更多

背景

很多人在同步异步、阻塞非阻塞这2组概念上不能讲的很清楚,而且网络上也有几种完全不同的看法,总之这个部分有不少争议。

笔者也在这部分困惑过,花了一些时间去弄透这个问题,以下是个人理解的一些总结。希望能帮到大家。

1. 通用概念

例子:”我”烧水(注意:这里的主语是”我”,也就是我们讨论的who)

1.1. 同步异步

1.1.1. 例子

关注点:是否需要”我主动”去看水烧开没(注意,”我”和”主动”这两个词)

  • 同步:“我”要主动看水烧开没
  • 异步:不需要”我”主动去看水烧开,水壶响了通知”我”

1.1.2. 概念

抽象概念:事情执行者对事情结果的获取机制(who:事情执行者)

  • 同步:事情执行者主动获取事情结果
  • 异步:事情执行者被动获取事情结果

1.2. 阻塞非阻塞

1.2.1. 例子

关注点:水烧开前,”我”能不能去做其他事情

  • 阻塞: 
    1. 水没烧开,我一直等着(全程阻塞)
    2. 我去干其他事情了,但是隔一会儿来看一次水烧开没(来看的时候阻塞)
  • 非阻塞: 
    水没烧开,”我”去拖地了,拖完地又看了会儿电视

1.2.2. 概念

抽象概念:事情执行者得到事情结果前能不能去做其他事情(who:事情执行者

  • 阻塞:事情执行者得到结果前不能去做其他事情
  • 非阻塞:事情执行者得到结果前可以去做其他事情

1.3. 总结

  1. 同步一定是会发生阻塞的,只是阻塞的时间长短问题。 
    • 我主动看水烧开(同步),水烧开前我一直等着(阻塞):全程阻塞
    • 我主动看水烧开(同步),隔一会儿来看水烧开(看的过程是阻塞):局部阻塞
  2. 异步一定是非阻塞的: 
    • 不需要我主动去看水烧开(异步),烧水过程中我可以去做任何事情(非阻塞)。

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

  1. 进程主动查看关心的IO事件是否就绪,就绪时再执行相关操作 
    • 注意:进程的阻塞发生在select/epoll/poll等待事件时
  2. 进程主动执行读写 
    • 注意:进程的阻塞发生在数据未到达(设备未收到数据),或者未就绪(内核空间和用户空间的数据copy未完成)

2.3.2. 异步IO

异步IO是需要底层操作系统内核做支持的,比如linux的AIO, windows的IOCP。

  1. 进程不用主动去查看关心的IO事件,只需要把关心的IO事件、数据buffer以及要绑定的回调函数或者signal直接告诉内核,内核发现IO时间就绪时,直接调用回调函数或者发送绑定的signal 
    • 注意:IO事件相关的数据,由内核直接将数据copy到用户空间(异步读),或者从用户空间copy至内核空间(异步写)
  2. 进程被动执行数据操作 
    • 注意:进程收到内核通知后,在1中绑定的数据buffer里就已经有数据了,进程直接对数据进行相关处理即可。
 
 
0
1
分享到:
评论

相关推荐

    聊聊同步、异步、阻塞与非阻塞.docx

    异步的实现方式会有两种:异步阻塞、异步非阻塞;同理,同步也会有两种实现:同步阻塞、同步非阻塞。 阻塞与非阻塞的比较 阻塞和非阻塞是从程序(线程)等待消息通知时的状态角度来说的。阻塞是指调用结果返回之前...

    java 中同步、异步、阻塞和非阻塞区别详解

    在Java编程中,同步、异步、阻塞和非阻塞是四个重要的概念,它们涉及到多线程和并发处理,特别是在网络编程中尤为关键。理解这些概念有助于优化程序性能和提高资源利用率。 1. **同步**: 同步是编程中一种控制机制...

    聊聊Netty那些事儿之从内核角度看IO模型.doc

    本文从阻塞与非阻塞、同步与异步的概念开始,引出了五种IO模型,并对select、poll、epoll的原理和对比进行了介绍。最后,文章还介绍了两种IO线程模型和Netty中的Reactor模型。 1. 阻塞与非阻塞、同步与异步概念 ...

    socket 异步 即时通讯

    异步Socket通信则通过非阻塞I/O模型解决了这个问题。在异步模式下,当发起一个Socket操作时,系统不会立即返回结果,而是允许程序继续执行其他任务,直到数据准备好或特定事件发生时,系统会通知程序。这种方式提高...

    20_来聊聊redis的线程模型吧?为啥单线程还能有很高的效率?.zip

    这些客户端库同样采用了异步非阻塞I/O模型,以适应Redis的单线程模型。它们会将请求打包成队列,然后在一个后台线程中发送到Redis,避免阻塞主线程。 PPT.pptx可能包含更深入的Redis线程模型讲解,例如如何利用事件...

    Netty大纲-同步netty专栏

    Netty 底层基于 NIO(非阻塞I/O)库,允许开发者创建高效的并发服务器,同时处理大量并发连接。本文将深入探讨Netty的基础、进阶特性以及优化策略。 1. **NIO基础** - **三大组件**:在Java NIO中,主要包括`...

    mmo_game_zinxV4.0

    这类库通常提供高效的网络层支持,如异步非阻塞I/O,以适应游戏服务器高并发的需求。它们还可能包含了一些优化的序列化和反序列化机制,用于处理游戏数据的快速传输。 总的来说,"mmo_game_zinxV4.0"是一个集成了...

    socket_chat

    异步通信是一种非阻塞的通信方式,它允许程序在等待数据传输的同时执行其他任务。在C++中,可以使用`select()`、`poll()`或`epoll()`等系统调用来实现异步I/O。这些函数监控多个`socket`,当某个`socket`准备读写时...

    Linux下用Socket和多线程实现简单聊天室

    - **性能优化**:合理设置Socket的缓冲区大小,避免阻塞等待,考虑使用非阻塞I/O或异步I/O模型提高效率。 - **安全性**:使用SSL/TLS加密通信,防止数据被窃听;验证客户端身份,防止恶意连接。 5. **设计与实现*...

    从PHP到Node,聊一聊淘宝首页背后的技术

    Node.js的事件驱动模型和非阻塞I/O适合高并发场景,能更好地处理用户的请求和数据。 13. 淘宝首页的维护和更新:由于业务的多样性,首页需要对接多种系统,这导致了页面的接口众多。淘宝首页团队通过各种机制,如...

    kotlin_asyncronous

    `kotlin_asyncronous`这个主题主要关注Kotlin语言中如何实现异步编程,以提高程序的并发性和非阻塞执行。本文将深入探讨Kotlin中的异步编程技术,包括协程(Coroutines)、通道(Channels)、以及相关的最佳实践。 ...

    并发:并发任务1/2

    为了避免这些问题,我们需要合理设计同步策略,如使用公平锁或非阻塞算法。 在Java 5之后引入的并发集合,如`ConcurrentHashMap`, `CopyOnWriteArrayList`等,为并发编程提供了线程安全的数据结构,减少了对显式...

    Reactor:Linux上由C ++ 11实现的Reactor实现

    C++11的异步编程模型可以与epoll结合,实现非阻塞I/O操作。 实现Reactor模式的步骤大致如下: 1. **初始化Reactor**:创建epoll实例,注册初始的文件描述符,如服务器套接字等。 2. **注册事件处理器**:每个处理器...

    Libevent_Analysis:Libevent网络框架源代码分析

    这种非阻塞的事件处理方式提高了程序的并发性能。 3. **事件类型** Libevent 支持多种事件类型,包括读事件、写事件、信号事件、定时事件等。这些事件可以单独或组合使用,例如,通过定时事件实现心跳检测,通过...

Global site tag (gtag.js) - Google Analytics