同步,异步,阻塞,非阻塞的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lovewebeye/article/details/80935098

同步异步:指的是需不需要等待返回结果;

同步:需要不断轮询数据是否准备好了,或者一直在等待数据准备好

异步:发送一个请求就立即返回,然后去干别的事情,当数据准备号了会通知进行相关处理。

(同步的实时性比较号,异步的并发性能比较号)


阻塞和非阻塞:是指需不需要阻塞线程

阻塞:当前线程不执行别的事情,一直再等待

非阻塞:当前线程可以干别事情,间隔一段时间检查一下上次的数据有没有准备好;


它们修饰的对象不一样,阻塞非阻塞,是指进程需要的数据如果未就绪,需不需要等待; 同步异步,是指数据准备好后进行访问的机制,访问数据的时候,需不需要等待IO处理完成。(同步需要等待IO完成,异步是IO完成后通知进程进行处理)


对于socket流而言:

  1. 等待网络上的数据分组到达,然后被复制到内核的某个缓冲区;
  2. 把数据从内核缓冲区复制到应用进程缓冲区中;

对于IO流而言:

  1. 等待所有数据都准备好或者一直在等待数据,有数据的时候将数据拷贝到系统内核;
  2. 将内核缓存中数据拷贝到用户进程中;

————————————

再说一下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()) 


展开阅读全文

没有更多推荐了,返回首页