[计算机网络] I/O多路复用(Epoll)

Socket模型

网络层使用的是 IPv4 或 IPv6

        IPv4 地址由 32 位组成,如 192.168.1.1

                socket设置 AF_INET

        IPv6 地址由 128 位组成,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334

                socket设置 AF_INET6

一台机器是可以有多个网卡的,每个网卡都有对应的 IP 地址

监听的socket(客户端进行连接) 和已连接的socket(与客户端进行交互)

为了实现一对多的效果,一个服务器对多个客户端,进行I/O复用

原始策略1:多进程,进行fork创建子进程

        父进程关心监听socket,子进程关心已连接socket

        父进程需要进行wait,避免子进程变成僵尸进程

原始策略2:多线程,可以通过线程池

        但是当连接数增加以后,操作系统扛不住

I/O多路复用

多个请求复用了一个进程(一个 CPU 并发多个进程)

进程通过系统调用函数从内核获取多个事件

select需要通过遍历文件描述符,以及并发数增加以后,性能损耗指数增加

        内核态和用户态的拷贝

Epoll模型会监听文件描述符

事件驱动,有事件发生会调用回调函数进行事件处理

无需轮训遍历获取发生事件的文件描述符;效率不会随着并发数量而下降

边缘触发ET:当被监控的 Socket 描述符上有可读事件发生时,服务器端只会从 epoll_wait 中苏醒一次,因此我们程序要保证一次性将内核缓冲区的数据读取完

        只会在文件描述符发生状态变化的时候通知一次,不会再次通知

       会循环从文件描述符读写数据; 边缘触发模式一般和非阻塞 I/O 搭配使用

水平触发LT:被监控的 Socket 上有可读事件发生时,服务器端不断地从 epoll_wait 中苏醒,直到内核缓冲区数据被 read 函数读完才结束,目的是告诉我们有数据需要读取

        可读写状态下就会进行消息通知,到内核缓存区进行数据读取

        epoll 默认的触发模式是水平触发

        边缘触发的方式会比水平触发的效率高

相关推荐

  1. IO复用--epoll

    2024-04-07 10:28:06       45 阅读
  2. [计算机网络] I/O复用Epoll

    2024-04-07 10:28:06       31 阅读
  3. C++ socket epoll IO复用

    2024-04-07 10:28:06       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-07 10:28:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-07 10:28:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-07 10:28:06       82 阅读
  4. Python语言-面向对象

    2024-04-07 10:28:06       91 阅读

热门阅读

  1. Spring Boot实现Filter解决跨域问题

    2024-04-07 10:28:06       36 阅读
  2. FPGA和ARM学习那个比较好

    2024-04-07 10:28:06       33 阅读
  3. 【LeetCode热题100】【动态规划】杨辉三角

    2024-04-07 10:28:06       39 阅读
  4. python+ opencv(Mat)——笔记

    2024-04-07 10:28:06       33 阅读
  5. leetcode594-Longest Harmonious Subsequence

    2024-04-07 10:28:06       32 阅读
  6. redis bigKey问题

    2024-04-07 10:28:06       37 阅读