(精华)JAVA IO模型_JAVA_流程图_架构图_系统图_数据库
2024-11-03 14:20:09 21 举报
(精华)JAVA 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 条评论
下一页
为你推荐
查看更多