背景:
这些都是在IO多路复用,也就是在服务端如何处理多个客户端的请求事件,一个常见的思路就是采用多线程:对于不同的事件,新开一个线程,单独处理该事件。但是存在的弊端是:开辟线程会创建线程栈会消耗资源,且不同线程会进行CPU的上下文切换,切换时要处理多个操作句柄,所以多线程不是好的方案。
select:
首先用一个描述符集合也就是数组监听多个文件描述符,存储了多个监听的fd,然后将这个数组FD_SET转为bitmap,select会将这个bitmap会从用户态拷贝进入内核态,在内核中通过遍历的方式以阻塞的方式判断是否有数据到来,也就是事件是否就绪,如果某个fd就绪,就给这个fd置位,并将结果拷贝回用户态,用户从这个结果和原数组进行对应,通过遍历整个数组的方