内核发展历程[BIO、NIO]
2020-06-07 20:17:30 2 举报
内核的发展历程
作者其他创作
大纲/内容
演进
client1
fd 8
线程/进程
fd 7
client2
read fd 9read fd 8read fd 7
kernel
epoll
Redis:6380
fd 9
mmap
零拷贝内核缓冲区处理
轮询发生在用户空间
ctl add del sfdwait()
线程或者进程[用户空间]
epoll多路复用
fd3
file
read fd 9
Redis模型
通常文件拷贝
网卡
网卡
client3
file.txt
select(1000fds)
read fd 8
Kafaka模型
Redis:6379
sendfile
同步非阻塞NIO[多路复用]1、客户端通过socket链接,NonBlock2、批量查询文件描述符select(fds)3、场景:模拟一个线程轮询,每次从内核中一次拿到n个fds,再去遍历读fd文件信息|||4、轮询发生在用户空间问题:1、用户态和内核态之前的数据不能相互访问,文件会被来回拷贝
JVM
fd8
write(fd4)
消费者
链表
内核演进过程
Linux物理主机
kafkaJVM
共享空间
read(fd)
同步非阻塞NIO[多路复用]1、客户端通过socket链接,NonBlock2、内核和用户空间有一个共享空间3、内核维护文件地址和用户态文件地址进行映射4、链接存储数据5、数据到了,再去read(),同步阻塞
fd4
select(fds)
Redis:6381
红黑树
阻塞I/O 【BIO】1、客户端通过socket链接,这个时期socket是阻塞的2、通过文件描述符3、一个线程读取一个文件描述符,有数据就读取,没有数据就等待造成有很多线程在等待读取数据,资源浪费4、发生在用户空间问题:1、一个线程或者进程读取一个fd,如果fd没有数据,就会造成线程资源的浪费;如果1000fd,线程的调度也会消耗很大
create epfd
read(fd3)
同步非阻塞NIO1、客户端通过socket链接,NonBlock2、通过文件描述符3、场景:模拟一个线程不停的循环,如果线程没有数据,就遍历下一个fd,如果就数据,就开始处理数据,处理完成,就去读取下一个fd4、一个线程既做了遍历循环,去除数据和处理数据->同步非阻塞5、轮询发生在用户空间问题:1、 如果有1000fd,代表用户进程轮询调用1000次kernel,成本很高
0 条评论
下一页