多线程——同步-异步-阻塞-非阻塞
Posted 小兀哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程——同步-异步-阻塞-非阻塞相关的知识,希望对你有一定的参考价值。
呵呵,好久没写博客了,今天让我们来回顾一下多线程的一些基础知识。
一、同步和异步
1、同步(synchronous)
所谓同步,就是在让请求别人做一件事情时,在没有得到最终结果之前,就需要耐心等待,不能做其他事情,直到结果出来后,才会结束。
2、异步(asynchronous)
所谓异步,就是在让请求别人做一件事情时,不需要关心正在结果,直接告诉你一个情况(例如,他接收到了),当这件事情有结果时,他会通过回调通知你最终事情的结果。
3、比较
二、阻塞与非阻塞
1、阻塞(Blocking)
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
2、非阻塞(Non-Blocking)
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
3、比较
同步和异步关注的是消息通信机制。
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
4、例子
同步与异步
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
阻塞与非阻塞
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
注: 在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。
三 、混合
1、组合
______阻塞__________非阻塞_
同步 | 同步阻塞 同步非阻塞
异步 | 异步阻塞 异步非阻塞
2、模型
阻塞式I/O模型:默认情况下,所有套接字都是阻塞的。怎么理解?先理解这么个流程,一个输入操作通常包括两个不同阶段:(1)等待数据准备好;(2)从内核向进程复制数据。对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所有等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。 好,下面我们以阻塞套接字的recvfrom的的调用图来说明阻塞
标红的这部分过程就是阻塞,直到阻塞结束recvfrom才能返回。
非阻塞式I/O: 以下这句话很重要:进程把一个套接字设置成非阻塞是在通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把进程投入睡眠,而是返回一个错误。看看非阻塞的套接字的recvfrom操作如何进行
可以看出recvfrom总是立即返回。
I/O多路复用:虽然I/O多路复用的函数也是阻塞的,但是其与以上两种还是有不同的,I/O多路复用是阻塞在select,epoll这样的系统调用之上,而没有阻塞在真正的I/O系统调用如recvfrom之上。
信号驱动式I/O:用的很少,就不做讲解了。
异步I/O:这类函数的工作机制是告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到用户空间)完成后通知我们。如图:
总结:
总之,我们只要知道阻塞和非阻塞是做事情时的状态,是针对请求者来说的,而同步和异步是消息通信的机制,是针对被请求者来说的···········未完待续
以上是关于多线程——同步-异步-阻塞-非阻塞的主要内容,如果未能解决你的问题,请参考以下文章