1.问题
当有多个客户端连接去请求服务器的时候,如果同步阻塞的话,就会出现排队处理的情况,处理请求的效率会非常的慢。这种是同步阻塞。一个线程只能处理一个请求。遇到IO的时候就只能选择等待。
当然我们可以使用多线程的方式进行处理,也就是说一个连接使用一个线程,几十个连接还是能处理的,当连接超过几百个的话可能服务器就很难应付。只进行线程的切换就消耗掉了大批的资源。从内核态到用户态来回切换。
2.多路复用IO
从字面意思的理解是多个连接socket(线程)公用一个线程。忙闲等待。
3.具体的实现方式
select、poll、epoll。
select()函数中会维护一个fd_set,用来保存连接的socket,file descriptor.文件描述符会记录读写状态,是否读写完成。当有读写事件发生的时候就会通知。select()去调用的时候回去遍历这个数组假设有已经读写完成的fd,那么就去通知他。
依靠的是遍历。
poll 同select类似
epoll() 依靠的是回调。当事件读写完成之后回去回调fd。然后我们就知道拿一些socket已经完成了,直接遍历这个队列即可。