天天看點

多線程——同步-異步-阻塞-非阻塞一、同步和異步二、阻塞與非阻塞三 、混合

    呵呵,好久沒寫部落格了,今天讓我們來回顧一下多線程的一些基礎知識。

一、同步和異步

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:這類函數的工作機制是告知核心啟動某個操作,并讓核心在整個操作(包括将資料從核心拷貝到使用者空間)完成後通知我們。如圖:
多線程——同步-異步-阻塞-非阻塞一、同步和異步二、阻塞與非阻塞三 、混合

總結:

    總之,我們隻要知道阻塞和非阻塞是做事情時的狀态,是針對請求者來說的,而同步和異步是消息通信的機制,是針對被請求者來說的···········未完待續