(转)异步与非阻塞之间的区别(看到的最清晰的说明)

Asynchronous I/O, or non-blocking I/O, is a form of input/output processing that permits other processing to continue before the transmission has finished

非阻塞不一定做到异步。非阻塞只是意味着方法调用不阻塞,但是通过事件通知的方式给调用线程一个机会去完成。它的逻辑是“等可以读(写)了告诉你”。这意味着工作的完成者仍然是调用者(线程)。

而异步不只是意味着方法调用不阻塞,它还意味着工作的完成已经转移到别的线程。意思是,只要你把工作交给了我,工作就“交”给了我。也许你会传个回调函数给我,但是函数的调用仍然是由“我”来完成的。你在发出调用以后,不再需要任何的工作。调用发出了,你的工作就完成了。我的工作开始了。工作转移到我这边。我是下一步。你可以接下去做别的工作。

它的逻辑是“我做完了 告诉/不告诉 你”。它与非阻塞的区别在于:“做完了”。能力来源当然是后台的线程机制。

这种机制,使用起来其实需要相当小心,因为它在现有程序以外自作主张地新开了线程。这显然将影响整个的运行时计划。API不应该拥有执行自己的能力,它们只应该拥有一种能力那就是:被调用!

但是无论如何,它提供了一种真正可能的异步工作模式:你做你的事情,我做我的事情。我们通过一定的通信手段进行合作。合作流程非常清晰。

如果说在异步IO以前,所有的程序必须自行处理IO问题。那么,有了异步IO,程序就彻底从IO的负担中解脱出来了:1,I/O工作被彻底从原有线程中分离出去。原有线程在I/O工作中除了把I/O目的告诉异步I/O API,它不需要做任何额外的工作(为了完成原有的I/O任务);2,I/O工作在独立的线程中完成,不管它有或可能产生任何问题,这种问题也不可能POP UP到调用者线程即代码中去。调用者线程甚至不需要去捕捉任何I/O异常!

问题是:I/O在应用程序中究竟处于或应该处于什么地位?意思是,它是一级公民,还是二级公民?因为为I/O工作启动单独的线程显然意味着它已经处于与程序的其它部分同等重要的地位。

这个问题的核心其实是:对应于两个级别,I/O其实对应的只是两种工作方式:1,被调用;2,被升华成线程。

两者的区别是什么?

把处理器虚拟化的话,调用与线程其实都只不过是处理器所执行的一些代码而已。不管是调用还是线程,其实都是发生在同一个地方:进程内存空间。调用是一种代码协作手段,线程是另一种代码协作手段。只不过第一,线程中的个体,比调用中的个体,传统上的看法,级别要更“高”一些。因为调用者本身其实也是被线程所调用的。因此,一切都可以被看成是被线程所调用的。但是现在I/O变成了单独的线程,它摇身一变,从被调用的代码变成了调用的主宰者。第二,调用是一种纵向的协作模式,线程是一种横向的协作模式。

从工作内容的特性上面看,I/O的确是一种与众不同的工作。它被分出来,是正确的选择。事实上,在进行线程设计的时候,所根据的一个主要划分原则就是工作内容的不同。比如,UI线程经常是与其它线程独立的。

。。。

该如何利用线程?线程到底是什么东西?最终的一切,我觉得还是为了本地性能的最大化。当然有时候性能最大化跟用户目标会有冲突,但基本上,在大部分时候,如果达到了性能的最大化,也就达到了服务性能的提高。也就达到了用户体验的提高。

目前还没有看到这方面的冲突。



还看到一个简明扼要阐述区别的说明: 
同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。

阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。

阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。(不是存在同步非阻塞和异步阻塞这两种情况吗?

时间: 2024-11-08 04:22:12

(转)异步与非阻塞之间的区别(看到的最清晰的说明)的相关文章

异步和非阻塞之间的区别

看了不少关于阻塞.非阻塞.同步和异步文章,我觉得这篇http://www.toxingwang.com/linux-unix/linux-basic/1712.html是讲得不错的. 以下是这篇文章对于阻塞.非阻塞.同步异步的解释 阻塞和非阻塞指的是执行一个操作是等操作结束再返回,还是马上返回. 比如餐馆的服务员为用户点菜,当有用户点完菜后,服务员将菜单给后台厨师,此时有两种方式: 第一种:就在出菜窗口等待,直到厨师炒完菜后将菜送到窗口,然后服务员再将菜送到用户手中: 第二种:等一会再到窗口来问

Java千百问_01基本概念(015)_阻塞、非阻塞有什么区别

点击进入_更多_Java千百问 1.阻塞.非阻塞有什么区别 在进行网络编程时,我们通常会看到同步.异步.阻塞.非阻塞四种调用方式以及他们的组合. 了解同步.异步看这里:同步.异步有什么区别 其中阻塞方式. 非阻塞方式主要是针对服务端(server)的,具体如下: 阻塞(Block) 阻塞调用是指调用结果返回之前,当前线程会被挂起.挂起即线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行. 了解线程的状态看这里:线程的状态有哪些 阻塞调用会让线程一直进行等待,当调用没有

同步与阻塞,异步与非阻塞的区别(转)

https://www.cnblogs.com/-900401/p/4015048.html 很受益的一篇文章,特别是后面对四种模型的解析. 理解阻塞和非阻塞,同步异步,有一个核心点要搞清楚就是用户发起内核调用的时候,内核处理分两个阶段:一是准备数据,二是把数据拷贝到用户态内存. 可以近似把内核处理IO操作和用户态线程执行看成是并行(近似看成并行,而不是并发,好理解一些),所以在非阻塞情况下,内核准备数据期间不会影响用户态线程的执行的. 在进行I/O操作的时候,是将任务交给DMA来处理,请求发出

阻塞IO、非阻塞IO的区别

1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合. 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值. 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现. 3)继承 即 泛化(实线加空心三角形,从子类指向父类):表示一个类与另一个类之间的继承关系: 4)关联(实线):一个类是另一个类的成员变量. 5)聚合(菱形加实线):整体和部分的关系.不太紧密的(如:汽车与发动机,汽车可以选择各种型号的发动机) 6)组合(实心菱形加实线):生命体整体与部分的关系.紧密的关系

Verilog HDL中阻塞语句和非阻塞语句的区别

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情.而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:1.阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要2.非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序3.在assign的结构中,必须使用的是阻塞赋值 下面给出实例来说

网络编程中阻塞和非阻塞socket的区别

阻塞socket和非阻塞socket 建立连接阻塞方式下,connect首先发送SYN请求道服务器,当客户端收到服务器返回的SYN的确认时,则connect返回.否则的话一直阻塞.非阻塞方式,connect将启用TCP协议的三次握手,但是connect函数并不等待连接建立好才返回,而是立即返回.返回的错误码为EINPROGRESS,表示正在进行某种过程. 接收连接对于阻塞方式的倾听socket,accept在连接队列中没有建立好的连接时将阻塞,直到有可用的连接,才返回.非阻塞倾听socket,在

tornado异步请求非阻塞-乾颐堂

前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了.比如最近发现一个事情:某网站打开页面很慢,服务器cpu/内存都正常.网络状态也良好. 后来发现,打开页面会有很多请求后端数据库的访问,有一个mongodb的数据库业务api的rest服务.但是它的tornado却用错了,一步步的来研究问题: 说明 以下的例子都有2个url,一个是耗时的请求,一个是可以或者说需要立刻返回的请求,我想就算一个对技术不熟,从道理上来说的用户,

tornado异步请求非阻塞

前言也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了 比如最近发现一个事情:某网 前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了.比如最近发现一个事情:某网站打开页面很慢,服务器cpu/内存都正常.网络状态也良好. 后来发现,打开页面会有很多请求后端数据库的访问,有一个mongodb的数据库业务api的rest服务.但是它的tornado却用错了,一

描述同步和异步,说说它们之间的区别。

参考答案: 首先,我们要明确一点,同步和异步都是在线程中使用的.在iOS开发中,比如网络请求数据时,若使用同步请求,则只有请求成功或者请求失败得到响应返回后,才能继续往下走,也就是才能访问其它资源(会阻塞了线程).网络请求数据异步请求时,不会阻塞线程,在调用请求后,可以继续往下执行,而不用等请求有结果才能继续. 区别: 线程同步:是多个线程访问同一资源时,只有当前正在访问的线程访问结束之后,其他线程才能开始访问(被阻塞). 线程异步:是多个线程在访问竞争资源时,可以在空闲等待时去访问其它资源(不