介绍
BIO就是: blocking IO,同步阻塞IO。应用程序向操作系统请求网络IO操作,这时应用程序会一直等待;另一方面,操作系统收到请求后,也会等待,直到网络上有数据传到监听端口;操作系统在收集数据后,会把数据发送给应用程序;最后应用程序受到数据,并解除等待状态。
阻塞IO
和非阻塞IO
主要描述的是程序请求操作系统IO操作后,如果IO资源没有准备好,那么程序该如何处理的问题: 前者等待;后者继续执行(并且使用线程一直轮询,直到有IO资源准备好了)
同步IO
和非同步IO
主要描述的是操作系统在收到程序请求IO操作后,如果IO资源没有准备好,该如何响应程序的问题: 前者不响应,直到IO资源准备好以后;后者返回一个标记(好让程序和自己知道以后的数据往哪里通知),当IO资源准备好以后,再用事件机制返回给程序。
传统BIO问题
同一时间,服务器只能处理一个客户端的请求处理,除非采用多线程方式。完全不能抗住高并发。
多线程-伪异步
但是使用线程来解决这个问题实际上是有局限性的:
1)虽然在服务器端,但是请求的处理交给了一个独立线程进行,虽说数据处理可以多线程处理,但是请求毕竟是需要一个一个来。
2)**在linux系统中,可以创建的线程是有限的。**以通过cat /proc/sys/kernel/threads-max 命令查看可以创建的最大线程数。但是线程越多,CPU切换所需的时间也就越长,用来处理真正业务的需求也就越少。
3)创建一个线程是有较大的资源消耗的。JVM创建一个线程的时候,即使这个线程不做任何的工作,JVM都会分配一个堆栈空间。这个空间的大小默认为128K,您可以通过-Xss参数进行调整。当然您还可以使用ThreadPoolExecutor线程池来缓解线程的创建问题,但是又会造成BlockingQueue积压任务的持续增加,同样消耗了大量资源。
4)如果大量使用长连接的话,线程是不会关闭的,这样系统资源的消耗更容易失控。
而异步IO模式 就是为了解决这样的并发性存在的。