7.2 select, poll, epoll

less than 1 minute read

7.2 select/poll/epoll

  • select, int select(), 监控三类文件描述符, writefds, readfds, exceptfds, 调用select函数后阻塞, 直到描述符准备就绪或者超时, 函数返回
  • poll, int poll(), 与select类似, 没有描述符大小限制
  • epoll, 包含epoll_create, epoll_ctl, epoll_wait, epoll_ctl时把current挂一遍并为每个fd指定回调函数, 当设备就绪, 唤醒等待队列上的等待者, 就会调用这个回调函数, 这个回调会把就绪的fd加入到就绪链表, epoll_wait实际是在就绪链表查看有无就绪的fd

    7.3 等待队列

  • 使进程等待某一事件发生而无需频繁的轮询, 进程在等待期间睡眠,在某事件发生时由内核自动唤醒
  • __wait_queue_head
  • __wait_queue, 必须获得自旋锁
  • 调用wait_event, 进程进入睡眠, 将控制权释放给调度器
  • 进程睡眠, add_wait_queue, 将进程加到等待队列
  • 唤醒进程, 内核定义唤醒进程宏..

参考