IO多路复用学习笔记(select和poll)

视频链接:https://www.bilibili.com/video/BV1fg411376j?p=1&vd_source=fa4ef8f26ae084f9b5f70a5f87e9e41b

IO多路复用

在这里插入图片描述

在我们进行套接字通信时,会由一系列的阻塞函数如:read,write,accept等,这些函数都会监听各自的读写缓冲区,当自己的缓冲区为空时程序就会被阻塞。因此在只有一个进程/线程的情况下无法进行并发

想要实现服务端的并发一般可以使用多进程或者多线程来实现,但是在服务端的进程和线程只有一个的时候,要实现服务端的并发就可以使用IO多路复用技术。IO多路复用技术使得这些读写缓冲区不需要程序员来维护,OS的内核会承担这些功能,内核会同时检测这些文件描述符的读写缓冲区和剩余的空间大小。但是处理新连接或者这些文件描述的读写事件是按照到达顺序顺序执行的

与IO多路复用有关的函数有三个select,poll,epoll,其中poll和epoll都是只能在Linux环境下使用的,select是跨平台的,无论在哪个系统下都可以使用
select和poll底层是由线性表实现的,epoll是由红黑树实现的,所以epoll的效率更高

select函数

select对文件描述符的检测上限为1024,每个程序对应的文件描述符表只有1024个,且序号为0-1023
监听的文件描述符只有一个,但是连接的文件的描述符有n个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:

  1. 第一个参数监听的集合在后续三个参数里,比如需要监听的读缓冲区r有3个,写缓冲区w有4个,需要检测的异常缓冲区e有5个,那么第一个参数就填6(max(3,4,5) + 1),如果不清楚有多少个文件描述符,可以直接填1024,因为select对文件描述符检测上限就是1024
  2. 第2、3、4个参数分别代表需要检测缓存区集合的地址,分别是读缓冲区,写缓冲区和异常检测缓冲区(这些缓冲区可以被同时检测),同时这也是个传入传出参数(函数调用结束后原本传入的地址里面的内容会发生变化),比如:我需要检测的读缓冲区的是5,6,7,8号,内核检测后发现第5,6号缓冲区有数据,那么第二个参数会传出5,6号缓冲区,其余缓冲区同理
  3. 根据上述的传出参数,我们可以拿到可以进行操作的缓冲区,然后我们就可以判断这个缓冲区的功能是什么从而来写出对应的逻辑,如果这个缓冲区用于监听,那就调用accept,用于通信就read/recv
  4. 最后一个参数用于指定内核检测缓冲区的时长,时长为图中成员指定的值相加 秒 + 微秒,一般只需要使用秒,但是微秒必须初始化为0!!否则它会被系统安排一个随机数,这个随机数有可能会很大,这样会导致程序不如预期。可以将这个位置指定为null,表示select会一直检测fd_set直到出现了就绪状态的文件描述符
  5. fd_set占用了1024个标志位——对应文件描述符表最多只有1024,每个标志位占用1个比特,不难换算出,这个fd_set占用的内存大小为int [32]的内存大小(一个int型变量占用4个字节),但是实际上是按照一位一位来处理的 —— 实际上就是位图
  6. 内核在处理监听缓冲区时会将传进来的fd_set拷贝到内核里,内核会基于拷贝出来的进行线性检测,查看对应的套接字缓冲区是否满足使用的需要,满足条件的文件描述符就写回到fd_set(对应位置为1)
  7. 就绪文件描述符 -> 读缓冲区有数据,那么它对应的文件描述符就是就绪的,写缓冲区为为空,那么它对应的文件描述符就是就绪的,缓冲区有异常,那么它对应的文件描述符就是就绪的
    在这里插入图片描述

使用select处理服务器并发

处理流程和处理流程图
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码见视频

poll

使用比select更直观,参数也更少,但是只能在Linux下使用,效率又不如epoll且不能跨平台,所以一般不怎么用,只做简单介绍
在这里插入图片描述
在这里插入图片描述
poll和select使用IO多路复用的执行流程类似

select和poll的特点及其总结

在这里插入图片描述

相关推荐

  1. IO复用服务器——select模型poll模型

    2024-04-11 14:10:03       53 阅读
  2. IO复用技术、selectpoll、epoll联系与区别

    2024-04-11 14:10:03       29 阅读
  3. Netty复用机制selectpoll epoll的区别

    2024-04-11 14:10:03       53 阅读
  4. C#使用Poll/Select实现I/O复用

    2024-04-11 14:10:03       41 阅读

最近更新

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

    2024-04-11 14:10:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-11 14:10:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-11 14:10:03       87 阅读
  4. Python语言-面向对象

    2024-04-11 14:10:03       96 阅读

热门阅读

  1. neo4j-01

    neo4j-01

    2024-04-11 14:10:03      38 阅读
  2. 【Ubuntu】在 Windows 和 Ubuntu 之间传输文件

    2024-04-11 14:10:03       36 阅读
  3. 简单几步启用Ubuntu root用户密码登录

    2024-04-11 14:10:03       32 阅读
  4. Gopher协议

    2024-04-11 14:10:03       40 阅读
  5. VUE的相关知识锦集

    2024-04-11 14:10:03       39 阅读
  6. redis

    redis

    2024-04-11 14:10:03      31 阅读
  7. 设计模式(016)行为型之命令模式

    2024-04-11 14:10:03       30 阅读
  8. 记一次golang交叉编译的问题

    2024-04-11 14:10:03       36 阅读
  9. speech to text 库FastASR交叉编译arm target的配置

    2024-04-11 14:10:03       34 阅读
  10. MXNet详细介绍,MXNet是什么

    2024-04-11 14:10:03       34 阅读
  11. UVA839 Not so Mobile 天平 解题报告

    2024-04-11 14:10:03       28 阅读
  12. 服务器被入侵后该做些什么

    2024-04-11 14:10:03       36 阅读
  13. 动手学习深度学习(李沐)

    2024-04-11 14:10:03       28 阅读