美文网首页
epoll/select 内核中的实现以及等待队列的一些理解

epoll/select 内核中的实现以及等待队列的一些理解

作者: carlson | 来源:发表于2017-01-13 20:45 被阅读0次

select 在内核中大致实现的一个解说:http://janfan.github.io/chinese/2015/01/05/select-poll-impl-inside-the-kernel.html

等待队列的一些理解:http://www.cnblogs.com/zhuyp1015/archive/2012/06/09/2542894.html

do_select => poll =>fp_poll.

do_select 会对每个fd执行对应的poll操作,poll是file operation (fp)的一个函数指针,具体实现由指向的fp_poll函数实现。fp_poll的核心是调用poll_wait,poll_wait 把当前进程挂到对应fd的设备等待队列,

具体是执行:poll_table*p;p->_qproc 函数, 这个_qproc 是指向 __pollwait 函数 。 这个函数才是真正意义上把 当前进程挂到设备等待队列里面,主要是 调用 add_wait_queue(wait_queue_head_t*q,wait_queue_t*wait),  主要是把wait 加入到wait_queue_head_t里面。其中wait_queue_t 结构体 包括 private (进程信息相关),wait_queue_func_t (进程唤醒后执行的回调函数,一般由设备驱动程序的中断程序执行)。

当把所有的fd和对应的进程都挂到对应的等待队列后,再检查一下fd有没相关的事件,没有的话,如果没有信号中断的情况下,调用 poll_schedule_timeout 函数 进程就会进入休眠,等待唤醒状态。

等待队列的 等待/唤醒:

等待:

等待其实就是把对应的进程信息、唤醒回调函数  包装进入 wati_queue_t 结构体, 然后再由 add_wait_queue 函数把 wait_queue_t 添加到 wait_queue_head_t 里面, wait_queue_head_t 是个链表结构,用来管理wait_queue_t 单元的。

具体底层操作主要是:wait_event_interruptible 函数实现,这个函数会调用 prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); 通过__add_wait_queue把相关的wait 添加到 wait_queue_head_t , 并且把进程的状态置为:TASK_INTERRUPTIBLE 。

以上的操作并不会使进程进入休眠,只把进程挂入等待队列。

接着调用:schedule_timeout 函数,使进程进入休眠,让出CPU。

唤醒:

对于设备驱动来讲,通常是在中断处理函数内唤醒该设备的等待队列。__wake_up(wait_queue_head_t *q, unsignedintmode,intnr_exclusive,void*key) 函数 会被中断程序执行,此函数调用 __wake_up_common ,遍历 传进来的 wait_queue_head_t , 依次执行 wait_queue_t 对应的唤醒回调函数,。

最后 从唤醒函数执行后,finish_wait 函数会被调用,清理相关的信息和资源(从等待队列删除之类的),然后把进程状态置为:TASK_RUNNING

相关文章

  • epoll/select 内核中的实现以及等待队列的一些理解

    select 在内核中大致实现的一个解说:http://janfan.github.io/chinese/2015...

  • epoll IO多路复用模型实现机制

    epoll的设计和实现与select完全不同。epoll通过在Linux内核中申请一个简易的文件系统调用epoll...

  • linux 内核poll/select/epoll实现剖析

    linux 内核poll/select/epoll实现剖析 - 在思考的路上 - ITeye博客

  • select VS poll VS epoll

    参考: 深度理解select、poll和epoll说明:这三个操作都是内核直接实现的,用户进程只是调用其接口以使...

  • 等待队列

    等待队列概念以及使用 一、概述等待队列在内核中有很多用途,尤其在中断处理、进程同步及定时。等待队列实现事件上的条件...

  • Linux网络编程——I/O复用函数之epoll

    一、epoll概述epoll 是在 2.6 内核中提出的,是之前的 select() 和 poll() 的增强版本...

  • 2018-09-16

    nginx,要去理解epoll这个技术,以及和select之间的差别。理解什么是NIO。 对于redis,只要要理...

  • 2020-05-03

    关于 epoll 和 select 的区别?epoll 和 select 都是 I/O 多路复用的技术,都可以实现...

  • IO多路复用

    select,poll,epoll,kqueue,其实都是IO多路复用的实现。只是epoll和kqueue实现的效...

  • 2020-06-17

    内核线程、用户线程与select/poll/epoll之间的关系? 前提:内核线程是在“开机”时刻就已经创建的; ...

网友评论

      本文标题:epoll/select 内核中的实现以及等待队列的一些理解

      本文链接:https://www.haomeiwen.com/subject/hhvsbttx.html