今天拜访了一下epoll

wuchangjian2021-10-26 06:51:12编程学习

系列文章:【Netty】知识脉络

前言 

        常听大神们提起epoll,这到底是个啥?我怎么能和epoll认识一下呢?登门拜访一下,一回生二回熟嘛。可是他家门在哪...?


epoll家门在哪?

收集一下线索

  1. epoll是Linux系统的系统调用函数。
  2. nginx、redis、netty等都用到了epoll。

总结线索 & 行动计划

  • 在linux系统上启动redis程序诱导epoll出现

    • 下载安装配置redis。(本文采用redis 5.x版本)

  • epoll出现后尾随跟踪进门

    • 使用linux命令将程序产生的系统调用收集进文件【epoll家】

  • 采访epoll

    • 解读epoll


具体行动记录

行动准备工作

创建【秘密基地】准备收集信息

[root@mini /]# mkdir -p /usr/local/redis/whereisepoll
[root@mini /]# cd /usr/local/redis/whereisepoll
[root@mini whereisepoll]# 

 

开始行动

Step 1 :  收集线索!

[root@mini whereisepoll]# strace -ff -o ./redistellme /usr/local/redis5/src/redis-server /usr/local/redis5/redis.conf 

命令解释:

strace : 抓取系统调用

-ff :所有线程

-o :输出到

./redistellme : 输出到当前目录下redistellme文件中

/usr/local/redis5/src/redis-server /usr/local/redis5/redis.conf : 指定配置文件启动redis 

收集到了什么?

🧐-是否启动成功?

[root@mini ~]# ps -ef | grep redis

         ✅进程号是:92341 


 🧐-再看看redis进程运行信息

[root@mini /]# cd /proc/92341/fd

命令解释:

看看进程运行情况,fd目录为文件描述符目录 

         ✅看到eventpoll【文件描述符fd=5】:该不会是epoll的大名吧!

         ✅看到socket【文件描述符fd=6,fd=7】

         ✅pipe是什么?别问,问就是不知道!


 😍-秘密基地很多文件:

[root@mini ~]# cd /usr/local/redis/whereisepoll/

        ✅等下重点看主进程 92341 结尾的这个文件


 ❗️【epoll家门牌号:redistellme.92341】❗️敲门!


[root@mini whereisepoll]# vi redistellme.92341

  获取重点信息——破获epoll窝点准备拜访

  ❗️ 25行 epoll_create (1024) = 5

  ❗️ 33行 socket (..) = 7

  ❗️ 35行 bind 7.... port (6379) ... )

  ❗️ 36行 listen 7....port (6379)... )

  ❗️ 40行 epoll_ctl EPOLL_CTL_ADD , 7 ,{...} ) = 0

  ❗️ 87行 epoll_wait [ ] , 10128 , 0 ) = 0 

综上:顾名思义:epoll_create创建了重要东西,epoll_ctl把socket(自带功能绑定监听)加进那个重要东西里,然后epoll_wait就等着那个重要东西收到数据。所以那个重要的东西是什么呢?


epoll是什么?

[root@mini ~]# man epoll

名字
       epoll - I/O事件通知工具

描述
        epoll API 监视多个文件描述符,以查看其中是否有I/O可能。epoll API可以被用触发的接口,可以很好地扩展到大量被监视的文件描述符。以下是创建和管理epoll实例的系统调用:

        * epoll_create()  创建一个epoll实例,并返回一个指向该实例的文件描述符。

        * epoll_ctl()        注册特定的文件描述符。称为epoll集

        * epoll_wait()      等待I/O事件,如果当前没有可用的事件,则阻塞调用线程。

综上:epoll_create创建了epoll实例,epoll_ctl把socket(自带功能绑定监听)加进epoll集(里面或许有很多socket),然后epoll_wait就等着epoll集收到数据。

epoll_create是什么?

总结:

  1. 最初的epoll_create()函数是这样 int epoll_create(int size);
    1. size参数通知内核文件描述符的数量
      1. 使用的内核初始空间的大小。
  2. 如今内核会动态地调整所需的大小函数是这样
    int epoll_create1(int flags);
  3. epoll_create()实际是开辟了一块内存空间

epoll_wait是什么? 

总结

  1. epoll_wait()等待epoll()实例上的事件。
  2. 指向缓冲区。
  3. 缓冲区里存的是就绪列表中信息。
  4. 就绪列表中信息是可用的事件的文件描述符信息。
     epoll_wait实际是关注着一个缓冲区,里面有事件就干活!

行动后总结

 第一次拜访epoll

我大概了解到epoll是这样工作

  • epoll_create  负责开辟空间
  • epoll_ctl_      负责把A、B...N事件放进空间
    • A、B...N事件哪个有动静,就会进入缓冲区
  • epoll_wait      负责监听处理缓冲区事件

epoll下次见!

相关文章

SpringCloud最新2021年面试题大汇总,附答案

SpringCloud最新2021年面试题大汇总,附答案

1、设计微服务的最佳实践是什么? 以下是设计微服务的最佳实践࿱...

Spring Cloud简述及简单入门实例

1 概述 Spring Cloud基于Spring Boot,提供了多个组...

15个问题自查你真的了解java编译优化吗?

摘要:为什么C++的编译速度会比java慢很多...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。