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本身是线程安全的,但在多线程程序中使用时,需要注意对共享资源的访问进行合适的同步。

目录
相关文章
|
7月前
mmap实现共享内存
mmap实现共享内存
102 0
|
4月前
|
存储 Unix Linux
关于epoll和mmap的思考
关于epoll和mmap的思考
|
7月前
|
Linux
|
7月前
|
安全
实现用户态epoll的原理
实现用户态epoll的原理
69 0
|
Linux Windows
poll&&epoll实现分析(二)——epoll实现
Epoll实现分析——作者:lvyilong316 通过上一章分析,poll运行效率的两个瓶颈已经找出,现在的问题是怎么改进。首先,如果要监听1000个fd,每次poll都要把1000个fd 拷入内核,太不科学了,内核干嘛不自己保存已经拷入的fd呢?答对了,epoll就是自己保存拷入的fd,它的API就已经说明了这一点——不是 epoll_wait的时候才传入fd,而是通过epoll_ctl把所有fd传入内核再一起"wait",这就省掉了不必要的重复拷贝。
1042 0
|
PHP Linux 消息中间件