Skip to main content

Command Palette

Search for a command to run...

多路io转接服务器

Updated
1 min read

模型概述

select函数

其中 readfds,writefds,exceptfds都是传入传出参数,即我们传入这些值,然后select函数会给我们传出值 timeout:定时阻塞监控时间,3种情况 1、NULL 永远等下去 2、设置timeval 等待固定时间 3、设置 timeval里时间均为0 ,检查描述字后立即返回,轮询

优缺点

缺点:监听上线收文件描述符限制,最大1024 检测满足条件的fd,自己添加业务逻辑提高小,提高了编码难度

优点:跨平台监听 ​

端口复用函数:为了解决多个应用想要共同使用一个端口的情况

int opt=1;

setsockopt(lfd,SOL_SOCKET,SO_REFUSEADDR,.......)

PoLL函数原型分析

优点:自带数组结构。可以将 监听事件集合 和 返回事件集合 分离 扩展监听上线 超出1024限制

缺点: 不能跨平台。Linux 无法直接定位满足监听事件的文件描述符,编码难度较大

突破1024文件描述符限制

cat /proc/sys/fs/file-max ------>当前计算机所能打开的最大文件个数。受硬件限制

ulimit -a -------->当前用户进程下,默认打开文件描述付个数 默认值1024

修改:sudo vi /etc/security/limits.conf

soft nofile 65536 ------>设置默认值

hard nofile 1000000 -------->命令修改上限

epoll函数:epoll_create创造的epfd句柄是一个文件描述符,在使用完之后应该进行关闭操作,否则可能导致fd被消耗殆尽

  • epoll是LInux下多路复用IO记峨口select/poll的增强版本,他能显著提高程序在大量并发程序中只有少量活跃的情况下CPU的利用率

  • epoll_create

    • size:创建的红黑树的监听节点数量。

    • (供内核参考) 返回值:成功:指向新创建的红黑树的根节点的fd 失败 -1

  • epoll_ctl

Epoll事件模型有两种触发模式

  • 边沿触发ET:只有数据到来才触发,不管缓冲区是否还有数据 epoll的ET模式是一个高效模式,但是只支持非阻塞模式,因为如果还是阻塞模式读的话,摄像一种情况就是每次缓冲区中的数据服务端没有及时处理完上一次的数据,就会触发超时,因此这里就引出了 与非阻塞方式一起的一个模式,对于缓冲区的忙轮训,这样就不会引起客户端的超时重传----->忙轮训 【ET 模式下,内核只在状态变化时通知一次,你必须用非阻塞 IO,一次性处理完所有可用数据,直到返回 EAGAIN,否则可能漏事件。】

  • 水平触发LT:只要有数据都会触发------>默认模式

Epoll 优缺点

  • 优点:高效 能突破1024文件描述符限制

  • 缺点:不鞥跨平台 只支持LInux

Epoll反应堆模型:epoll ET模式+非阻塞+void ptr

More from this blog

Redis学习

1.什么是SSD HDD作为存储传统的数据库? SSD:固态硬盘---使用闪存芯片存储数据 无机械部件 特点:读写速度快(尤其是随机读写)、延迟低、抗震性好,但单位容量成本较高。 HDD:机械硬盘--传统机械硬盘 特点:容量大、成本低,但读写速度较慢(尤其是随机读写),延迟高。 2.什么是非易失性持久化 非易失性持久化 = 靠谱的硬件 (断电不丢数据的 SSD/PMEM) + 严谨的软件策略 (确

Mar 4, 20261 min read

分布式存储系统面试问题解析

共识算法剖析 raft共识算法 1.在你的 C++ 实现中,如果 Leader 发送 AppendEntries 给 Follower,但 Follower 的日志落后太多(比如中间缺了 100 条),Raft 论文建议是一个一个往前找(nextIndex--)。这种做法在高性能存储中显然是不可接受的,你会如何优化这个“回溯”过程? 在工程实现中,我会从两个维度优化日志冲突后的同步效率: 1. 快

Feb 9, 202613 min read

Unix环境编程:杂谈

动态加载 API 进程管理 什么是进程 进程的创建 进程的终止与遗言函数 进程资源回收 进程的映像更新 ps -o pid,ppid,pgrp,comm 这个linux命令是将当前终端上运行的进程打印出来 进程中使用环境变量 子进程环境变量改变 不会更改父进程的环境变量 进程间通信 有名管道不存储数据 其本身大小为 0 当一个进程写入数据进去时 如果没有进程读取数据那么该写进程就会堵塞在哪里 同理 如果读进程想要读取数据 但是却没有数据...

Jan 30, 20263 min read

Unix环境编程:第一章

1.1操作系统的介绍 1.2 计算机系统的分层 1.3 编译过程 ?上一个命令的运行结果 echo 就是输出上一个命令的运行结果 哎linux环境下文件中查找一个元素 即在命令模式下 输入/+你要查找的字符 即/printf 这样 然后找到之后 n表示查找下一条 shift+n表示上一条 file+文件名 查=查看文件是否可运行 1.4 多模块开发 变量的定义是为变量扩充作用域 而变量的声明需要为变量内存空间 gcc -c 文件 检验是否存在语法错误 nm 目标文...

Jan 30, 20261 min read

C++ Stl杂项

迭代器特性 输入流的容器特性 迭代器对算法的影响 仿函数和函数对象 分配器 对于平常的我们内存的使用,直接使用new delete 即可 使用分配器的话还需要记住自己当时申请了多少的内存 很不方便 哈希表深度探索 哈希容器 哈希表在扩充时,会先将自身大小乘以2 然后在选择自身2倍距离最近的一个质数 作为新的大小 哈希函数 以哈希表为底层支撑的适配器 红黑树 容器 list容器 forward_list 对于标准库,其本身提供一个sort排序函数,但某些容器也提供sort服务...

Jan 29, 20261 min read

xianyu-sheng

29 posts