八、并发与I/O
约 533 字大约 2 分钟
2026-05-11
c++中自旋锁与互斥锁的性能对比及适用场景
自旋锁(Spinlock)通过忙等待实现同步,在用户态循环检查锁状态,适用于锁持有时间短的场景。
互斥锁(Mutex)通过系统调用实现阻塞,线程会进入睡眠状态,适用于锁持有时间较长的场景。
自旋锁避免上下文切换开销但浪费CPU周期,互斥锁节省CPU资源但引入切换开销。
select,poll和epoll
select、poll和epoll都是Linux系统中用于I/O多路复用的机制,允许单个线程监视多个文件描述符的就绪状态。
select是最早的实现,有文件描述符数量限制;
poll改进了select的局限性,但性能在大规模连接时仍不理想;
epoll是Linux特有的高性能实现,使用事件驱动模型,适合处理大量并发连接。
1.select: 最早出现的I/O多路复用机制
使用位图(fd_set)表示文件描述符集合
默认限制为1024个文件描述符(FD_SETSIZE)
每次调用需要重新设置监控集合
采用轮询方式检查就绪状态,时间复杂度O(n)
2.poll: 改进select的文件描述符数量限制
使用pollfd结构数组代替位图
没有最大文件描述符数量的硬性限制
仍然需要遍历所有描述符检查就绪状态
每次调用需要复制整个描述符数组到内核
3.epoll: Linux特有的高性能I/O多路复用机制
使用事件驱动模型,无需轮询
支持边缘触发(ET)和水平触发(LT)模式
使用红黑树存储监控的描述符,高效管理大量连接
就绪列表直接返回已就绪的描述符,时间复杂度O(1)
使用mmap加速内核与用户空间的数据交换
