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


    如果为每个客户端创建一个进程(或线程),因为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+非阻塞)

    默认是水平触发

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

  • 相关阅读:
    RabbitMQ高级特性
    用Qt自制一个小闹钟
    竞赛 深度学习猫狗分类 - python opencv cnn
    2024最新VMware Workstation Pro下载教程
    【算法】哈希学习笔记
    数字疗法009 | “接受”还是“拒绝”?心理治疗背后的数字干预
    C语言-调试文件
    android studio设置flutter和dart的sdk配置
    河南财经政法大学计算机考研资料汇总
    git分支管理以及不同git工作流对比
  • 原文地址:https://blog.csdn.net/m0_59188236/article/details/136629433