同步异步:指的是需不需要等待返回结果;
同步:需要不断轮询数据是否准备好了,或者一直在等待数据准备好
异步:发送一个请求就立即返回,然后去干别的事情,当数据准备号了会通知进行相关处理。
(同步的实时性比较号,异步的并发性能比较号)
阻塞和非阻塞:是指需不需要阻塞线程
阻塞:当前线程不执行别的事情,一直再等待
非阻塞:当前线程可以干别事情,间隔一段时间检查一下上次的数据有没有准备好;
它们修饰的对象不一样,阻塞非阻塞,是指进程需要的数据如果未就绪,需不需要等待; 同步异步,是指数据准备好后进行访问的机制,访问数据的时候,需不需要等待IO处理完成。(同步需要等待IO完成,异步是IO完成后通知进程进行处理)
对于socket流而言:
- 等待网络上的数据分组到达,然后被复制到内核的某个缓冲区;
- 把数据从内核缓冲区复制到应用进程缓冲区中;
对于IO流而言:
- 等待所有数据都准备好或者一直在等待数据,有数据的时候将数据拷贝到系统内核;
- 将内核缓存中数据拷贝到用户进程中;
————————————
再说一下Reactor模式,类似NIO
Reactor上有一个全局的管理者selector,还有用于注册感兴趣的事件的channel,selector会不断轮询channel上是否有这些事件发生,如果没有,主线程会被阻塞,如果有,则会调用相关的事件处理函数即handler也就是小线程或小过程。
一个连接来了,显示被读取线程或者handler处理了,然后再执行写入,那么之前的读取就可以被后面的请求复用,吞吐量就提高了。
Reactor:负责响应IO事件,当检测到一个新的事件,将其发送给相应的Handler去处理。
Handler:负责处理非阻塞的行为,标识系统管理的资源;同时将handler与事件绑定。
Reactor为单线程,需要处理accept连接,同时发送请求到处理器中。
由于只有单个线程,所以处理器中的业务需要能够快速处理完。
改进1:可以将事件处理采用线程池的方式,同一个类型的事件一个线程池
改进2:可以将Reactor拆分成两个,一个负责accept新的tcp连接,一个负责对建立好的连接进行处理
ServerSocketChannel ssc= ServerSocketChannel.open();//新建NIO通道
ssc.configureBlocking( false );//使通道为非阻塞
SelectionKey skey = ssc.register( selector, SelectionKey.OP_ACCEPT ); //将NIO通道选绑定到择器,当然绑定后分配的主键为skey
Set selectedKeys = selector.selectedKeys();//获取通道内关心事件的集合
Iterator it = selectedKeys.iterator();
while (it.hasNext())