Java|从操作系统层面分析 Java IO 演进之路( 七 )


epoll_wait(5unfinished ... 2 请求连接
**22704(BOSS 线程(Proactor))处理连接**epoll_wait(5[{EPOLLIN {u32=9 u64=4294967305
512 -1) = 1accept(8 {sa_family=AF_INET6 sin6_port=htons(55320) inet_pton(AF_INET6 \"::ffff:36.24.32.140\"sin6_addr) sin6_flowinfo=0 sin6_scope_id=0 [28
) = 9clone(child_stack=0x7ff35c99ffb0 flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID parent_tidptr=0x7ff35c9a09d0 tls=0x7ff35c9a0700 child_tidptr=0x7ff35c9a09d0) = 26241epoll_wait(5unfinished ... 26241
#将client 连接的FD加入到BOSS的epoll中 , 以便BOSS线程监听网络事件epoll_ctl(5 EPOLL_CTL_MOD 9 {EPOLLIN|EPOLLONESHOT {u32=9 u64=4398046511113) = -1 ENOENT (No such file or directory)epoll_ctl(5 EPOLL_CTL_ADD 9 {EPOLLIN|EPOLLONESHOT {u32=9 u64=4398046511113) = 0accept(8 0x7ff3440008c0 0x7ff35c99f4d0) = -1 EAGAIN (Resource temporarily unavailable)epoll_ctl(5 EPOLL_CTL_MOD 8 {EPOLLIN|EPOLLONESHOT {u32=8 u64=8) = 0 3 客户端发送数据
22704(BOSS 线程(Proactor))处理连接
epoll_wait(5[{EPOLLIN {u32=9 u64=4294967305
512 -1) = 1##数据读出read(9 \"daojian111\\r\\" 1024) = 12##数据处理交给其他线程 , 这里由于线程池为空 , 需要先clone线程clone(child_stack=0x7ff35c99ffb0 flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID parent_tidptr=0x7ff35c9a09d0 tls=0x7ff35c9a0700 child_tidptr=0x7ff35c9a09d0) = 26532 复制线程处理 , 线程号26532
write(1 \"pool-1-thread-2-10received : dao\"... 41) = 41write(1 \"\\" 1)accept(8 0x7f11c400b5f0 0x7f11f42fd4d0) = -1 EAGAIN (Resource temporarily unavailable)epoll_ctl(5 EPOLL_CTL_MOD 8 {EPOLLIN|EPOLLONESHOT {u32=8 u64=8) = 0 4 总结
从系统调用角度 , Java的AIO事实上是以多路复用(Linux上为epoll)等同步IO为基础 , 自行实现了异步事件分发 。 BOSS Thread负责处理连接 , 并分发事件 。 WORKER Thread只负责从BOSS接收的事件执行 , 不负责任何网络事件监听 。
5 优缺点
优点
相比于前面的BIO、NIO , AIO已经封装好了任务调度 , 使用时只需关心任务处理 。
缺点
事件处理完全由Thread Pool完成 , 对于同一个channel的多个事件可能会出现并发问题 。 相比netty , buffer API不友好容易出错;编解码工作复杂 。 相关链接https://man7.org/linux/man-pages/man2/poll.2.htmlhttps://man7.org/linux/man-pages/man2/recvfrom.2.htmlhttps://man7.org/linux/man-pages/man2/epoll_create.2.htmlhttps://man7.org/linux/man-pages/man2/epoll_ctl.2.html
作者 | 道坚
原文链接:https://developer.aliyun.com/article/784933?utm_content=g_1000280864
【Java|从操作系统层面分析 Java IO 演进之路】本文为阿里云原创内容 , 未经允许不得转载 。