同步与异步,阻塞与非阻塞的区别

同步与异步,阻塞与非阻塞的区别

转载:https://www.cnblogs.com/chaser24/p/6112071.htmlhtml

一、概念剖析

相信不少从事linux后台开发工做的都接触过同步&异步、阻塞&非阻塞这样的概念,也相信都曾经产生过误解,好比认为同步就是阻塞、异步就是非阻塞,下面咱们先剖析下这几个概念分别是什么含义。linux

同步: 所谓同步,就是在发出一个功能调用时,在没有获得结果以前,该调用就不返回。也就是必须一件一件事作,等前一件作完了才能作下一件事。ajax

例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事浏览器

异步: 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能马上获得结果。实际处理这个调用的部件在完成后,经过状态、通知和回调来通知调用者。服务器

例如 ajax请求(异步): 请求经过事件触发->服务器处理(这是浏览器仍然能够做其余事情)->处理完毕异步

阻塞: 阻塞调用是指调用结果返回以前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在获得结果以后才会返回。async

有人也许会把阻塞调用和同步调用等同起来,实际上他是不一样的。对于同步调用来讲,不少时候当前线程仍是激活的,只是从逻辑上当前函数没有返回,它还会抢占cpu去执行其余逻辑,也会主动检测io是否准备好。ide

非阻塞 非阻塞和阻塞的概念相对应,指在不能马上获得结果以前,该函数不会阻塞当前线程,而会马上返回。函数

再简单点理解就是:测试

\1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。 \2. 异步,就是我调用一个功能,不须要知道该功能结果,该功能有结果后通知我(回调通知) \3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有获得结果以前,我不会返回。 \4. 非阻塞,就是调用我(函数),我(函数)当即返回,经过select通知调用者

同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞

阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否当即返回

综上可知,同步和异步,阻塞和非阻塞,有些混用,其实它们彻底不是一回事,并且它们修饰的对象也不相同。

二、五种IO模型

在了解了同步与异步、阻塞与非阻塞概念后,咱们来说讲linux的五种IO模型:

1)阻塞I/O(blocking I/O) 2)非阻塞I/O (nonblocking I/O) 3) I/O复用(select 和poll) (I/O multiplexing) 4)信号驱动I/O (signal driven I/O (SIGIO)) 5)异步I/O (asynchronous I/O (the POSIX aio_functions))

其中前4种都是同步,最后一种才是异步。

2.一、阻塞I/O

应用程序调用一个IO函数,致使应用程序阻塞,等待数据准备好。 若是数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。

阻塞I/O模型图:在调用recv()/recvfrom()函数时,发生在内核中等待数据和复制数据的过程。

img当调用recv()函数时,系统首先查是否有准备好的数据。若是数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,而后该函数返回。在套接应用程序中,当调用recv()函数时,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。

2.二、非阻塞I/O

非阻塞IO经过进程反复调用IO函数(屡次系统调用,并立刻返回);在数据拷贝的过程当中,进程是阻塞的

咱们把一个SOCKET接口设置为非阻塞就是告诉内核,当所请求的I/O操做没法完成时,不要将进程睡眠,而是返回一个错误。这样咱们的I/O操做函数将不断的测试数据是否已经准备好,若是没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程当中,会大量的占用CPU的时间。

img

2.三、IO复用

主要是select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并无什么优越性;关键是能实现同时对多个IO端口进行监听; I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,可是和阻塞I/O所不一样的的,这两个函数能够同时阻塞多个I/O操做。并且能够同时对多个读操做,多个写操做的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操做函数。

img

img

2.四、信号驱动IO

首先咱们容许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,能够在信号处理函数中调用I/O操做函数处理数据。

img

2.四、异步IO

当一个异步过程调用发出后,调用者不能马上获得结果。实际处理这个调用的部件在完成后,经过状态、通知和回调来通知调用者的输入输出操做

img

最后,总结比较下五种IO模型:

img

相关文章
相关标签/搜索