Linux网络编程day6 下午去健身
epoll优缺点
显著提高程序在大量并发连接中只有少量活跃的情况下系统cpu利用率。
epoll事件模型
ET模式
边沿触发
缓冲区剩余未读尽的数据不会导致epoll_wait返回。必须有新一次的事件满足才会触发。
struct epoll_event ep;
ep.events = EPOLLIN | EPOLLET
修改cfd为非阻塞读
flag = fcntl(cfd , F_GETFL);
flag |= O_NONBLOCK;
fcntl(cfd , F_SETFL , flag)
结论:epoll的ET模式是一个高效模式,但是只支持非阻塞模式忙轮询。所以需要下面操作。之后使用的都是这种模式的。
struct epoll_event ep;
ep.events = EPOLLIN | EPOLLET;
ep.data.fd = cfd;int flag = fcntl(cfd , F_GETFL);
flag |= O_NONBLOCK;
fcntl(cfd , F_SETFL , flag);
LT模式
水平触发--->默认采用模式
缓冲区剩余未读尽的数据会导致epoll_wait返回。
epoll的优缺点
优点:高效。突破1024文件描述符。
缺点:不能跨平台,只支持Linux。
epoll反应堆模型
epoll ET模式+非阻塞、轮询+void* ptr。不但要监听cfd的读事件,还要监听cfd的写事件。
原始:socket---bind---listen---while(1)---epoll_create创建红黑树---返回epfd---epoll_ctl()向树上添加一个监听fd---while(1)---epoll_wait监听---对应监听fd有事件产生---返回监听数组---lfd满足---accept---cfd满足---read---小->大---wirte回去
反应堆:socket---bind---listen---while(1)---epoll_create创建红黑树---返回epfd---epoll_ctl()向树上添加一个监听fd---while(1)---epoll_wait()监听---对应监听fd有事件产生---返回监听数组---lfd满足---accept---cfd满足---read()---小->大---cfd从监听红黑树上摘下---epoll_ctl监听cfd写事件---EPOLLOUT --回调函数---epoll_ctl(EPOLL_CTL_ADD)重新放到红黑树上监听写事件--等待epoll_wait返回---说明cfd可写---wirte回去---cfd从监听红黑树上摘下---epoll_ctl监听cfd读事件---epoll_ctl(EPOLL_CTL_ADD)重新放到红黑树上监听读事件---epoll_wait监听
网络编程中 read() -- recv() write() -- send();
eventset函数():
设置回调函数。lfd-->acceptconn()cfd-->recvdata()cfd-->senddata()eventadd函数():
将一个fd,添加到监听红黑树。设置监听read事件,还是监听写事件。
生成tags文件
ctags ./* -R
可以用ctrl+]跳转到函数定义
ctrl+t返回到此前跳转位置
ctrl+o在屏幕左边列出文件列表 再次按消失
ctrl+F4右边列出函数列表