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 分钟前
Study-Oracle-11-ORALCE19C-ADG集群搭建
数据库·oracle
望森FPGA16 分钟前
HDLBits中文版,标准参考答案 |2.5 More Verilog Features | 更多Verilog 要点
学习·fpga开发
kissSimple16 分钟前
UE行为树编辑器图文笔记
笔记·ue5·编辑器·unreal engine·unreal engine 5
l1x1n026 分钟前
DOS 命令学习笔记
笔记·学习·web安全
winds~1 小时前
自动驾驶-问题笔记-待解决
人工智能·笔记·自动驾驶
青云交1 小时前
大数据新视界 --大数据大厂之 Kafka 性能优化的进阶之道:应对海量数据的高效传输
大数据·数据库·人工智能·性能优化·kafka·数据压缩·分区策略·磁盘 i/o
Sarapines Programmer1 小时前
【Sqlite】sqlite内部函数sqlite3_value_text特性
数据库·sqlite·数据转换·科学计数法
道爷我悟了1 小时前
Vue入门-指令学习-v-on
javascript·vue.js·学习
打码人的日常分享1 小时前
企业人力资源管理,人事档案管理,绩效考核,五险一金,招聘培训,薪酬管理一体化管理系统(源码)
java·数据库·python·需求分析·规格说明书
好好学习的人1 小时前
SQL第12课——联结表
数据库·sql