IO-同步,异步,阻塞,非阻塞

虽然自己并不是主要从事网络编程方向,但是现在不会点名词吹牛还真使不上劲^_^。玩笑了,IO的概念还是需要我们去学习的。因为大多数的瓶颈都是首先出现在此,所以不得不去学习。看到的博客还是要自己去记载一份,免的以后找不到不知道该怎么办了。。

参考文章:

IO同步异步讲解

知乎的争论

看大家在讨论时都基于一个点,Linux的network IO。

分成几块

同步IO,异步IO,阻塞IO,非阻塞IO。

1.同步异步

同步异步是基于消息通信机制

1.1 同步:当发出一个调用时,在没有得到结果之前,改调用不返回。但是一旦返回,就得到返回值。注意关键字,调用不返回

1.2 异步:当发出一个调用后,这个调用就直接返回,没有真正的返回结果,或许只有一个标识等(这边是个人理解)。那么最终被调用者通过通知来通知调用者,或者通过回调函数来处理这个调用。

2. 阻塞和非阻塞

阻塞和非阻塞关注点是程序在等待结果是的状态。

2.1 阻塞:阻塞调用指调用结果返回之前,当前线程挂起,不能处理其他事情。

2.2 非阻塞:在调用时不需要立马得到结果,可以先做其他事情。不会阻塞当前线程。

两个概念的关注点完全不一样。。。

IO 模型

Blocking IO(阻塞IO)

Non Blocking IO(非阻塞IO)

IO multiplexing(IO多路复用)

signal driven IO(通知驱动IO)

asynchronous IO(异步IO)

IO发生时设计的对象和步骤

对象:调用这个IO的process(Thread)。系统内核(Kernel)。

步骤:

1.等待数据准备

2.将数据从内核拷贝到用户进程中

Blocking IO


用户进程在调用recvfrom时。Kernel开始接收数据,并开启了IO的第一个阶段:准备数据。此时用户进程就被block住了。当Kernel准备好数据之后就会将数据从Kernel拷贝到用户内存,然后返回结果。用户进程才解除block状态。

所以Blocking IO的特点就是在IO执行的两个阶段都是block的。

Non Blocking IO


图很清晰,在用户进程第一次发出recvfrom请求时,由于此时Kernel并没有准备好数据,所以立马返回一个结果告诉了用户进程。从用户进程角度看,这一次请求没有等待,它得到了一个结果(虽然这个结果不是正确的结果)。这个时候用户进程知道内核没有准备好。于是用户进程之后会不断重复发出读取指令,当Kernel准备好数据并且再次收到读取指令时,会将数据拷贝到用户内存。

所以No Blocking IO的特点是需要不断主动询问数据是否准备好。

IO multiplexing

IO多路复用,又叫做event driven IO(事件驱动IO)。


用户进程调用select时,整个进程block住了。同时Kernel会监视所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read()。进行数据的内核拷贝用户内存操作。

特点:使用两个system call(select和recvfrom),select的优势在于它能同时处理多个connection。对于每一个socket,可以设置成非阻塞的,但是对于整个process其实一直都是被select阻塞住的,不是被socket IO给block住的。

Asynchronous IO

用户进程发起aio_read之后。可以立马做其他事情。从Kernel角度看,它是立马返回,只不过返回的也不是正确数据,然后kernel准备数据,将数据拷贝到用户内存。随后会告诉用户进程,准备好了,你可以获取数据了。


Blocking IO vs Non Blocking IO区别:

调用Blocking IO的话会一直阻塞住对应进程直到结果返回。但是Non Blocking IO并不会阻塞住,而是收到一个假的返回结果,可以执行自己其他的逻辑,但是当kernel通知它数据好了之后,它需要再次去read()。这个时候它又阻塞住了,因为它在等待数据返回。

Synchronous IO vs Asynchronous IO区别:

定义:来自POSIX

A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
An asynchronous I/O operation does not cause the requesting process to be blocked; 

翻译一下就是在IO 操作时会将process阻塞住,因此Blocking IO和Non Blocking IO和IO multiplexing都是Synchronous IO,因为它们在执行IO时,都存在一个点,就是Kernel将数据拷贝到用户内存的操作,这个操作将它们阻塞住了。而Asynchronous IO是真正的异步IO,因为整个过程中(两个步骤都对用户进程没有影响,用户进程唯一要做的就是当Kernel通知它数据好了,它来拿就是了


猜你喜欢

转载自blog.csdn.net/qq_32924343/article/details/80523684