(精华)JAVA IO模型
2024-01-09 15:56:00 20 举报
登录查看完整内容
Java IO模型主要有三种:同步阻塞IO、异步非阻塞IO和异步阻塞IO。同步阻塞IO是指在读写数据时,线程会一直等待,直到数据读取或写入完成。异步非阻塞IO是指在读写数据时,线程不会一直等待,而是通过回调函数来通知数据读取或写入完成。异步阻塞IO是指在读写数据时,线程不会一直等待,但是需要手动唤醒线程来处理数据读取或写入完成的情况。这些IO模型都有各自的优缺点,可以根据实际需求选择合适的模型来实现高效的文件读写操作。
作者其他创作
大纲/内容
可读连接
复制数据到用户缓冲区
1、应用进程向内核发起read读取数据2、数据没有准备好,直接返回EWOULDBLOCK错误(非阻塞)3、应用进程不断发起read读取数据4、内核缓冲区数据准备好后,将数据复制到用户缓冲区(阻塞)5、复制完成,返回成功- 内核空间数据准备好前,线程都不阻塞,- 线程会轮询,确认内核数据是否准备好,准备好后,就会进行数据复制- BIO是面向流的,是单向通道;NIO是面向缓冲区的,是双向通道- 这个NIO模型不是JAVA中的NIO,这个循环会循环所有socket连接,性能太差
TCP接收缓冲区(内核空间)
1、发送数据
read调用N
阻塞
复制数据
等待数据
TCP发送数据流程
2、发送数据
TCP发送缓冲区(内核空间)
完成通知
linux内核空间
应用A
调用返回
等待内核缓冲区数据
1、应用进程向内核发起read读取数据2、等待内核缓冲区数据(阻塞)3、内核缓冲区数据准备好后,复制数据到用户缓冲区(阻塞)4、复制完成,返回成功- 用户空间和内核空间都是在内存中的- read系统调用是将数据从内核空间复制到用户空间;write系统调用是将数据从用户空间复制到内核空间;底层都是由内核来完成的
TCP/IP层
select调用
用户空间
复制完成
read调用
read调用1
IO模型-同步非阻塞NIO
发送数据
应用层
接收数据
IO模型-异步IO
IO模型-同步阻塞
IO模型-IO多路复用
非阻塞做其它事情
应用B
非阻塞
3、接收数据
1、进程受阻于select调用,等待多个socket中的任意一个变为可读(阻塞)2、当socket变成可读时(说明内核缓冲区数据已经准备好),用户进程发起read读取数据,将数据复制到用户缓冲区(阻塞)3、复制完成,返回成功- JAVA中的NIO就是IO多路复用,Linux环境下底层使用的是epoll- 该模型适用于连接数多,连接时间短的场景- select阻塞,等待所有socket中的任意一个变成可读
read调用2
TCP发送流程简单分为三步:1、应用A将数据发送到TCP发送缓冲区2、TCP发送缓冲区将数据发送出去,经过网络传输,会到达应用B的TCP接收缓冲区3、应用B再从TCP接收缓冲区内读取数据,读到用户缓冲区注:1、IO模型中所说的阻塞是指在建立连接后,读取数据时出现的情况2、应用B向TCP接收缓冲区读取数据时,数据还没有准备好,这时线程会阻塞3、TCP接收缓冲区数据准备好后,在复制数据到用户缓冲区时,也会发生阻塞
0 条评论
回复 删除
下一页