在写程序的时候,经常看到API文档中写同步IO或者异步IO的概念,但是不是明白这两者具体有什么区别。。。希望有大佬可以帮忙回答下,谢谢了

上传的附件
你的回答被采纳后将获得: 8点积分 (将会扣除手续费1点积分。)

keyboard_arrow_left上一篇 : 同步IO和异步IO的区别是什么? 自学Python语言,是看书好还是看视频好呢? : 下一篇keyboard_arrow_right

17个回答

Mockingjay
2019-03-07 09:02:41

等待。。。

LeftEar
2019-03-07 10:12:18

同步是所有的操作都做完,才返回给用户结果
异步不用等所有操作等做完,就响应用户请求

Naiiive
2019-03-07 13:39:09

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
异步的概念和同步相对,当一个异步过程调用发出后,调用者不会立刻得到结果;实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。

Juvenile
2019-03-07 20:09:50

一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage和PostMessage。SendMessage函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。

FollowMe
2019-04-18 09:14:49

同步的话,就相互等待、相互制约;异步的话,就各做各的,互不干扰

FullHouse
2019-05-10 10:29:58

就是字面上的意思啊。。。

954880947
2019-11-13 22:22:04

同步是阻塞模式,异步是非阻塞模式。
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

浅黎
2021-01-05 09:52:00

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

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

同步和异步都只针对于本机SOCKET而言的。
同步和异步,阻塞和非阻塞,有些混用,其实它们完全不是一回事,而且它们修饰的对象也不相同。
阻塞和非阻塞是指当server端的进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪时是直接返回还是等待就绪;

而同步和异步是指client端访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞(区别就绪与读写二个阶段,同步的读写必须阻塞),异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。(等待”通知”)

xzw
2021-06-27 12:52:04

转发一下哈
要介绍同步IO与异步IO,得先介绍Unix5种I/O模型:

  1. 阻塞IO
  2. 非阻塞IO
  3. IO复用(select和poll)
  4. 信号驱动式IO(SIGIO)
  5. 异步IO(aio_系列函数)

5种IO模型都包含两个阶段:

  1. 等待数据准备好(等待数据从网络中到达,数据到达后,被复制到内核的缓冲区中)
  2. 从内核缓冲区向用户缓冲区复制数据

分别介绍不同的IO模型,并且使用UDP作为例子,因为UDP整个数据报要么已经收到,要么没有。

阻塞IO

进程调用recvfrom,该系统调用直到数据报到达且被复制到应用进程的缓冲区或者发生错误才返回,常见的错误是系统调用被系统中断,

非阻塞IO

等待数据的阶段是非阻塞的,也就是当没有数据报准备好,recvfrom立即返回一个错误,但是当数据包准备好了,recvfrom将数据报从内核缓冲区复制到应用进程缓冲区后返回。

IO复用

如图,io复用模型是阻塞在select或者poll这两个系统调用之上的,而没有阻塞在真正的I/O系统调用如recvfrom之上,它等待数据报套接字变为可读,当数据报可读时,调用recvfrom把数据报复制到应用进程缓冲区中。

信号驱动式IO

通过sigaction系统调用安装一个信号处理函数,系统调用立即返回,当数据报准备好读取时,内核产生一个信号,随后就可以在信号处理函数中调用recvfrom读取数据报,将数据从内核空间复制到用户空间。

异步IO

调用aio_系列函数,给内核传递描述符、缓冲区指针、缓冲区大小和文件偏移,该系统调用立即返回,当整个IO操作完成,即数据报到达,并且从内核缓冲区被复制到用户缓冲区后,才产生一个信号。

IO模型比较
对比几种模型,可以看出,前4种模型区别主要在第一阶段,它们的第二阶段是一样的:在数据从内核复制到调用者缓冲区期间,进程是阻塞于recvfrom调用,而异步IO,这两个阶段都要处理完毕。

同步IO/异步IO
同步IO操作:导致请求进程阻塞,知道IO操作完成。
异步IO操作:不导致进程阻塞。

所以前4种都是同步IO模型,因为发生了阻塞。

阻塞/非阻塞
在处理(网络) IO 的时候,阻塞和非阻塞都是同步IO,阻塞与非阻塞的区分在于网络IO时进行IO操作的线程会不会挂起,其实对于某些IO模型来说,阻塞非阻塞其实比较难定义,比如select模型中指用户线程不会阻塞于recvfrom等网络IO操作上,但在select操作本身上是阻塞的,不过因为网络IO并未阻塞的原因仍称selec模型为非阻塞的模型。
————————————————
版权声明:本文为CSDN博主「__style」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/twostyle/article/details/73967648

2021-06-27 18:55:50

