600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Linux系统网络编程——第二十节 多路复用之epoll 模型

Linux系统网络编程——第二十节 多路复用之epoll 模型

时间:2023-11-13 04:51:58

相关推荐

Linux系统网络编程——第二十节 多路复用之epoll 模型

目录

epoll相关系统调用

1、epoll_create:

2、epoll_ctl()

3、epoll_wait

epoll模型原理

epoll的使用场景

各位好,博主新建了个公众号《自学编程村》,拉到底部即可看到,有情趣可以关注看看哈哈,关注后还可以加博主wx呦~~~(公众号拉到底部就能看到呦~~)

epoll相关系统调用

1、epoll_create:

int epoll_create(int size);

(自从linux2.6.8之后, size参数是被忽略的,用完之后, 必须调用close()关闭

返回值一个文件描述符

调用这个函数的时候,底层(内核层)会帮我们构建出一个epoll模型。epoll模型是什么?先不用管,就先理解它是一个模型就好了,它是有一个整体的、抽象的概念。

2、epoll_ctl()

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

作用:向epoll模型中添加(删除、修改等) 对应的文件描述符 以及 对应的事件

1、epfd:epoll模型编号;

2、op选项:

EPOLL_CTL_ADD :注册新的fd到epfd中;

EPOLL_CTL_MOD :修改已经注册的fd的监听事件;

EPOLL_CTL_DEL :从epfd中删除一个fd;

该函数表示向epfd这么一个epoll模型当中,添加、删除、修改(op选项决定)对应文件描述符(fd)的相应事件(event)(这里是用户告诉内核)

(结构体event下面会再说到)

3、epoll_wait

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

第一个参数表示我们所创建的epoll模型。

第二、三个参数表示两个输出型参数:表示内核告诉用户:哪些文件描述符对应的哪些事件已经就绪了,我给你放在了epoll_event列表当中,并且告诉你有多大。

第四个参数和poll用法一样

用了epoll,那么整个文件描述符都是由系统来管理了(直观的感受是不需要自己再去定义数组了)

对于那个event结构体,如下图:

epoll宏的集合:

EPOLLIN :表示对应的文件描述符可以读 (包括对端SOCKET正常关闭);

EPOLLOUT :表示对应的文件描述符可以写;

EPOLLPRI :表示对应的文件描述符有紧急的数据可读 (这里应该表示有带外数据到来);

EPOLLERR :表示对应的文件描述符发生错误;

EPOLLHUP :表示对应的文件描述符被挂断;

EPOLLET :将EPOLL设为边缘触发(Edge Triggered)模式, 这是相对于水平触发(Level Triggered)来说的.

EPOLLONESHOT:只监听一次事件, 当监听完这次事件之后, 如果还需要继续监听这个socket的话, 需要

再次把这个socket加入到EPOLL队列里

epoll模型原理

1、创建epoll模型即在内核当中为我们创建了一颗红黑树。

在红黑树上的结点:放置两个元素(fd和event)。所以调用epoll_ctl的时候你要帮助我关心哪些fd上面的哪些event(K,V模型)。如果要修改或者增加、删除,就是对红黑树的结点进行操作。

2、建立回调函数。

在OS上,使用驱动层的某些功能,完成某些回调功能。

3、创建就绪队列。

当底层有事件已经就绪的时候,那么就调用OS的某些回调功能的机制,然后在系统层面上生成一个新的结点(元素也是fd\event)(可能没有fd),然后放在就绪队列当中

Epoll_ctl就是帮助我们删除、增加、修改等。(本质帮我们创建或者消除结点,然后生成相应的回调函数)

Epoll_wait就直接从就绪队列里面拿就可以了。(本质上为拷贝)

思考几个问题:

1、OS怎么知道数据是发送过来给自己的?

本质上是通过中断机制。(可自行上网搜一搜)

2、OS怎么知道一个事件已经就绪了?

缓冲区有一个低水位线这样一个概念,当数据不断交付给上层的时候,数据越来越多,多到一定程度的时候就证明事件就绪了

3、不管是poll还是select,都是通过轮询的方式,效率较低。

而epoll所用的是属于回调机制,即事件就绪的文件来去主动向上通知交付。

(关于epoll的用法,还涉及到ET模型和LT模型,这里就不做过多赘述了,感情去的小伙伴可以上网搜索一下)

epoll的使用场景

epoll的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll的性能可能适得其反.

对于多连接, 且多连接中只有一部分连接比较活跃时, 比较适合使用epoll.

例如, 典型的一个需要处理上万个客户端的服务器, 例如各种互联网APP的入口服务器, 这样的服务器就很适合epoll.

如果只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll就并不合适. 具体要根

据需求和场景特点来决定使用哪种IO模型

好啦,本节的内容就到这里啦~~

原创不易,如果觉得写的不错,就点个赞呗~~~笔芯~~~~

下面是笔者的微信公众号,也欢迎来关注呀~~~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。