1. SELECT的机理以及缺陷:
poll函数实现的机理:
1.在调用select函数时,第二个参数为&read_fds,这个参数实际上就是左侧图中的bitmap,总共有1024位,CPU会将该bitmap从用户态拷贝到内核态,由内核去判断是否有就绪事件的发生。
2.在判断过程中,调用select函数的进程会处于阻塞状态,当客户端给服务端发来数据时,会拷贝到数据的接收队列中,当接收队列中有数据时,会唤醒相应的进程。
3.此时内核态的数据会拷贝到用户态中,用户态再通过遍历去找到就绪的事件。
从上述select的机理中不难看出select具有一些不足之处:
1.首先bitmap的位数1024,限制了文件描述符的数量
2.其次在内核态同样需要遍历所有才能检测到就绪的事件,最后还需要将内核态所有的内容拷贝到用户态,在用户态遍历时间复杂度同样为O(n)
3.因为需要拷贝到bitmap中所以bitmap不可以重用,每次使用必须重新创建
2. POLL的机理以及缺陷:
poll的机理:
1.在调用poll函数时,第二个参数为fds,这个参数实际上是一个结构体,CPU会将该该结构体从用户态拷贝到内核态,由内核去判断是否有就绪事件的发生。
2.在判断过程中,调用poll函数的进程会处于阻塞状态,当客户端给服务端发来数据时,会拷贝到数据的接收队列中,并将是内核内将pollfd的结构体内的revents修改,为当接收队列中有数据时,会唤醒相应的进程。
3.此时内核态的数据会拷贝到用户态中,用户态再通过遍历去找到就绪的事件。
从上述poll的机理中不难看出poll具有一些不足之处:
1.相比于select来说,解除了1024描述符的限制,使用链表存储描述符。
2.其次在内核态同样需要遍历所有才能检测到就绪的事件,最后还需要将内核态所有的内容拷贝到用户态,在用户态遍历时间复杂度同样为O(n)
2. EPOLL的机理以及相对于poll的优势:
epoll的机理:
1.通过epoll_create()在内核中创建eventpoll,eventpoll中有三个重要的成员,rdy保存已就绪的事件,rbr为红黑树,wq是存储阻塞的进程。每个红黑树的节点为epitem。
2.在epoll_wait()函数中,可以得到返回的就绪事件
3.一个文件描述符对应的是一个回调函数,有数据到达时触发回调函数放到就绪队列中。
epoll的优势:
1.减少了用户态到内核态数据的拷贝,在创建的时候将文件描述符拷贝到内核态,在调用epoll_wait函数时返回的只是就绪的文件描述符。
2.通过回调函数将就绪事件放入等待队列当中,不用循环遍历
3.使用红黑树加双链表的形式使得文件描述符的数量在理论上不受限制。