java io和nio对比:
IO面向流,NIO面向缓冲区(数据必须先读入缓冲区再处理);
IO是阻塞的(源码体现在哪?),NIO是非阻塞的(结合选择器一个线程可以管理多个channel);
(java.io.Reader#read方法注释中说:This method will block until some input is available…;)
(PipedWriter#write、ObjectOutput#write、DataInput#readFully、PipedReader#receive、PushbackReader#skip、RandomAccessFile#read也如此;)
(阻塞是通过wait、notifyAll实现的;)
(java.nio.channels.SocketChannel、java.nio.channels.ServerSocketChannel、java.nio.channels.DatagramChannel可以搜索non-blocking;)
NIO涉及线程、多个channel、缓冲区,管理更复杂,但效率也更高;IO一个线程对应一个流,较为简单,但效率较低;(使用哪个看实际场景;比如p2p适合用IO,而聊天服务器适合用NIO;)
http://tutorials.jenkov.com/java-nio/nio-vs-io.html !!!
http://tutorials.jenkov.com/java-nio/index.html !!!(多篇国外原文)
http://ifeve.com/java-nio-all/ !!!(原文翻译)
http://www.importnew.com/22623.html !!!
https://www.cnblogs.com/dolphin0520/p/3919162.html
https://weixiaolu.iteye.com/blog/1479656 !!!
https://weixiaolu.iteye.com/blog/1504898
https://blog.youkuaiyun.com/u011381576/article/details/79876754 !!!
flip用于将buffer从写模式切换到读模式;
clear清空整个buffer;compact只清除已读的数据;
Scattering是指一个channel读取到多个buffer;
Gathering是指多个buffer写入到一个channel;
FileChannel只能运行阻塞模式;
AsynchronousFileChannel是非阻塞模式?
SocketChannel和ServerSocketChannel可以运行非阻塞模式;
(传统的Socket/ServerSocket是阻塞模式;)
Non-blocking IO一定比传统IO好吗?不一定,各有各的用处
如何看待非阻塞的cpu切换,或上下文开销?
非阻塞io如何知道可以继续进行,通过轮询?回调函数?
什么是异步阻塞?什么是AIO?
同步一般是阻塞?异步一般是非阻塞?(不是一定)
(同步非阻塞是CAS;没有异步阻塞的说法;)
java中阻塞的根本方式有: Object.wait、synchronized(obj)、UNSAFE.park、以及其他native方法;
(其中,Object.wait和UNSAFE.park是native方法,而synchronized是关键字;它们都很底层;)
(注意:Condition.await是利用LockSupport.park实现的;而LockSupport.park是用UNSAFE.park实现的;见AQS的ConditionObject内部类;)
(Lock.lock或ReentrantLock.lock利用AQS的acquire方法,后者调用acquireQueued方法,再调用parkAndCheckInterrupt,最后还是调用LockSupport.park)
(java.io中的阻塞部分利用Object.wait实现的;)
(Object.wait和UNSAFE.park都是主动的,synchronized是被动阻塞的?)
(除了wait、park,好多native方法都能自动阻塞,比如java.io.RandomAccessFile#read方法,调用native方法read0!!!)
什么是异步?
java中通常用回调函数?通常用Future、CompletionHandler等?包括AsynchronousFileChannel、FutureTask都是利用Future实现的;
ajax及其回调也是异步的;(ajax用JavaScript执行异步网络请求,成功和失败分别执行什么,和CompletionHandler接口非常类似;)
异步指的是不在当前线程内执行?
TCP是同步,UDP是异步?
HttpClient也是异步的?
https://www.cnblogs.com/guogangj/p/5462594.html
https://www.jianshu.com/p/f00aa6f66281
https://baike.baidu.com/item/异步/3441874?fr=aladdin !!!
https://www.cnblogs.com/anny0404/p/5691379.html !!!
异步有多种含义,在计算机网络和编程语言(或操作系统)的含义不同;
计算机网络中,异步是指双方不需要共同的时钟,接收方不知道发送方什么时候发送;在发送的信息中就要有提示接收方开始接收的信息,如开始位、停止位;(所以,TCP是同步,UDP是异步?说法是正确的;)
编程语言中,异步是指多线程的异步处理;与同步处理相对,异步处理不用阻塞当前线程来等待处理完成;当其他线程处理完成,回调通知此线程;
linux网络io模型:
- 阻塞io模型 2. 非阻塞io模型 3. io复用模型 4. 信号驱动io模型 5. 异步io模型(AIO)
注意:flume的多路复用来自java的多路复用,而java的多路复用来自unix;
(同理,flume的channel来自java的channel,而java的channel来自unix的通道;)
jdk1.4是nio1.0,jdk1.7是nio2.0;
(nio2.0提供了spi、aio等;)
Reactor模式、Proactor模式、线程模型:
Reactor模式又叫反应器或反应堆,是一种线程模型,也是网络编程中的一种设计模式;
(分为Reactor单线程模型、Reactor多线程模型、主从Reactor多线程模型;)
Reactor中,被拆分的小线程或者子过程对应handler,每一种handler处理一种event;
(Tomcat、Jetty、Netty、Mina、Redis的NIO都实现了Reactor模式;)
Reactor实现相对简单,对于耗时短的场景处理高效;
Reactor同时接收多个服务请求,并依次同步处理事件驱动程序;(Reactor是被动接收,且属于同步I/O)
Proactor模式又叫前摄器或主动器模式;
Proactor异步接收和同时处理多个服务请求的事件驱动程序;(Proactor是主动发起,且属于异步I/O)
Proactor性能更高,能够处理耗时长的并发场景;
Proactor实现逻辑复杂;依赖操作系统对异步的支持,目前实现了纯异步操作的操作系统少(如windows IOCP),因此应用范围较小;
https://www.cnblogs.com/me115/p/4452801.html
https://www.jianshu.com/p/bae386af45ca
nio采用的是reactor模式,aio采用的是proactor模式?
《Scalable IO in Java》
《Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events》 1995
《Reactor An object behavioral pattern for concurrent event demultiplexing and dispatching》 1995
《Proactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Asynchronous Events》1997
https://www.jianshu.com/p/eef7ebe28673
https://www.cnblogs.com/doit8791/p/7461479.html
http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html
https://www.cnblogs.com/ivaneye/p/5731432.html
https://www.jianshu.com/p/188ef8462100
akka和Actor模型啥关系?akka不如netty?Akka的底层是使用Netty?spark为何用Netty替代Akka?Akka为什么是协程级的?
akka是一款基于actor模型实现的并发处理框架;每个actor有自己的属性和操作,避免了多线程之间共享数据及锁机制的处理;(类似Threadlocal?)
akka相对于Netty来说,是一个更高层次的抽象;(早期Akka的底层NIO就用的Netty)
spark1.6为避免Akka造成的版本问题,给应用更大灵活性,决定用更通用的RPC实现,也就是现在的Netty替代Akka;
https://blog.youkuaiyun.com/zhao897426182/article/details/79231752
Scala Actor可看做一个轻量级的Java Thread,使用方式和Java Thread也一致,继承Actor、实现act方法,启动时也是调用start方法;(Scala把Erlang风格的基于actor的并发带进了JVM;)