内核发展历程[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 条评论
 下一页
 ![内核发展历程[BIO、NIO]](https://www.processon.com/chart_image/template/thumb/5edfa828f346fb1ae55600c8.png?tid=5ed12103e0b34d5f263c8f65) 
   
   
   
   
  
  
  
  
  
  
  
  
 