Nio - Epoll
2020-07-28 10:18:11 1 举报
JVM和操作系统层面的Nio-Epoll底层原理,
作者其他创作
大纲/内容
1、程序使用硬件是通过的系统调用实现的。 系统调用通过软中断实现。(int 80 + 调用参数) 中断调用之后,从用户态切换到用户态。
返回文档
GDT全局描述表0-100:0101.....:3
qq
tomcatint 80
客户端1
客户端2
单独线程处理读请求
硬件中断,有IO读写数据
CONN THREAD1.放大 C10K本质:阻塞BIO
tomcat nginx accepter blocking!!web servernginx处理的是静态资源,没有数据加工的过程,tomcat有数据计算,当有共享资源的争抢,最后变成串行处理
并发数500(客户端)
JVM
QQ
T1recv(5 block
IO线程和工作线程是同一个线程IO/Worker线程池
kernel 人 程序 方法+硬件 5.x内核几百个系统调用
nginx只读取静态文件,不做数据加工,可以做到高性能的并行处理
晶振
连接
发送数据
IO Thread1
技术选型失败架构师:技术选型懂原理!
上电
网络侧:IO偏向内核BIO NIO 多路复用器
0~255/1字节0x80=128
IO/worker Thread
同步异步阻塞非阻塞
客户端
争抢资源
systemcall
0-10000.......
tomcat涉及共享资源的处理时会变成串行处理。
中断: 软中断int 0x80
redis单一工作线程的模型。
返回数据
NIONew IO
客户端3
响应中断
发送中断
时间中断
JDK层面:New IO
worker Thread 1redis 6.x 之后可以开启多IO线程。假如线程一多,有没有问题?取决于共享数据
操作系统层面:NonBlocking
数据放到内存中
IDT中断表128:回调
IO Thread 2
Worker线程池2并行数
其他程序处理
select 多路复用
内存空间(存储文件句柄状态)8#fd(epoll实例)3#fd accept9#fd recv
memory
静态文件
问题:1、select需要程序给内核复制fds:如果内核记录可以提升性能;2、内核需要轮询:做功, 受:如果计算机存在某种机制,到达通知。
客户端4
1、多路复用器select, poll,epoll只判定状态2、自己recv fd,读取数据 同步模型
CPU
读取数据
1、OS
Worker Thread 2进行计算
硬件中断
读取文件
IO线程池2并行数
DMA
select(fds)
NIO
kernel
共享数据(lock)
中断调用
NIONonBlocking
CPU 1
socket选项--nonblock
TOMCAT的线程模型
网卡
IO线程池10并行
3fd9fd
问题:1、放大: C10K FDS文件描述符过多每循环:rec O(n) 系统调用+时间复杂度,成本过高2、缩小:c10k 只有一个客户端发来数据性能损耗O(n-1)多条路复用了一次调用得到具体的到来情况
channelbufferselecter
Nginx的线程模型
保护模式
IO硬件
集群、加机器
Worker Thread1进行计算
硬盘
IO/Worker Thread
2、 IObio epoll
单机性能压榨
内存
FS(fileSystem)
1、多路复用器,只判定状态 ->[epoll]2、自己recv fd,读取数据 同步模型3,linux: IO上没有异步,windows io: iocp 异步IO读取到的数据,可以当前线程处理,同步处理;别线程处理,异步处理
JVM使用strace -ff 指令去追踪redis和nginx,即可看到他们是使用epoll的。
收藏
0 条评论
回复 删除
下一页