目录
BIO-阻塞IO
说明
从客户端发出请求到内核把数据拷贝到用户空间都处于阻塞状态。
缺点
想要同时处理多个客户端请求就只能开启多线程进行处理,但是每次开启多线程就会涉及到用户空间和内核空间的切换,性能较差。而且如果用户过多,系统很容易耗尽线程资源,容易造成性能瓶颈。
NIO-非阻塞IO
说明
客户端发出请求后不会一直阻塞等待,而是会去做其他的操作,然后采用轮询的机制每隔一段时间查询看内核的数据是否准备好,直到数据准备好之后才阻塞的将数据拷贝到用户空间。
好处
- 使用一个线程就能处理多个客户端请求。
- 客户端发送请求后不用阻塞地等待内核把数据拷贝到用户空间。
缺点
- 需要不断地进行轮询,每一次轮询进行read操作都涉及了用户空间和内核空间的切换,拉跨效率。
- 如果同时有一千个客户端请求,但是只要有一两个客户端传递信息。但是仍然会轮询每个连接进行
read
尝试,会造成 CPU 的空转,甚至会把服务器拉垮。
优化
尝试将对客户端请求的轮询 read
操作放到内核空间进行,从而解决了用户空间和内核空间切换导致的性能问题。
IO多路复用
使用一个线程去监听多个用户连接,只有当用户连接可读可写的时候才会回调通知,告诉服务端内核空间的数据已准备就绪,并将准被就绪的客户端连接放入到集合中,这样无需遍历所有客户端连接来判断哪个客户端连接准备就绪,提高了性能。