高并发(多路IO转接-扩展)

写tcp并发服务器的时候,并发的实现方式:

第一种: 阻塞等待
来了一个客户端就创建一个进程或线程去服务器,但是创建的线程或进程大多数时间都是处于休眠状态,所以这种并发的方式比较浪费资源

缺点: 浪费资源(内存)

第二种:非阻塞忙轮询
accept和read都不带阻塞,进程在不停的轮询,如果客户端没有发来消息,也没有新的客户端请求连接,这个时候程序在做无用功,浪费cpu的资源

第三种: 多路IO转接(多路IO复用)

epoll是多路IO转接技术的一种,可以解决select的缺点

epoll没有文件描述符的限制
epoll每次重新监听不需要将文件描述符从用户态拷贝至内核态
epoll返回的是已经变化的文件描述符,不需要在对这颗树遍历了
大量并发少了活跃效率高

epoll的工作流程3步:
1创建树
#include <sys/epoll.h>
int epoll_create(int size);
参数: size > 0即可(树上的 节点最大值,>0自动适配)
返回值: 树的句柄

2将lfd上树
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能: 操作树上的节点 -节点上树 节点下树 修改节点
参数:
epfd: 树的句柄
op:
EPOLL_CTL_ADD: 上树
EPOLL_CTL_DEL : 下树
EPOLL_CTL_MOD: 修改
fd: 修改的文件描述符
event: 节点的地址
返回值:成功返回0 失败返回-1

typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;

       struct epoll_event {
           uint32_t     events;      /* 读事件  EPOLLIN   写事件 EPOLLOUT */
           epoll_data_t data;        /* User data variable */
       };

3监听
#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
功能: 循环监听树上的节点变化
参数:
epfd: 树的句柄
events: struct epoll_event数组的首元素地址,数组用来接收epoll_wait返回的节点
maxevents:events指向数组的元素个数
timeout:
-1 永久等待
0 : 不等待

0 : 限时等待

返回值: 返回变化的文件描述符个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值