首先我们要知道,Linux有哪些IO模型呢?
他们分别是,阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型、异步IO模型。
那什么是IO呢?
IO就是指文件的输入和输出
那实现一个怎样的过程才能称为一次IO呢?
拿从磁盘读取文件为例,就是将文件读取到内存中,即完成从硬件到用户空间的一个过程。
java中的“IO”与系统层面的IO模型有什么不同呢?
java中的阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)其实只是IO提供的API接口,对于系统层面的IO作了一个封装,当需要时,只需要调用就行,程序员不用考虑系统层面的东西,不需要因为系统不同,写不一样的代码。
在一篇公众号推文上,作者用钓鱼来解释了关于IO的五种模型,简单易懂,我们也就借着这个例子解释一下吧。
在讲之前需要我们明白钓鱼过程和文件读取有什么关系呢?
池塘相当于磁盘,小鱼相当于想要的文件,钓鱼的鱼钩相当于内核空间,渔笼相当于用户空间。一次完整的钓鱼过程(IO操作),是小鱼(文件)从鱼塘(磁盘)转移到(拷贝)到渔笼(用户空间)的过程。
钓鱼的时候,只要我们端着小板凳等着鱼上钩,等到有小鱼咬鱼钩,就将鱼钓起来,放在鱼笼,然后在去钓鱼。
影射在操作系统上,这就是最简单的阻塞IO模型,表现为进程或线程等待某个条件,当条件不满足是,一直等待,直到条件满足。具体表现为,应用进程通过recvfrom系统调用接受数据,但因为内核还没有准备好,就会一直处于阻塞状态,当内核准备好数据,recvfrom就会复制数据报,当其完成复制,应用才会结束阻塞状态。(完成复制也就是将鱼放在了鱼笼里)
优点:实现简单,不需要特殊工具
缺点:时效性低,并发低(当需求较小时比较适合)
当钓鱼时,我们可以做一些其他事情,比如听歌玩玩游戏,但是呢,我们也要时不时的看一下鱼竿,一旦发现,有鱼上钩,就要把鱼调上来,然后在去钓鱼。
映射在操作系统上,就是非阻塞IO模型。表现为进程在与内核交互的过程中不再一眛等待,而是直接返回,然后不断轮询,等内核准备好。具体表现为,应用进程通过不断发送recvfrom系统调用与内核进行交互,直到内核准备好数据,当内核没有准备好时会返回error,等过段时间在发送,这段时间间隔内进程可以做其他事情。
特点:使用的工具没有什么变化,时间利用率增加。
钓鱼时,我们可以去做其他事情,但是不用时不时去看看,我们可以给鱼竿上面安装一个警报器,当>有鱼咬鱼竿时,警报器报警,这个时候,我们去看鱼竿,把鱼钓上来,然后在去钓鱼。
映射在操作系统上,就是信号驱动IO模型。表现为应用进程在读取文件时告知内核,如果某个socket的某个事件发生变化时,给我发送一个信号,在收到信号时,该信号会被相应的信号函数处理,进行后续操作。具体表现为,应用进程预先向内核注册一个信号处理函数,内核通过用户进程返回并且不阻塞,当内核准备好数据,会向进程发送信号,当信号处理函数接受信号后,会通过recvfrom系统调用复制数据,拷贝到用户空间中。
特点:实现起来复杂了些
钓鱼时,为了保证在最短时间内,钓上来更多的鱼,我们可以多方一些鱼竿,看到哪个鱼竿有鱼就把他钓上来,然后在去钓鱼。
映射在操作系统上,就是IO复用模型。表现为多个进程的IO注册到一个管道中,由这个管道统一和内核交互,当有一个请求的数据准备好时,就进行数据复制拷贝到用户空间。具体表现为,多个进程的IO注册到select函数上,当用户进程调用select函数时,select会自动监控所有注册在上面的IO,如果
所有监听IO需要的数据都没有准备好,select调用进程会阻塞,如果有一个IO需要的数据准备好时,select调用就会返回,然后进程在通过recvfrom复制数据。(完成后需要再次发送请求拷贝文件)
究竟什么是同步什么是异步呢?
同步与异步关注的是一种消息通知机制。
同步简单来说,就是请求者主动等待请求结果。
异步简单来说,像你打电话问书店老板,还有没有《小王子》这本书啊,老板挂掉电话等他查到之后,给你电话告诉你有没有。
以上都属于同步(对于信号驱动模型,可以认为数据准备阶段是异步的,但数据的拷贝是同步的)
无论以何种方式钓鱼,都需要人工干预。
如果我们有一个智能鱼竿,可以自动完成整个钓鱼过程,并将鱼放在鱼笼里面,告诉我们鱼已经钓到了,然后又自己钓鱼。
映射在操作系统上,就是异步IO模型。表现为,应用进程将请求发送给内核后由内核完成数据的复制操作,等全部完成之后,发送信号告诉应用进程本次IO已经完成。具体表现为,用户进程发起aio_read操作之后,将给内核传递描述符、缓冲区指针、缓冲区大小等,并告诉内核以何种方式通知我已经完成数据复制,然后就立刻去作其他事情,当内核接受到aio_read后,立刻返回,然后内核就开始等待数据准备,数据准备完成,直接将准备好的数据复制到用户空间,然后通知进程本次IO完成。
本文发布于:2024-02-01 16:40:59,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170677685738012.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |