本文重点针对epoll源码中锁的使用,2.6.22.6源码中,epoll使用了三个锁,一个spin_lock,一个mtx,一个全局的mtx
1.ep->lock (spinlock)
使用自旋锁的原因是poll 回调函数可能会从wake_up()调用,可能涉及到中断上下文,而中断是不能被睡眠的,所以只能用自旋锁.
2.ep->mtx (mutex)
因为poll事件循环可能涉及到从内核切换到用户态,所以需要一个互斥锁来让进程睡眠
3.epmutex (mutex)
全局互斥锁序列化eventpoll_release_file()和 ep_free().