NIO/IO/AIO模型-同步,异步,非阻塞各种开荒指南

I/O操作的概念

I/O操作本质是基于流的形式传播数据.
在操作系统中进程分为用户态内核态,I/O操作必须通过内核态来完成(系统调用:用户态切换到内核态)
当我们使用I/O操作时会从用户态切换到内核态,

我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。不过话说回来了 ,计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是文件描述符,即通常所说的fd,一个fd就是一个整数,所以,对这个整数的操作,就是对这个文件(流)的操作。我们创建一个socket,通过系统调用会返回一个文件描述符,那么剩下对socket的操作就会转化为对这个描述符的操作。不能不说这又是一种分层和抽象的思想。




同步与异步的概念

前言知识:I/O操作由内核态完成,等待内核态完成I/O操作后,复制一份给缓存空间,然后用户态再从该缓存空间里面读取数据存储到用户缓存空间;
同步: 进程触发I/O操作后等内核态完成后,进行堵塞式的从缓存中读取数据;
异步:进程触发I/O操作后挂在后台,等待内核态完成后放在指定的用户缓存空间,然后通知用户态已经完成,全程由内核态进行;

通俗理解:同步:我喊手下去做事,手下做完后放到仓库,我再从仓库拿取物品放到指定地点; 这里我从仓库拿东西是堵塞的
------------:异步:我喊手下去做事,手下做完后放到我指定的地点,然后再通知我; 这里我是非阻塞的





堵塞与非堵塞的概念

read()读取数据,recvfrom()接受数据
堵塞:调用read()操作,如数据未准备好,则线程挂起等待数据准备好,然后开始数据的复制行为;
非堵塞:调用read()操作,如数据未准备好,没有数据准备好就一直轮询(隔一段时间的问是否准备好),直到有数据准备好了可以开始进行数据的复制了为止。

同步阻塞模型

用户态调用I/O,等待内核态数据准备完成,然后执行数据的复制操作
在此期间用户是同步(都在前台完成),是堵塞的(等待数据准备就绪后开始复制)
在这里插入图片描述

同步非堵塞模型

用户态调用I/O,不停的使用read()查看是否完成,如果完成则进行数据复制
在此期间用户是同步的,是非阻塞的(不会堵死等待数据就绪,而是轮询形式询问数据是否就绪)
在这里插入图片描述

IO多路复用模型(NIO前身)

在同步非阻塞IO模型中,多次使用read()会造成CPU的负担,因为会造成多次系统调用;
在IO多路复用模型中,通过一个类来提醒是否数据已经准备好;
设select()为查询数据是否准备好,当数据准备好后,内核态会发送一个准备好的状态给用户态,然后用户态调用read()方法进行数据拷贝;

在这里插入图片描述

JAVA中的NIO

JAVA中的NIO有一个选择器的概念,被称为多路复用器.通过它,使用一个线程来管理多个客户端的连接,当客户端数据到了以后,才会为其服务;

在这里插入图片描述

AIO异步模型

异步是基于事件和回调机制实现的,用户调用read()不会堵塞,会当成后台处理,等后台处理完成后,内核态会通知相应的程序进行后续的操作
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值