IO多路复用简单介绍

在编写服务器代码时,由于一个服务器要给多个客户端提供服务,那么就需要使用到多线程/线程池,一个线程对应一个客户端,看起来是合理的。当客户端数量非常多时,就需要大量的线程来为客户端提供服务,这样就会造成内存资源开销过大。

现有以下场景:

小明要吃A食物,小王要吃B食物,小红要吃C食物;

场景一:这三个人同时去买自己想吃的食物;

场景二:由小明将三个人要吃的食物买回来,先买A,拿到A后再去买B,拿到B后再去买C;

场景三:同样的,由小明买三个人的食物,但这次小明先去买A,在等A做好的同时,再去买B,在等A和B做好的同时,去买C,这样也能买到三人想吃的食物。

在上面的场景中,小明、小王、小红就相当于三个线程;

场景一就相当于三个线程同时工作,工作完后进入休眠状态,内存资源开销大;

场景二就相当于只有一个线程在工作,先完成A,再完成B,最后完成C,但由于每一个事务都有自己的执行时间,相当于这个线程花费了三倍的时间,虽然节省了内存资源,但是时间更长了;

场景三就相当于只有一个线程在工,但是在等待A的同时完成了B和C,相当于用一份时间做完了三件事,这就使得内存开销小,同时程序运行效率更高。

在场景三中,就使用了IO多路复用,只用一个线程去解决多个客户端的需求。由于在绝大情况下,客户端都是沉默的,线程只需要在客户端发来请求时进行处理就行了,这个请求结束后,这个线程就可以处理其他客户端发来的请求,同时,多个客户端在同一时间发送请求的概率较小。当客户端数目较多时,那么这个概率就会变大,我们就可以创建多个线程,一个线程给多个客户端提供服务,这样也可以提高程序运行的效率,同时节省了内存资源的开销。

你可能感兴趣的:(java,开发语言,网络)