JAVA的IO模型的学习

参考:
https://www.zhihu.com/question/337609338
https://blog.csdn.net/ty497122758/article/details/78979302
https://blog.csdn.net/weixin_41563161/article/details/104242190
https://blog.csdn.net/crazymakercircle/article/details/85858596
这个对IO模型讲的比较好:https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484746&idx=1&sn=c0a7f9129d780786cabfcac0a8aa6bb7&source=41&scene=21#wechat_redirect

在Java中主要有三种IO模型, 分别是阻塞IO(BIO), 非阻塞IO(NIO), 和异步IO(AIO)

在Linux操作系统中,共有5种IO模型,分别是阻塞型IO,非阻塞型IO模型,IO复用模型,信号驱动IO模型以及异步IO模型。
可以把JAVA中的BIO,NIO和AIO理解为是JAVA对操作系统各种IO模型的封装,比如在Linux 2.6以后,Java中NIO和AIO都是通过epoll来实现的,而在Windows上,AIO是通过IOCP来实现的。

Linux的基本IO模型学习:
参考: https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484746&idx=1&sn=c0a7f9129d780786cabfcac0a8aa6bb7&source=41&scene=21#wechat_redirect
1) 阻塞型IO模型:应用进程调用recvfrom接收数据,在数据包未被复制到应用进程缓冲区之前或者未发生错误之前,在此期间一直等待
2) 非阻塞IO模型:recvfrom从应用成到内核的时候,如果没有数据就直接返回一个EWOULDBLOCK错误,然后进行轮询.
3) IO复用模型:多个进程的IO注册到同一个select上,select会监听所有注册好的IO,当管道中至少有一个IO所需的数据准备好(在此之前select调用进程会阻塞),select调用就会返回,然后进程在通过recvfrom来进行数据拷贝。
4) 信号驱动IO模型: 应用进程预先向内核注册一个信号处理函数,然后用户进程返回(不阻塞),当内核数据准备就绪时,就给应用进程发一个信号,应用进程就在信号处理函数中把数据拷贝到用户空间中
5) 异步IO模型:应用进程把IO请求传给内核后,完全由内核去处理,内核完成拷贝之后,会发信号告诉应用进程本次IO处理完成.(用户进程发起aio_read操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等,告诉内核当整个操作完成时,如何通知进程,然后就立刻去做其他事情了。当内核收到aio_read后,会立刻返回,然后内核开始等待数据准备,数据准备好以后,直接把数据拷贝到用户控件,然后再通知进程本次IO已经完成。)

JAVA中IO:
参考: https://blog.csdn.net/weixin_41563161/article/details/104242190
BIO: 传统网络通讯模型,就是同步阻塞型IO(BIO),简单的来说就是服务端创建一个ServerSocket,然后客户端用一个Socket去连接服务端,服务端收到连接就创建一个线程和和Scoket进行处理;简单的来说一个客户端接入就需要在服务端创建一个线程. 传统IO模型比较经典的设计模式是: 一个是多线程,一个是线程池. 反正结果都一样,客户端多的时候,都会死

NIO:是一种同步[加黑]非阻塞IO,基于Reactor模型来实现的,通过一个一个Selector轮询大量的channel(信道),每次获取一批有事件的channel(信道),只有当某个Channel(信道)有对应的请求的时候才会创建线程,
NIO形态:
1) 非阻塞形态: 需要核心组件 Buffer缓冲区,Selector选择器,Channel信道
2) 阻塞形态: Buffer缓冲区,Channel信道

AIO: 异步非阻塞IO,基于Proactor模型,每个连接发送过来的请求都会绑定一个Buffer,然后操作系统异步去完成读,等操作系统完成异步读操作就调用进程的接口去处理数据,写操作类似

面试题:

  1. NIO与IO的区别?
    ①BIO面向流,阻塞型IO,NIO面向缓冲,非阻塞IO,有选择器
  2. BIO 和 NIO 作为 Server 端,当建立了 10 个连接时,分别产生多少个线程?
    答: IO 是同步线程堵塞,一个连接对应一个线程, 所以是10个
    NIO是同步非阻塞的 I/O 模型,多路复用,所以即使有 10 个连接,对于 NIO 来说,开启 1 个线程就够了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值