sxd-io演进历程
2021-07-15 10:03:48 0 举报
linux网络模型的演进及0拷贝
作者其他创作
大纲/内容
存储 用户态和内核态资源的存储位置的映射
ctl add del mod
kernel (内核)
select
单线程,死循环读取文件,如果没有直接告诉没有,如果有,进入读取文件及返回文件,然后在继续处理后续的请求
文件流向==2次拷贝
client
read fd1read fd2read fd3
read
从内核拷贝到用户态
kernel
用户内存
JVM调用 c语言写的
进程/线程
fd2
fd1
在拷贝会内核
epoll
1
fd3
client
epoll_create
read fd1
内核态存储空间
sendfile
增加系统调用,由内核监听
现在只有3个请求,如果有1000个请求,代表用户进程会调用1000次kernel成本问题,调用一次消耗很大
用户和内核共享存储
网卡
3
0 拷贝- 少了一次用户到内核的拷贝
进程、线程
用户态
3获取节点
write fd
用户态内核态用户态掉内核态 ,参数传参。用户态和内核态掉数据隔离,只能拷贝fd相关文件拷贝来拷贝去
read fd2
拷贝到用户
redis:6380单进程、单线程、单实例
读取到内存
返回给用户
4 通知读数据
共享空间mmap
链表
read fd3
yum install man man-pages 安装插件,查看内核提供的方法。man ls
拷贝
2
内核内存
调用内核读取
红黑树
2 有数据
网络模型的演进
直接返回出去
返回给客户端
减少调用次数,从1000->1
read fd
NIO 同步非阻塞单线程跑,如果没有就直接返回没有,如果有在同步处理数据
用户态存储空间
文件
waite
1. 调用
多路复用 NIO 同步非阻塞单线程跑,如果没有就直接返回没有,如果有在同步处理数据
轮询发生在用户空间
同步阻塞读取文件,导致计算机资源难以重复利用,一直阻塞在那里,所以内核发生了变化
read fd1read fd2......read fd1000
插曲。BIO(同步阻塞)每一个客户端进来请求读取文件的时候,内核分配线程去读取文件。因为socket在进程读取文件但是未返回的时候,是blocking的.如果一直没有,就一直在那等着
客户端连接linux 一切连接皆文件
增加系统调用,由内核监听,知道有一个或多个有响应(Ready)
redis: 6379
kenel内核
linux
读数据
返回1000个,标示哪个可以调用了
linux 没有真正的aio(真正的异步)epoll 也只是使用了信号驱动+多路复用+ummap(用户态和内核态共用内存空间)
0 条评论
下一页