同步,异步,阻塞,非阻塞

在多数的情况下,我们谈论这几个概念时都是涉及到I/O操作时,当计算机在等待数据从磁盘或者其他存储设备(网络socket)到达用户进程所用空间时所涉及的几个概念。

我们认为首先CPU会发出一个I/O操作的通知,然后文件系统或其他会调用相关设备执行这些操作,最后当数据到达用户空间后发出一个中断的完成标志,于是在这个从CPU发出调用到收到完成标志的过程中就存在一个时间差。现在就有了两个重要的概念:完成标志时间差。同步与异步是针对获取完成标志而言的,而阻塞与非阻塞是针对时间差而言的。

同步异步:获取完成标志的方式。如果是采用轮询的方式监测I/O操作是否完成称为同步,而以通过回调通知的方式获得完成标志则称为异步。

阻塞非阻塞:在那段时间差的过程中,CPU有没有处理别的事情,如果处理过别的事情则是非阻塞,如果并没有处理过别的事情则是阻塞。

*1,2代表轮询I/O操作的进行状态,3代表I/O操作已经完成

我们把一个I/O调用看做上面A和B两个过程,A阶段是CPU发出I/O调用【此阶段是十分快速的】,B阶段是相关设备把数据从目标位置转移到用户空间的过程【此阶段就会由于数据量以及数据所在设备的远近而所用时间大为不同】,容易明白的是上面四个概念都是针对B阶段在数据迁移过程中此进程/线程所对应的CPU状态而言的,所以用这个过程来看看上面四个概念的组合:

1.同步阻塞:即是在B阶段CPU一直采用轮询的方式直到获得完成标志,所以此段时间CPU一直阻塞在此I/O操作上。

2.同步不阻塞:在B阶段依然采用轮询的方式直至获得完成标志,但是此轮询不同于上面的轮询过程,而是在相邻的轮询中完成了上下文切换去处理别的任务的,所以是同步不阻塞

3.异步阻塞:也就是所没有上面的1,2过程,当I/O操作完成后回调通知CPU已完成【即是3过程】,但是此阶段CPU处于休眠状态而不处理别的任务。

4.异步不阻塞:和上面一样没有1,2过程而是通过回调知道I/O操作已完成,但是并没有休眠,而是在此阶段处理其他任务。

综上所述:异步不阻塞是最高效的。

在实际中常采用多线程模拟理想异步非阻塞模式:一个主线程用于计算,多个线程用于执行I/O操作【可能是上面四种的任意形式】

  

几种常见服务器模型:

  1.同步式:一次处理一个请求,其余请求处于等待状态

  2.每请求/每进程: 为每个请求启动一个进程【不具备扩展功能,系统志愿有限】

  3.每请求/每线程:为每个请求启动一个线程【每个线程占一定内存,故受限于内存,还会拖慢服务器】【Apache就是采用的这种方式】

  4.事件驱动:Node与Nginx采用事件驱动方式而不创建新线程【省去了线程创建/删除的系统开销以及线程上下文切换,所以能够处理更多的连接】【python的Twisted,Ruby的Event Machine以及Perl的AyEvent也是事件驱动,但是他们并不是很成功】

需要注意的是对于高并发【注释1】的程序往往采用“同步非阻塞”而不是“多线程的同步阻塞”,在合理设计任务调度的不同阶段可使得并发数远大于并行数,需要注意的是在高并发状况下为每个任务创建一个线程的开销很大,所以并不采用多线程的同步阻塞。

注释1:并发:同时进行的任务数量

     并行:可同时工作的物理资源(CPU核数等等)

参考:

1:http://blog.jobbole.com/99765/

2:深入浅出Node.js

时间: 2024-10-11 04:25:36

同步,异步,阻塞,非阻塞的相关文章

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

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

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

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

讲一讲什么叫阻塞非阻塞同步异步

1.讲一讲什么叫阻塞非阻塞同步异步全是用来形容方法的,形容一个方法返回值状态的. 2.io读取,网络读取,jdbc读取,这些流的操作都是bio的,都是阻塞的. 3.所以沃恩一般在处理io操作时,都采用多线程来提高bio的效率. 4.io操作,就是本地文件,网络,数据嘛嘛.所以在这三种读取数据时,都要采用多线程提高效率. 5.多线程处理阻塞方法时,只不过是避免了主线程的阻塞,但是让子线程,也就是处理每个http request的线程去发生阻塞了. 6.传统的古老的开发方式: 单线程执行阻塞方法->

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

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

同步/异步-阻塞/非阻塞

(A)同步和异步,是针对 调用结果是如何返回给调用者来说的,即调用的结果是调用者主动去获取的(比如一直等待recvfrom或者设置超时等待select),则为同步,而调用结果是被调用者在完成之后通知调用者的,则为异步(比如windows的IOCP).(B)阻塞和非阻塞,是针对调用者所在线程是否在调用之后主动挂起来说的,即如果在线程中调用者发出调用之后,再被调用这返回之前,该线程主动挂起,则为阻塞,若线程不主动挂起,而继续向下执行,则为非阻塞. 这样,在网络IO中,同步异步,阻塞非阻塞,就可以形成

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

转载自: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操作过程中,如果有些操作很慢,比如读操作

Socket 同步/异步 与阻塞/非阻塞区别

在网上看了很多答案,也没找到合适的,也许本文也不是合适答案:) 同步和异步关注的是消息通信机制,而阻塞非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态. 同步/异步是API 被调用者的通知方式.阻塞/非阻塞则是API 调用者的等待方式. 同步.异步和阻塞.非阻塞是组合关系. 因此有4种方式: 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 ------------------------------------------------------------------------ recv