IO分两阶段:1.数据准备阶段2.内核空间复制回用户进程缓冲区阶段一般来讲:阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,因为阶段2是阻塞的(尽管时间很短)。只有异步IO模型是符合POSIX异步IO操作含义的,不管在阶段1还是阶段2都可以干别的事。2.内核空间复制回用户进程缓冲区阶段一般来讲:阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,因为阶段2是阻塞的(尽管时间很短)。只有异步IO模型是符合POSIX异步IO操作含义的,不管在阶段1还是阶段2都可以干别的事。

雨开雨心
2021-06-28 09:14:18

同步IO,是一种用户空间和内核空间的IO发起方式。同步是指用户空间的线程是主动发起IO请求的一方,内核空间是被动接受方。异步IO则反过来,是指系统内核是主动发起IO请求的一方,用户空间的线程是被动接受方。
异步IO,指的是用户空间与内核空间的调用方式反过来。用户空间的线程变成被动接受者,而内核空间成了主动调用者。这有点类似于Java中比较典型的回调模式,用户空间的线程向内核空间注册了各种IO事件的回调函数,由内核去主动调用。

芝屋猪
2021-06-29 15:01:05

IO模型
这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以调用时会从用户进程空间切换到内核空间运行一段时间再切换回来。默认情况下recv会等到网络数据到达并且复制到用户进程空间或者发生错误时返回,而第4个参数flags可以让它马上返回。

阻塞IO模型
使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,打开水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。

image

非阻塞IO模型
改变flags,让recv不管有没有获取到数据都返回,如果没有数据那么一段时间后再调用recv看看,如此循环。B同学也用杯子装水,打开水龙头后发现没有水,它离开了,过一会他又拿着杯子来看看……在中间离开的这些时间里,B同学离开了装水现场(回到用户进程空间),可以做他自己的事情。这就是非阻塞IO模型。但是它只有是检查无数据的时候是非阻塞的,在数据到达的时候依然要等待复制数据到用户空间(等着水将水杯装满),因此它还是同步IO。

image

IO复用模型
这里在调用recv前先调用select或者poll,这2个系统调用都可以在内核准备好数据(网络数据到达内核)时告知用户进程,这个时候再调用recv一定是有数据的。因此这一过程中它是阻塞于select或poll,而没有阻塞于recv,有人将非阻塞IO定义成在读写操作时没有阻塞于系统调用的IO操作(不包括数据从内核复制到用户空间时的阻塞,因为这相对于网络IO来说确实很短暂),如果按这样理解,这种IO模型也能称之为非阻塞IO模型,但是按POSIX来看,它也是同步IO,那么也和楼上一样称之为同步非阻塞IO吧。

这种IO模型比较特别,分个段。因为它能同时监听多个文件描述符(fd)。这个时候C同学来装水,发现有一排水龙头,舍管阿姨告诉他这些水龙头都还没有水,等有水了告诉他。于是等啊等(select调用中),过了一会阿姨告诉他有水了,但不知道是哪个水龙头有水,自己看吧。于是C同学一个个打开,往杯子里装水(recv)。这里再顺便说说鼎鼎大名的epoll(高性能的代名词啊),epoll也属于IO复用模型,主要区别在于舍管阿姨会告诉C同学哪几个水龙头有水了,不需要一个个打开看(当然还有其它区别)。

image

信号驱动IO模型
通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)。

image

异步IO模型
调用aio_read,让内核等数据准备好,并且复制到用户进程空间后执行事先指定好的函数。E同学让舍管阿姨将杯子装满水后通知他。整个过程E同学都可以做别的事情(没有recv),这才是真正的异步IO。

image

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

总结
IO分两阶段:

1.数据准备阶段
2.内核空间复制回用户进程缓冲区阶段
一般来讲:阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,因为阶段2是阻塞的(尽管时间很短)。只有异步IO模型是符合POSIX异步IO操作含义的,不管在阶段1还是阶段2都可以干别的事。

LEO
2021-07-24 12:04:44

应该跟同步线程异步线程类似吧

烟酰胺不算酸
2021-07-29 13:49:13

/*
同步IO的特点:
同步IO指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪。
同步IO的执行者是IO操作的发起者。
同步IO需要发起者进行内核态到用户态的数据拷贝过程,所以这里必须由个阻塞

异步IO的特点:
异步IO是指用户进程触发I/O操作以后就立即返回,继续开始做自己的事情,而当I/O操作已经完成的时候会得到I/O完成的通知。
异步IO的执行者是内核线程,内核线程将数据从内核态拷贝到用户态,所以这里没哟阻塞
*/

wgb123wgb
2021-09-03 14:26:39

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
异步的概念和同步相对,当一个异步过程调用发出后,调用者不会立刻得到结果;实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。

你好明天
2021-10-09 15:35:05

同步是多数的线程同时进行,异步是多数线程有序执行

eject