zoukankan      html  css  js  c++  java
  • 彻底理解同步 异步 阻塞 非阻塞

    IO操作

    IO分两阶段(一旦拿到数据后就变成了数据操作,不再是IO):
        1.数据准备阶段
        2.内核空间复制数据到用户进程缓冲区(用户空间)阶段
    
    在操作系统中,程序运行的空间分为内核空间和用户空间。
        应用程序都是运行在用户空间的,所以它们能操作的数据也都在用户空间。
    
    
    阻塞IO和非阻塞IO的区别在于第一步发起IO请求是否会被阻塞:
        如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
    
    一般来讲:
        阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,因为阶段2是阻塞的(尽管时间很短)。
    
    同步IO和异步IO的区别就在于第二个步骤是否阻塞:
        如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO
    

    同步和异步IO 阻塞和非阻塞IO

    同步和异步IO的概念:
    
    	同步是用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行
    
    	异步是用户线程发起I/O请求后仍需要继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注册的回调函数
    
    阻塞和非阻塞IO的概念:
    
    	阻塞是指I/O操作需要彻底完成后才能返回用户空间
    
    	非阻塞是指I/O操作被调用后立即返回一个状态值,无需等I/O操作彻底完成
    

    同步与异步(线程间调用)

    同步与异步是对应于调用者与被调用者,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的
    
    	同步操作时,调用者需要等待被调用者返回结果,才会进行下一步操作
    
    	而异步则相反,调用者不需要等待被调用者返回调用,即可进行下一步操作,被调用者通常依靠事件、回调等机制来通知调用者结果
    

    阻塞与非阻塞(线程内调用)

    阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞
    
    
    阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态:
    
        阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
    
        非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
    

    同步与异步调用/线程/通信

    同步就是两种东西通过一种机制实现步调一致,异步是两种东西不必步调一致
    
    
    一、同步调用与异步调用:
    
        在用在调用场景中,无非是对调用结果的不同处理。
    
        同步调用就是调用一但返回,就能知道结果,而异步是返回时不一定知道结果,还得通过其他机制来获知结果,如:
    
            a. 状态 b. 通知 c. 回调函数
    
    
    二、同步线程与异步线程:
    
        同步线程:即两个线程步调要一致,其中一个线程可能要阻塞等待另外一个线程的运行,要相互协商。快的阻塞一下等到慢的步调一致。
    
        异步线程:步调不用一致,各自按各自的步调运行,不受另一个线程的影响。
    
    
    三、同步通信与异步通信:
    
        同步和异步是指:发送方和接收方是否协调步调一致
    
        同步通信是指:发送方和接收方通过一定机制,实现收发步调协调。
            如:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式
    
        异步通信是指:发送方的发送不管接收方的接收状态。
            如:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
    
    
    阻塞可以是实现同步的一种手段!例如两个东西需要同步,一旦出现不同步情况,我就阻塞快的一方,使双方达到同步。
    
    同步是两个对象之间的关系,而阻塞是一个对象的状态。
    

    四种组合方式

    同步阻塞方式:
        发送方发送请求之后一直等待响应。
        接收方处理请求时进行的IO操作如果不能马上等到返回结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。
    
    同步非阻塞方式:
    	发送方发送请求之后,一直等待响应。
    	接受方处理请求时进行的IO操作如果不能马上的得到结果,就立即返回,取做其他事情。
    	但是由于没有得到请求处理结果,不响应发送方,发送方一直等待。
    	当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方,发送方才进入下一次请求过程。(实际不应用)
    
    异步阻塞方式:
    	发送方向接收方请求后,不等待响应,可以继续其他工作。
    	接收方处理请求时进行IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作。 (实际不应用)
    
    异步非阻塞方式:
    	发送方向接收方请求后,不等待响应,可以继续其他工作。
    	接收方处理请求时进行IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。
    	当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。(效率最高)
    
  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/loveer/p/11479249.html
Copyright © 2011-2022 走看看