epoll的实现用到mmap了吗?

简介: epoll的实现用到mmap了吗?

先说结论:没有用mmap

epoll管理内核事件表用到mmap了吗?

在内核中,epoll 使用数据结构来管理事件表,而这些数据结构通常不是通过 mmap() 来分配内存的。相反,事件表的内存通常是由内核动态分配的,并由内核来管理和维护。

在Linux中,epoll并不直接使用mmap,而是使用mmap的一种实现方式来提高性能。epoll是Linux提供的一种事件通知机制,用于高效地处理大量的I/O事件。而mmap是一种内存映射文件到进程地址空间的机制,它允许进程直接访问文件数据而不需要进行显式的读写操作。

Linux内核中,epoll使用了mmap的一种实现方式来提高性能,具体是通过/proc文件系统中的epoll特定文件来映射内核数据结构到用户空间,从而实现高效的事件通知。这种方式使得用户空间应用程序可以直接访问epoll的内部数据结构,而不需要频繁地进行系统调用,从而提高了epoll的性能和效率。

总的来说,epoll并不直接使用mmap,但在其实现中使用了一种类似mmap的机制来提高性能。

感兴趣的可以阅读源码

revents = ep_item_poll(epi, &pt);//获取就绪事件
if (revents) { 
    if (__put_user(revents, &uevent->events) || __put_user(epi->event.data, &uevent->data){
        list_add(&epi->rdllink, head);//处理失败则重新加入链表 
        ep_pm_stay_awake(epi); 
        return eventcnt ? eventcnt : -EFAULT; 
    } 
eventcnt++; 
uevent++; 
    if (epi->event.events & EPOLLONESHOT)    
    epi->event.events &=EP_PRIVATE_BITS;//EPOLLONESHOT标记的处理 
 
    else if (!(epi->event.events & EPOLLET)) {    
    list_add_tail(&epi->rdllink, &ep->rdllist);//LT模式处理 
    ep_pm_stay_awake(epi); 
    }
 
 
}

epoll是否线程安全?

在Linux系统中,epoll本身是线程安全的。epoll提供的系统调用是线程安全的,这意味着可以在多个线程中同时使用epoll来管理不同的文件描述符或套接字。多个线程可以同时调用epoll_create()epoll_ctl()epoll_wait()等函数,而不会导致竞态条件或数据不一致的问题。

但是,需要注意的是,epoll的线程安全性仅适用于epoll本身的操作。如果在多个线程中同时访问同一个文件描述符或套接字,而没有合适的同步机制,那么可能会出现竞态条件或数据不一致的情况。因此,在使用epoll的多线程程序中,需要确保对共享的资源进行适当的同步,以避免竞态条件:即使使用了ET模式,一个socket上的事件还是可能被触发多次,例如:当一个线程处理一个socket时有新数据写入,此时另外一个线程被唤醒读取这些数据,于是出现了两个线程通过是操作一个socket的情况。EPOLLONESHOT解决了多个线程同时操作一个socket的问题,对于注册了EPOLLONESHOT的事件,操作系统最多触发其上注册的一个可读可写异常事件,且只触发一次。这样,一个线程在操作这个socket时,其他线程不可能有机会操作该socket。但反过来思考,注册了EPOLLONESHOT事件的socket,一旦被某个线程处理完毕,要及时修改为EPOLLIN或其他事件,以确保下次这个socket可读时,其事件能够被触发,进而让其他线程有机会继续处理

总的来说,epoll本身是线程安全的,但在多线程程序中使用时,需要注意对共享资源的访问进行合适的同步。

目录
相关文章
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch应用实战六:利用LSTM实现文本情感分类
PyTorch应用实战六:利用LSTM实现文本情感分类
763 0
|
网络协议 网络虚拟化 数据中心
一文彻悟容器网络通信
作者:云原生应用平台 - 陈赟豪(环河)本文深入浅出地介绍了容器网络出现的背景、容器网络的CNI插件及分类对比,描述了容器网络插件的Pod同节点和跨节点通信过程及其应用场景,让读者能过通过简短的篇幅窥见容器网络的真谛。背景容器网络为何出现在一个汽车发动机的生产车间中,汽车发动机的各个组件会存在一定的顺序进行组装,这就要求有直接关系的组件必须知道下一个组件的具体位置。当一个汽车发动机组装完成后,距离
1632 0
一文彻悟容器网络通信
|
14天前
|
网络协议 安全 应用服务中间件
|
5月前
|
算法 安全 Java
深入理解JVM《CMS收集器详解》
CMS收集器以降低停顿时间为目标,通过并发标记-清除实现低延迟,适用于交互式应用。其采用三色标记法与增量更新确保并发安全,利用卡表优化重新标记效率。虽存在浮动垃圾、内存碎片及资源敏感等缺陷,且已被G1、ZGC取代,但其核心思想对现代GC仍具重要参考价值。
|
算法 数据可视化 数据挖掘
深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
|
Linux 网络虚拟化 数据中心
【docker】容器间跨宿主机通信-基于overlay
【docker】容器间跨宿主机通信-基于overlay
1075 0
【docker】容器间跨宿主机通信-基于overlay
|
人工智能 自然语言处理 机器人
对话阿里云CIO蒋林泉:AI时代,企业如何做好智能化系统建设?
10月18日, InfoQ《C 位面对面》栏目邀请到阿里云CIO及aliyun.com负责人蒋林泉(花名:雁杨),就AI时代企业CIO的角色转变、企业智能化转型路径、AI落地实践与人才培养等主题展开了讨论。
|
监控 安全 虚拟化
Docker技术概论(5):Docker网络
Docker技术概论(5):Docker网络
2508 6
|
安全 Java 编译器
Qt之Q_OBJECT 宏的神奇之旅(一)
Qt之Q_OBJECT 宏的神奇之旅
1098 0

热门文章

最新文章