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 演进之路】本文为阿里云原创内容 , 未经允许不得转载 。
- 章子怡扎减龄丸子头,短裙露美腿不像生过娃,从影20年笑容依旧甜
- 三星|从“不想买”到“抢着买”,骁龙8+无线充电+IP68防水,下跌600元
- 男子带家传木盒来鉴宝,盒子从没打开过,专家:稳住,两个好消息
- 世界上最孤独的“手”,他握住一棵树长达50年,却从来没有松过手
- 互联互通|哪些无人机适合新手使用?从普宙O2到大疆Mini 3 Pro,一文读懂
- 路由器|WiFi信号增强从简到易,软硬兼施后效果明显
- 关于时间的12件事,比如为什么从三月份起要把你的钟表拨快些?
- Java|干翻小米,红米又出超大杯旗舰,120W+2K直屏+双旗舰芯
- 百度地图|Java程序员应知应会之Maven和Gradle的区别
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
