epoll原理

yum install man man-pages //安装man帮助程序 man帮助页

man 一共有八类文档
man ls //是一类文档
man 2 read //系统调用是二类文档 比如read
man 2 socket //系统调用
man 2 select //系统调用
//0 是标准输入 1是标准输出 2是错误输出

任何命令在操作系统中均有文件描述符
在这里插入图片描述

man 2 socket //看到 可以SOCK_NONBLOCK

1.BIO socket是阻塞的

man 2 socket //系统调用
一个连接就是一个文件描述符,一个文件描述符就是一个fd;
有数据则处理 没有则等待 无法执行下面内容,只能抛出更多线程。
cpu没有一直处理数据。
在这里插入图片描述

2.同步非阻塞
内核发生了变化,一个线程即可,循环问每个文件描述符是否有数据,有数据则处理,没有则问下一个文件描述符。
取数据 并处理是一个线程 则是同步的。
问题:

man 2 socket //系统调用
在这里插入图片描述

3.多路复用
select出现 减少用户态核心态线程切换

man 2 select //查看select用法

缺点:fds 文件描述 拷贝成为累赘
在这里插入图片描述
4.共享空间
通过系统调用mmap来实现
减少I/O和内核沟通

man 2 mmap

进程通过epoll将文件描述符放到共享空间

man epoll
用户进程放文件描述符到共享空间的红黑树,内核去红黑树中获取,将一些到达的数据放到链表。用户进行从链表取进而执行。

在这里插入图片描述
上面功能是共享空间实现的,不是零拷贝,零拷贝如下:

man 2 sendfile

内核中增加了系统调用sendfile()实现零拷贝
read write方式 涉及到数据的拷贝,
sendfile 方式,程序调用senfile,则不涉及拷贝直接从内核读取数据。

文件数据–>内核–>内核缓冲区–>用户空间–>网卡
内核读sendfile 直接发出去
在这里插入图片描述
sendfile()加mmp组建为kafka
kafka通过mmap看到内存空间,内核也能看到,减少触发内核,减少数据调用,减少系统拷贝。

在这里插入图片描述

在这里插入图片描述
nginx 多少个cpu启动多少个进程worker ,一个进程worker使用kernel的epoll,同步非阻塞多路复用。
linux没有AIO
windows有AIO

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值