前言:本文用到的铺垫知识:TCP/IP、操作系统 用户态/内核态的切换、linux 系统 文件描述符概念(应还有点socket编程经验,起码手写过TCP/IP连接的服务端),系统的中断
发展目的:让CPU的运行时间多花在用户空间的应用程序上,而不是内核态的进程,线程管理上
1.首先谈下客户端和服务端是怎么建立TCP连接的
1)服务端启动
- 首先服务端创建socket套接字
- 绑定监听端口
- 通过一个死循环来调用Accept不断监听客户端信息
- 如果有客户端连接则抛出一个新的线程去处理这个连接
一、BIO (blocking I/O)阻塞型IO
- 首先看下阻塞型IO,如果,我们的服务端接受到客户端请求并建立连接,客户端再发送消息是需要时间的,在这个时间段内此时我们的服务端线程会调用内核read()方法,此时此线程会处于阻塞状态,就是一直等待着客户端发送消息。
- 这样的话,每一个客户端连接都会抛出一个线程(线程是要消耗内存资源的,默认的JVM配置中,每一个线程默认大小是1MB),并且网络IO的效率远低于CPU处理效率,这样CPU不断地轮询线程,不断地保存并恢复现场,耗费了大量时间在线程切换上面。弊
- 此场景弊端是线程抛出的太多了,每一个客户端连接都需要抛出一个线程。要解决这个问题,那么为什么要抛出线程呢?
- 是因为IO阻塞,所以才每一个连接都抛出一个线程,为了解决这个问题,NIO(Non-Blocking IO)应运而生
<