网络编程
IO模型
- 同步阻塞IO:客户端发送请求,当服务端在等待某个操作的时候,客户端就会被阻塞,直到服务端完成请求。
- 同步非阻塞IO:客户端发送请求,当服务端在等待某个操作时,不会阻塞,此时客户端不断轮询去发送请求,直到服务端能够接受然后去执行。但是在执行过程中客户端依旧是阻塞的。并且循环请求消耗很多的资源。
- (也是同步)多路复用:客户端在服务端未准备好执行事件的时候先阻塞,当服务端准备好后,才去发送请求。无事件阻塞,有事件执行。客户端在服务端准备期间和执行期间都是堵塞的。
- 同步:线程自己去获取结果(一个线程)
- 异步:线程自己不去获取结果,而是由其他线程送结果(至少两个线程)
- 异步非阻塞:客户端发送请求,通知服务端完成事件后,再通过回调方法来返回结果。
零拷贝优化(并非真正的0拷贝)
- 所谓的零拷贝是指用户态和内核态之间不存在拷贝。存在用户态到内核态的切换,但是拷贝都是发生在内核态。
- 问题:JAVA的IO实际不是物理设备级别的读写,而是缓存的复制,底层还是调用操作系统的读写方法,所以JAVA的每次读写都需要进行用户态到内核态,再从内核态到用户态的切换以及缓冲区的拷贝。
- 优化1:可以通过DirectByteBuffer进行优化。将堆外内存映射到JVM内存中来直接访问使用。减少一次数据的拷贝。但是用户态和内核态的切换次数没有减少。
- 优化2:通过channel调用transferTo/transferFrom方式拷贝数据。底层调用sendFile方法,