[概念] 同步 异步 阻塞 非阻塞

同步 异步

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

阻塞 非阻塞

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

类比

  • 打电话向旅馆前台预定房间
  • 第一次打占线(阻塞)
  • 第二次打接通,前台说“先别挂电话,我在系统里查一下”(同步)
  • 我可以一直等着(阻塞),也可以放下电话去喝个水再回来(非阻塞)
  • 前台说“我先查一下,待会找到了通知你”(异步)
  • 我肯定不会一直等了(非阻塞)

BIO NIO AIO

  • IO(同步阻塞)

    • 面向流,单向传输
    • 阻塞IO和非阻塞IO的区别在于第一步发起IO请求是否会被阻塞
    • 同步IO和异步IO的区别就在于第二个步骤是否阻塞(操作系统做完IO操作再将结果返回给你)
    • 两个阶段
      • 数据准备阶段
      • 内核空间复制数据到用户进程缓冲区(用户空间)阶段
  • BIO(同步阻塞)
    • 基于 IO+Socket 就可以编写一个最基本的BIO服务器
    • 一个连接一个线程
    • 通常有一个acceptor(消费者) 去负责监听客户端的连接
    • 它接收到客户端的连接请求之后为每个客户端创建一个线程进行链路处理,处理完成之后,线程销毁
    • 并发量比较大的情况下,系统会创建大量的线程
    • 从而导致服务器线程暴增,性能急剧下降,甚至宕机
    • 在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket
    • 客户端建立 Socket 时就会询问是否有线程可以处理,如果没有,要么等待,要么被拒绝
  • NIO(同步非阻塞)
    • 一个请求一个线程
    • 基于事件驱动思想,解决BIO的大并发问题
    • IO操作准备好时再通知线程
    • 客户端同时和多个服务器进行通讯,必须使用多线程处理
    • 即将每一个客户端请求分配给一个线程来单独处理
    • 由缓冲区(Buffers)、通道(Channels)和非阻塞I/O的核心类组成
    • 客户端发送的连接请求都会注册到多路复用器上
    • 多路复用器轮询到连接有I/O请求时才启动一个线程进行处理
  • AIO(异步非阻塞)
    • 一个有效请求一个线程
    • IO操作已经完成后,再向线程发出通知(触发回调函数)
    • 异步IO采用“订阅-通知”模式
      • 应用程序向操作系统注册IO监听,然后继续做自己的事情
      • 操作系统发生IO事件,并且准备好数据后,在主动通知应用程序,触发相应的函数
    • 读写操作
      • 当进行读写操作时,只须直接调用API的read或write方法
      • 对于读操作,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序
      • 对于写操作,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序
      • read/write方法都是异步的,完成后会主动调用回调函数

参考

彻底理解同步 异步 阻塞 非阻塞

https://www.cnblogs.com/loveer/p/11479249.html

漫谈Java IO之普通IO流与BIO服务器

https://www.cnblogs.com/xing901022/p/8666147.html

原文地址:https://www.cnblogs.com/cxc1357/p/12591365.html

时间: 2024-08-24 22:44:22

[概念] 同步 异步 阻塞 非阻塞的相关文章

异步/同步,阻塞/非阻塞,单线程/多线程概念梳理

最近看了一文说到异步是单线程的,顿时就傻眼了,对相关概念和同事进行了一些讨论和总结. 文中的描述是以我的理解来说的,可能不一定准确甚至正确,有错欢迎指正. 这三个概念我认为是描述不同的维度的,概念正交. 异步 同步 异步和同步是不同的流程设计风格. 但存在依赖关系的操作之间是同步的,也就是如果操作B依赖操作A的返回,那么B必须要在A结束后才能执行. 比如你要读取文件然后对文件内容进行处理,那么读取内容和处理内容就是同步的. 而异步这是操作间没有依赖关系,或者先后顺序并不重要. 比如用户登陆要给登

同步 异步 阻塞 非阻塞概念区分

