1、连接池
在这里插入图片描述
将每一个套接字和一块内存进行绑定,连接池就是一个结构体数组,通过链表来维护一个空闲连接。1、ngx_get_connection(int fd)从空闲链表取一个空闲连接,然后指向头的指针指向后面一个元素,然后将sock对应给到这个空闲连接中,然后返回这个结构体指针。2、ngx_epoll_add_event将监听套接字,添加到红黑树上,
3、ngx_epoll_process_events内容:
事件驱动:通过获取到的事件,调用适当的函数,让整个程序干活
2、epoll两种工作模式
2.1、LT模式
LT也叫水平触发,这种工作模式是,低速模式(效率差)--默认缺省用次模式,来一个事件,不处理的话,就会一直触发(也就是循环调epoll_wait的时候每次都会有这个事件),能保证不会丢失事件,因为内核会反复通知。
2.2、ET模式
ET边沿触发,这种工作模式是,高速模式(效率高),只能对非阻塞套接字用,来一个事件,内核只通知一次(不管是否处理,内核都不在通知你)只需要增加EPOLLET(epl_ev.events)
事件驱动框架
在这里插入图片描述
就是由一些事件源(三次握手内核通知,事件发生源就是客户端),通过事件收集器和事件分发器(调用函数处理)【事件收集器:epoll_wait()】【accept() read()都属于事件处理函数】,
3、后端开发面试题
问题:使用epoll模型,水平触发模式,当socket可写时,会不停的触发可写事件,怎么处理?1、需要向socket中写的时候才把socket加入红黑树中,等待可写事件,接受可写事件之后调用write()函数,写完之后,将socket移除红黑树。2、开始不把socket加入epoll,需要写数据的时候,直接调用write函数,如果返回EAGAIN把socket加入epoll中,全部数据写完移除epoll。
4、epoll验证
将套接字设置为非阻塞,然后将epoll_wait设置为阻塞,会阻塞在那里等有事件来才会往下走,如果是水平触发,要是没有处理就有一直触发
#include <unistd.h>
#include <sys/wait.h>
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/time.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <poll.h>
#include <sys/epoll.h>
#include <sys/ioctl.h>
#define OPEN_MAX 1024
void epollTest()
{
// 1、创建socket
int fd =socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
printf("socket err\n");
return;
}
// 设置TIME_WAIT状态导致bind失败
int reuseaddr =1;
if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(constvoid*)&reuseaddr,sizeof(reuseaddr))==-1)
{
printf("setsockopt err\n");
return;
}
// 设置为非阻塞
int nb=1;//0:清除,1:设置
if(ioctl(fd, FIONBIO,&nb)==-1)
{
printf("ioctl err\n");
return;
}
// bind listen
structsockaddr_in serv_addr;
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port =htons(9999);
serv_addr.sin_addr.s_addr =htonl(INADDR_ANY);
if(bind(fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
{
printf("bind err\n");
return;
}
listen(fd,128);
// 创建红黑树
int epoll_fd =epoll_create(OPEN_MAX);
if(epoll_fd ==-1)
{
printf("epoll_create err");
return;
}
// 添加到红黑树种
structepoll_event epl_ev;
epl_ev.events = EPOLLIN;
epl_ev.data.fd = fd;
if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,fd,&epl_ev)==-1)
{
printf("epoll_ctl err");
return;
}
// 等待事件
structepoll_event ep[OPEN_MAX];
while(true)
{
int nready =epoll_wait(epoll_fd,ep,OPEN_MAX,5000);
printf("nready:%d\n",nready);
for(int i=0;i<nready;i++)
{
if(!(ep[i].events & EPOLLIN))// 不是读事件
{
continue;
}
else
{
if(ep[i].data.fd == fd)
{
printf("连接事件\n");
}
}
}
}
}
int main()
{
epollTest();
return0;
}
上海硫磺皂 硫磺固体皂[家政爆氧粉]洗衣机爆氧强力除垢除味除污消毒清洁剂粉板栗夹开口剥栗子器剥生板栗夹子开壳神器拖地花露水拖地拖地花露水【9.9元发十包密封胶泥】升级款家用白色堵洞口/空调孔/下水道/防虫孔多功能密封胶泥管道密封白色胶泥家用密封膠泥孔洞一次性懒人抹布家用办公脖套颈椎保护套防低头 透气脖套日用防护小白鞋去黑剂划痕去黑污渍去黑 剂一次性空调防尘套罩9.9/20只 一次性便携免洗木浆鞋垫无痕衣架防滑无痕衣架无痕衣架晾晒无痕衣架品彩美体生物陶瓷单密磨毛高弹蓄热免穿内衣无痕保暖背心双面磨毛食品数显温度计家用高精度探温计厨房奶温烘焙水温计测油温F-110莫兰迪压缩毛巾一次性毛巾【9.9元/3大卷】加厚型大卷清香绿色抽绳一次性垃圾袋家用手提式手电钻抽水泵微型自吸泵家用小型水泵电钻驱动直流抽水机柴油[拍一发三]夏季薄款中腰收腹内裤强力收腹部冰丝无痕提臀塑形女士内裤[高品质]升级款元气四宝茶100g/10包 拒绝边角料花香洁厕液强力洁厕灵清香型除臭烟斗去污强效马桶清洗液宿舍亮妈妈【加强浓缩】魔粒泡深层去黄去污去渍增白家用爆炸盐电风扇防尘罩广西黄心木薯农家当季新鲜现挖黄肉木薯面包木薯糖水木薯1-9斤美粮坊 老上海葱花油饼90g*20片家庭锁鲜装M【送4个按摩头】新款筋膜枪全自动肌肉按摩手持按摩枪【广元】地漏网不锈钢地漏网过滤地漏网不锈钢鸡骨剪SK5剪刀不锈钢工业剪子厨房家用剪多功能锋利剪中式自粘贴画卧室床头房间背景壁画酒店宾馆装饰画主卧防水防油桂兰世家凉拌汁拌凉菜原味酸辣调味汁家用美味调料800g/200g/瓶9.9/2个 长柄杯刷奶瓶缝隙刷玻璃杯奶瓶刷尕兰郎兰州牛肉面180g*6桶 速食泡面冲泡面兰州拉面方便面美味方便健康葱姜蒜收纳筐姜蒜盒葱姜蒜收纳筐【丰川】四孔家用铸铁加厚煎蛋锅诗泊雅 蓬松高颅顶梳子发根排骨梳造型女士美发梳护手霜栀子花护手霜多功能水果刀双面削皮刀[9.9/两瓶]黄芪霜提亮肤色改善蜡黄粗糙暗黄滋润保湿面霜冰箱清洁剂冰箱除味剂冰箱清洁剂说道53度酱香型白酒500ml壹号老酒库【买一送一】防刮伤安全修眉刀安全型新手修眉防刮伤新手刮眉刀男神器套装剪刀极客一拖三超级快充数据线通用手机快充线适用于手机充电宝耳机