• 并发通信(网络进程线程)


    如果为每个客户端创建一个进程(或线程),因为linux系统文件标识符最多1024位,是有限的。

    所以使用IO复用技术,提高并发程度。

    阻塞与非阻塞(并发)

    阻塞式复用

    非阻塞复用·

    信号驱动IO

    在属主进程(线程中声明)

    所谓信号驱动,就是信号处理函数signal触发后执行回调函数

    即在IO输入后触发,可查看signal函数参数

    但是不能同时处理多个,所以引入select

    select

    对timeout的调用

    结构体成员为秒与微秒

    为了配合select函数执行,有如下宏函数:
            void  FD_CLR(int fd, fd_set *set);
            功能:将指定的set集合中编号为fd的描述符号删除。

            int   FD_ISSET(int fd, fd_set *set);
            功能:判断值为fd的描述符是否在set集合中,
                  如果在则返回真,否则返回假。

            void  FD_SET(int fd, fd_set *set);
            功能:将指定的fd描述符,添加到set集合中。

            void  FD_ZERO(fd_set *set);
            功能:将指定的set集合中所有描述符删除。
    示例

    接收到信号后,需要对select函数的第一个参数及后面的参数进行更新

    最终选择--epoll

    1.epoll_create

    功能说明 :创建一个 epoll 对象,返回该对象的描述符,注意要使用 close 关闭该描述符。

    参数说明 :从 Linux 内核 2.6.8 版本起,size 这个参数就被忽略了,只要求 size 大于 0 即可。

    2.epoll_ctl

    功能说明 :操作控制 epoll 对象,主要涉及 epoll 红黑树上节点的一些操作,比如添加节点,删除节点,修改节点事件。

    参数说明

    epfd:通过 epoll_create 创建的 epoll 对象句柄。

    op:对红黑树的操作,添加节点、删除节点、修改节点监听的事件,分别对应 EPOLL_CTL_ADD,EPOLL_CTL_DEL,EPOLL_CTL_MOD。

    添加事件:相当于往红黑树添加一个节点,每个客户端连接服务器后会有一个通讯套接字,每个连接的通讯套接字都不重复,所以这个通讯套接字就是红黑树的 key。

    修改事件:把红黑树上监听的 socket 对应的监听事件做修改。

    删除事件:相当于取消监听 socket 的事件。

    fd:需要添加监听的 socket 描述符,可以是监听套接字,也可以是与客户端通讯的通讯套接字。

    event:事件信息。

    封装成函数

    3.epoll_wait

    参数说明

    epid:epoll_create 返回的 epoll 对象描述符。

    events:存放就绪的事件集合,这个是传出参数

    maxevents:代表可以存放的事件个数,也就是 events 数组的大小。

    timeout:阻塞等待的时间长短,以毫秒为单位,如果传入 -1 代表阻塞等待

    示例

    水平触发与边沿触发(ET+非阻塞)

    默认是水平触发

    设置边沿触发(条件:非阻塞模式下)

  • 相关阅读:
    Windows net start mysql 启动MySQL服务报错 发生系统错误 5 解决方法
    netty系列之:kequeue传输协议详解
    【Nacos无压力源码领读】(二) 集成 LoadBalancer 与 OpenFeign
    英伟达显卡【NVIDIA GeForece RTX3060 laptop GPU】装深度学习环境,学习框架为Pytorch
    【mujoco】Ubuntu20.04配置mujoco210
    SRP:单一职责原则
    交通物流模型 | 基于自监督学习的交通流预测模型
    阿里低代码Low Code Engine快速上手
    分布式+微服务系统架构
    Jenkins+SonarQube代码审查
  • 原文地址:https://blog.csdn.net/m0_59188236/article/details/136629433