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

本文介绍了Linux系统中为解决客户端并发问题,如何通过IO复用技术(如阻塞/非阻塞I/O和信号驱动IO),重点讲解了select函数和epoll机制,包括epoll_create、epoll_ctl和epoll_wait的使用,以及水平触发和边沿触发的区别。
摘要由CSDN通过智能技术生成

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

默认是水平触发

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

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值