老张爱喝茶,废话不说,煮开水. 提前剧透一下:同步和非同步主要用来形容被调用线程,阻塞非阻塞用来形容主线程的.出场人物:老张(主线程),水壶(被调用线程)两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 1 老张把水壶放到火上,立等水开.(主线程等着,不断轮询被调用线程,直到被调用线程返回结果)(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有.(主线程去做其他事了,但是还会时不时的查看被调用线程是否会返回结果,也就是说被调用线程自己是没法告诉主线程

理解同步异步与阻塞非阻塞

本篇文章我准本从三个大方面来解释下同步异步.阻塞非阻塞的知识,第一个方面主要是说下,到底什么是同步异步.阻塞非阻塞:第二个方面主要是解释下在I/O场景下,同步异步阻塞非阻塞又是怎么定义的,第三个方面介绍下在unix下同步异步又有哪些阻塞非阻塞IO. 1.同步异步与阻塞非阻塞 首先从大的方面来说,"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1).同步与异步 同步和异步关注的是消

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.

基础入门_Python-网络编程.分分钟掌握阻塞/非阻塞/同步/异步IO模型?

概念梳理: 故事独白: 满满爱喝茶,废话不多说,开始煮开水. 出场人物: 满满, 普通水壶, 高级水壶(水开会响) 1. 满满把水壶放在火上, 站在那里等水开(同步阻塞) 满满觉得自己有点儿傻逼~ 2. 满满把水壶放在火上,去客厅看电视,时不时的去厨房瞅瞅水开木有(同步非阻塞) 满满觉得自己还是有点傻~,于是买了个高级水壶, 水开后会响~ 3. 满满把高级水壶放在火上, 站在那里等水开(异步阻塞) 满满想高级水壶水开会自己叫~为毛不去看个电视哪? 4. 满满把高级水壶放在火上, 去客厅看电视,

深入理解同步/异步与阻塞/非阻塞区别 (转)

转载自:http://chuansong.me/n/2124760 几年前曾写过一篇描写同步/异步以及阻塞/非阻塞的文章,最近再回头看,还存在一些理解和认知误区,于是重新整理一下相关的概念,希望对网络编程的同行能有所启发. 同步与异步 首先来解释同步和异步的概念,这两个概念与消息的通知机制有关. 举个例子,比如一个用户去银行办理业务,他可以自己去排队办理,也可以叫人代办,办完之后再告知用户结果.对于要办理这个银行业务的人而言,自己去办理是同步方式,而别人代办完毕再告知则是异步方式. 两者的区别在

异步/同步、阻塞/非阻塞的理解

[同步和异步] 通俗的讲:同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式.同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 概念从现实中来:同步:打电话,你拨通电话后必须等在那里,直到对方有人接了,你们才能通信或者说你才能继续打下一个电话.异步:发短信,你可以发

(转)同步异步/阻塞非阻塞 和 5种linux网络通信模型

会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. linux网络通信模型有: 阻塞IO模型(同步),非阻塞IO模型(拷贝同步),IO复用模型(多线程同步),信号驱动IO模型((拷贝同步),异步IO模型(异步). node.js对同步/异步,阻塞非阻塞的解释: 线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时 操作系

Java 中阻塞非阻塞io以及同步异步IO

然后借鉴下<Unix网络编程卷>中的理论: IO操作中涉及的2个主要对象为程序进程.系统内核.以读操作为例,当一个IO读操作发生时,通常经历两个步骤: 1,等待数据准备 2,将数据从系统内核拷贝到操作进程中 例如,在socket上的读操作,步骤1会等到网络数据包到达,到达后会拷贝到系统内核的缓冲区:步骤2会将数据包从内核缓冲区拷贝到程序进程的缓冲区中. 阻塞(blocking)与非阻塞(non-blocking)IO IO的阻塞.非阻塞主要表现在一个IO操作过程中,如果有些操作很慢,比如读操作