IO模型
2023-03-25 13:12:29 0 举报
IO的模型的发展历程,从阻塞,到非阻塞,到netty,多路复用,零拷贝
作者其他创作
大纲/内容
clone
四元组ip:port+ip:port是唯一的,必须四个一样
read(fd)
mmap解决读的问题sendfile零拷贝:应用只需要定义命令,到内核,内核从磁盘读取文件,直接写出数据到socket,减少文件从核到程序再到内核的过程。
epoll wait
service
kernel
多路复用技术
client 2
阻塞调用
fd4fd5
状态1、新2、等待付款、付款隔离
8080fd3
fd5
IPB
appserver
磁盘文件segement
kafkaJVM
IPA:80
app
epoll create ==fd5
nio优势:规避多线程问题C10K弊端:假设1w个连接,只有一个发送数据每循环一次,必须想内核发生1w次系统调用,很多次调用是无意义的。(用户空间向内核空间的循环遍历,复杂度在系统调用上)
tomcatjvmwhile(true)acceptread(fd4)read(fd5)
redis
IPB:01-IPA:80IPB:02-IPA:80
mq
c1
read(fd4)
kernelNONBLOCK内核
中断DMA
fd4
65535l连接
socketbindlisten8080fd3
人客户用户体验度
tomcat
IPC
套接字插座
多路复用selectpoll
epoll
待付款、付款
client 1
1000 fd循环一次,调用1成select,把1000个文件描述符作为参数传给kernel内核中队1000fd进行状态判断,消耗是小于1000次fd调用返回到达数据的fd数量程序再次读取返回的fd数量
c2
mmap
socket
65535
kernelfd8
新用户秒杀
硬件、资源
中断
多线程模型bio因为阻塞,只能用多线程
IPA:90
磁盘
bio优势:可以接收很多的连接问题:线程内存浪费cpu调度消耗根源:blocking阻塞:acp,revc
直接内存映射mmap
sendfile
多路复用、select、poll优势:通过一次系统调用,把fds都传给内核,内核进行遍历,这种遍历减少了系统调用弊端:1、重复传fd,方案:内核开辟空间保留fd2、每次select、poll都要重新遍历全量fd(中断、callback、增强)
server
服务端消耗端一个口:80
非阻塞。500 child fd500 read1个客户端的数据到达read调用太多,浪费资源
fd5fd3<acceptfd4 < readfd5 < read
动态Nginx接入层
epoll事件驱动多路复用每一个id的生命周期,只需要通过epoll_ctl每循环调用epoll wait想给你返回的不是内核对于fds的遍历结果,因为内核是事件机制,那些到达的数据fd被动放到另一个空间所以epoll wait只需要取回可用的fd就可以了
订单付款
应用程序app,正常访问数据到内核(从用户态到内核态),内核到磁盘方访问数据。磁盘的数据读到内核,内核的数据拷贝到应用程序。
新增线程去调用
db
socket客户端
问题:1、每次循环都需要传递fds2、内核变量fds是主动遍历,比较慢
read
consumer
动静分离
accept(fd3)
producer
0 条评论
回复 删除
下一页