首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生

可以看到服务器端确实为每个连接创建一个线程,共创建了20个线程。 客户端进入休眠约5-10秒,模拟连接上数据不就绪,服务器端线程在等待,等待时间约5-10秒。 客户端陆续结束休眠,往连接上写入1M数据,服务器端开始读取数据,整个读取过程约1秒。 可以看到,服务器端的工作线程会把时间花在“等待数据”和“读取数据”这两个过程上。 这有两个不好的地方: 一是有很多客户端同时发起请求的话,服务器端要创建很多的线程,可能会因为超过了上限而造成崩溃。 二是每个线程的大部分时光中都是在阻塞着,无事可干,造成极大的资源浪费。 开头已经说了那个年代网民很少,所以,不可能会有大量请求同时过来。至于资源浪费就浪费吧,反正闲着也是闲着。 来个简单的小例子: 饭店共有10张桌子,且配备了10位服务员。只要有客人来了,大堂经理就把客人带到一张桌子,并安排一位服务员全程陪同。 即使客人暂时不需要服务,服务员也一直在旁边站着。可能觉着是一种浪费,其实非也,这就是尊贵的VIP服务。 其实,VIP映射的是一对一的模型,主要体现在“专用”上或“私有”上。

03

一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生

曾经的VIP服务 在网络的初期,网民很少,服务器完全无压力,那时的技术也没有现在先进,通常用一个线程来全程跟踪处理一个请求。因为这样最简单。 其实代码实现大家都知道,就是服务器上有个ServerSocket在某个端口监听,接收到客户端的连接后,会创建一个Socket,并把它交给一个线程进行后续处理。 线程主要从Socket读取客户端传过来的数据,然后进行业务处理,并把结果再写入Socket传回客户端。 由于网络的原因,Socket创建后并不一定能立刻从它上面读取数据,可能需要等一段时间,此时线程也必须一直阻塞着。在向Socket写入数据时,也可能会使线程阻塞。 这里准备了一个示例,主要逻辑如下: 客户端:创建20个Socket并连接到服务器上,再创建20个线程,每个线程负责一个Socket。 服务器端:接收到这20个连接,创建20个Socket,接着创建20个线程,每个线程负责一个Socket。 为了模拟服务器端的Socket在创建后不能立马读取数据,让客户端的20个线程分别休眠5-10之间的一个随机秒数。 客户端的20个线程会在第5秒到第10秒这段时间内陆陆续续的向服务器端发送数据,服务器端的20个线程也会陆陆续续接收到数据。

04
领券