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, 将进程加到等待队列
- 唤醒进程, 内核定义唤醒进程宏..
参考