一,同步/伪异步/异步(任务线程---服务端任务的执行) 同步和异步的体现主体是---任务执行线程. 如任务A,B,
1,同步---B任务的执行需要A任务执行后才进行.
2,伪异步--- B,A两个任务同时执行,但执行完成后,需要执行者主动轮询,或者使用多路复用模型专门指定一个线程来对执行结果进行跟进.
3,异步---B,A两个任务同时执行.且执行完后,会主动响应数据,之后告诉任务完成.
二,阻塞/非阻塞(客户线程--客户端调用服务端的状态) 阻塞/非阻塞体现的主体是---任务执行者线程. 如任务,A,B 的执行者
1,阻塞---执行者执行A任务.一直等待A完成后才去执行B任务.
2,非阻塞---执行者执行A任务后.打个标志.然后不用等结果.就去执行B任务.
备注:异步是啥,有多种说法相互矛盾(同样是很权威的几本书,包括操作系统教程,对于异步的定义都是不同的,有人把IO多路复用归为异步,有人把它归为同步。个人更喜欢将多路复用归为--伪异步)
a,阻塞I/O
b,非阻塞I/O
c,多路复用I/O
d,信号驱动I/O
e,异步I/O
java NIO的实现:三个核心概念.
一,Selector: 即多路复用模型中,负责轮询各个线程状态的线程.
二,socketChannel: 只是java对sockect的一种封装.为了方便selector对socket进行管理而封装的对象
三,Buffer :缓存堆
有两类实现,一个是HeapBuffer ,一个是DirectBuffer. 区别如下
HeapBuffer ----堆缓冲 :其实是在java 的内存模型中,java 虚拟机可以直接管控的
DirectBuffer ---直接缓冲 :使用native ,调用的是c 或者c++ 的代码直接操作系统内存,不在java的内存模型中,我们称为堆外内存,java 虚拟机无法管控;但是 address 维护了堆外内存的引用 (在buffer 类中维护者 long address)
使用DirectBuffer效率高于HeapBuffer, DirectBuffer数据的读写直接与堆外的内存(系统内存)打交道,少了一次数据的读写过程,实现了zero copy (零copy)