Professional Documents
Culture Documents
20220904:网络通信之Socket及Java IO模型详解-课程笔记
20220904:网络通信之Socket及Java IO模型详解-课程笔记
20220904:网络通信之Socket及Java IO模型详解-课程笔记
1. 网络通信之 Socket
2. Java 四种 IO 模型
3. 多路复用 IO 模型
4. AIO 异步 IO
1 网络通信之 Socket
网络通信之 Socket
本地 I/O 网络 I/O
用户空间 用户空间
缓冲区 缓冲区
read() read()
内核空间 内核空间
缓冲区 缓冲区
read() read()
磁盘 网卡
网络通信之 Socket
用户进程
用户进程 应用层
Socket 接口
应用程序 内核
系统调用
recv 数据包没准备好
整
等待数据
个
过
程
数据包准备好
全
部
阻
塞 将数据从内核
拷贝到用户空间
处理数据包 拷贝完成
Socket 交互整体流程
客户端 服务端
new 文件描述符,
文件描述符 new ServerSocket(8080)
Socket(8080) 监听 socket
1. 设置本机端口
bind()
2. 设置本机 IP
保存客户端和
connect()
服务端信息
SYN_SENT 1
全连接队列
监听 socket 收到请求,
accept()
返回一个新的 socket, 使
用新的 socket 传输数据
发送数据 write() read() 接收数据
进程的 task_stuct
files_struct
文件描述符列表
*Files
Socket Sk_buffer
file[0]
fd_array[] file[1] 接收队列 head
file[2] 发送队列 data
... 等待队列 tail
end
非阻塞 IO
非阻塞 IO (No Blocking IO)
应用程序 内核
系统调用
recv 数据包没准备好
反 系统调用
复 recv 数据包没准备好
轮 等待数据
系统调用
询 recv 数据包没准备好
直
到 recv
系统调用
数据包准备好
数
据
准
将数据从内核
备
拷贝到用户空间
好
处理数据包 拷贝完成
非阻塞 IO (No Blocking IO)
应用程序
内核
应用程序
内核 多路复用器
1 channel: 介于字节缓冲区和套接字之间,可以同时读写,支持异步 IO
3 selector: 多路复用器,监听服务端和客户端的管道上注册的事件
Select模型/Poll模型
已连接 Socket1
接收队列 就绪队列
file[0] 发送队列
线程 1
等待队列
file[1]
已连接 Socket2 把每一
个
file[2] 接收队列 socket
发送队列 send() 上的等
... 待队列
等待队列 线程引用
file[100 中线程
] 移除,
已连接 Socket3 调用 select.select() 方法
后 , 每一个 socket 的等
并放入
... 接收队列 待队列都会放线程的引用 就绪队
列
发送队列
等待队列
遍历文件列表准备就绪的 socket
epoll 模型 Selector.open()
1.epoll_create()
线程
selector.select() 3.epoll_wait
file[0] socket
等待列表 eventpoll
file[1] (ep_fd)
2.epoll_ctl(op_accept) 唤醒等待队列中的线程
等待队列
file[2]
epitem rbr
...
rdlist 就绪列表 epitem epitem
file[100
socket epitem epitem
] 等待列表 ...
... (ep_fd)
4.socket 收到数据触发 callback 回调函数
epoll 模型优点
2 IO 效率不随 FD 数目增加而线性下降
同步与异步、阻塞与非阻塞
应用程序 内核 应用程序 内核
发起请求 发起请求
多次询问
问询后已完成 主动通知
返回数据 返回数据
同步调用 异步调用
同步与异步
1 同步:请求发起方对消息结果的获取是主动的
2 异步:请求发起方对消息结果的获取是被动通知的
应用程序 内核 应用程序 内核
发起请求 发起请求
立即返回
被
挂
起
返回数据
阻塞 非阻塞
4 异步 IO
异步 IO
应用程序 内核
系统调用
aio_read 数据包没准备好
等待数据
进
程
继
续 数据包准备好
执
行
将数据从内核
拷贝到用户空间
递交 aio_read 中指定信号
处理数据包 拷贝完成