首页 > 编程知识 正文

异步和协程的区别,异步非阻塞io

时间:2023-05-04 16:46:13 阅读:111282 作者:4398

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

读了几篇文章,我发现有各种各样的理解。 可能是因为大家切口的角度、环境不同。 因此,首先介绍基本的IO操作和环境。 本文是第《UNIX网络编程 卷1:套接字联网API》 6.2节“I/O模型”的基础,即在UNIX/LINUX环境下的网络IO环境下的理解,其中的示例是网络UDP数据的读取(接收)。 以下简要写下自己对这些IO模型的理解。

1、IO

http://www.Sina.com/http://www.Sina.com /

LINUX进程不能直接操作I/O设备。 必须通过系统调用请求内核完成I/O操作。 内核为每个I/O设备维护一个缓冲区。

对于输入操作,在进程IO系统调用后,内核会查看缓冲区中是否存在相应的缓存数据,如果没有,则读取到设备中。 设备IO一般很慢,需要等待。 如果内核缓冲区中包含数据,则会直接复制到进程区域。

因此,一个网络输入操作通常包括两个不同的阶段。

(1)等待网络数据到达网卡被读入内核缓冲区,准备数据;

(2)从内核缓冲区向进程空间复制数据。

IO (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作,通常用户进程中的一个完整IO分为两阶段:用户进程空间--内核空间、内核空间--设备空间(磁盘、网络等)《UNIX网络编程》明确地说,五种类型的IO模型分别是块IO模型、去块IO模型、IO复用模型、信号驱动IO模型和异步IO模型; 前四个是同步I/o操作,只有异步I/o模型是异步I/o操作。 以下示例基于IO模型分析接收网络UDP数据的过程并简要描述这些IO模型。

IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。

进程开始调用IO系统后,进程被屏蔽,进入内核空间处理,整个IO处理完成后返回进程。 如果操作成功,进程将检索数据。

1、典型应用:2、5种IO模型

2、特点:

2-1、阻塞IO模型

实现难度低,APP软件开发容易

并发使用量少的web APP开发

3358www.Sina.com/:1:因为一个请求IO阻塞进程,所以必须为每个请求分配处理进程(线程)和时间响应,开销很大。

阻塞socket、Java BIO;

如果进程启动IO系统调用后内核缓冲区中没有数据且需要读取到IO设备,则进程将返回错误而不会阻塞。 进程启动IO系统调用后,如果内核缓冲区中包含数据,内核会将数据返回给进程。

在上述块IO模型中,内核数据是进程阻塞挂起不消耗CPU资源,及时响应每个操作

1、典型应用:套接字为无阻塞方式(设置为NONBLOCK ) ) ) ) )。

2、特点:

不适用并发量大的应用

实现难度低,开发APP应用相对难以屏蔽IO模式;

并发性少,不需要及时应对的web APP开发

2-2、非阻塞IO模型

可以在一个复用器(select )中注册多个进程的IO,并在一个进程中调用该选择。 select会监听所有注册的IO。

如果未接收到select的IO在内核缓冲区中没有可读数据,则select调用进程将被阻止。 如果任何IO在内核缓冲区中包含数据,则会返回select调用。

然后,选择呼叫进程可以自己或者通知另一个过程(注册过程)重新开始读取IO,然后读取准备用于内核的数据。

需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞。

1、典型应用:进程轮询(重复)调用,消耗CPU的资源

trong>Java NIO;

2、特点:

专一进程解决多个进程IO的阻塞问题,性能好Reactor模式;

实现、开发应用难度较大;

适用高并发服务应用开发:一个进程(线程)响应多个请求

3、select、poll、epoll

Linux中IO复用的实现方式主要有select、poll和epoll:

Select:注册IO、阻塞扫描,监听的IO最大连接数不能多于FD_SIZE;

Poll:原理和Select相似,没有数量限制,但IO数量大扫描线性性能下降;

Epoll :事件驱动不阻塞,mmap实现内核与用户空间的消息传递,数量很大,Linux2.6后内核支持;

 2-4、信号驱动IO模型

       当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。

       1、特点:回调机制,实现、开发应用难度大;

2-5、异步IO模型

       当进程发起一个IO操作,进程返回(不阻塞),但也不能返回果结;内核把整个IO处理完后,会通知进程结果。如果IO操作成功则进程直接获取到数据

1、典型应用:JAVA7 AIO、高性能服务器应用

2、特点:

不阻塞,数据一步到位Proactor模式

需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;

实现、开发应用难度大;

非常适合高性能高并发应用;

3、IO模型比较

3-1、阻塞IO调用和非阻塞IO调用、阻塞IO模型和非阻塞IO模型

       注意这里的阻塞IO调用和非阻塞IO调用不是指阻塞IO模型和非阻塞IO模型:

              阻塞IO调用 :在用户进程(线程)中调用执行的时候,进程会等待该IO操作,而使得其他操作无法执行。

              非阻塞IO调用:在用户进程中调用执行的时候,无论成功与否,该IO操作会立即返回,之后进程可以进行其他操作(当然如果是读取到数据,一般就接着进行数据处理)。

       这个直接理解就好,进程(线程)IO调用会不会阻塞进程自己。所以这里两个概念是相对调用进程本身状态来讲的。

       从上面对比图片来说,阻塞IO模型是一个阻塞IO调用,而非阻塞IO模型是多个非阻塞IO调用+一个阻塞IO调用,因为多个IO检查会立即返回错误,不会阻塞进程。

       而上面也说过了,非阻塞IO模型对于阻塞IO模型来说区别就是,内核数据没准备好需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞。

3-2、同步IO和异步IO

同步IO:导致请求进程阻塞,直到I/O操作完成。

异步IO:不导致请求进程阻塞。

       上面两个定义是《UNIX网络编程 卷1:套接字联网API》给出的。这不是很好理解,我们来扩展一下,先说说同步和异步,同步和异步关注的是双方的消息通信机制

              同步:双方的动作是经过双方协调的,步调一致的。

              异步:双方并不需要协调,都可以随意进行各自的操作。

       这里我们的双方是指,用户进程和IO设备;明确同步和异步之后,我们在上面网络输入操作例子的基础上,进行扩展定义:

             同步IO:用户进程发出IO调用,去获取IO设备数据,双方的数据要经过内核缓冲区同步,完全准备好后,再复制返回到用户进程。而复制返回到用户进程会导致请求进程阻塞,直到I/O操作完成。

             异步IO:用户进程发出IO调用,去获取IO设备数据,并不需要同步,内核直接复制到进程,整个过程不导致请求进程阻塞。

      所以, 阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型者为同步IO模型,只有异步IO模型是异步IO。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。