1. 程式人生 > 實用技巧 >vue 引入百度地圖

vue 引入百度地圖

什麼是程序

程序:正在進行的一個過程或者說一個任務。而負責執行任務則是cpu。

單核+多道,實現多個程序的併發執行

程序與程式的區別

程式僅僅只是一堆程式碼而已,而程序指的是程式的執行過程。

需要強調的是:同一個程式執行兩次,那也是兩個程序。

併發與並行

無論是並行還是併發,在使用者看來都是'同時'執行的,不管是程序還是執行緒,都只是一個任務而已,真是幹活的是cpu,cpu來做這些任務,而一個cpu同一時刻只能執行一個任務

併發:是偽並行,即看起來是同時執行。單個cpu+多道技術就可以實現併發,(並行也屬於併發)

並行:同時執行,只有具備多個cpu才能實現並行

同步\非同步and阻塞\非阻塞

同步

所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回。
按照這個定義,其實絕大多數函式都是同步呼叫。
但是一般而言,我們在說同步、非同步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。

舉例:
multiprocessing.Pool下的apply 
發起同步呼叫後,就在原地等著任務結束,根本不考慮任務是在計算還是在io阻塞
總之就是一股腦地等任務結束

非同步

非同步的概念和同步相對。
當一個非同步功能呼叫發出後,呼叫者不能立刻得到結果。
當該非同步功能完成後,通過狀態、通知或回撥來通知呼叫者。
如果非同步功能用狀態來通知,那麼呼叫者就需要每隔一定時間檢查一次,效率就很低。
如果是使用通知的方式,效率則很高,因為非同步功能幾乎不需要做額外的操作。
至於回撥函式,其實和通知沒太多區別。
舉例:
multiprocessing.Pool().apply_async() 
發起非同步呼叫後,並不會等待任務結束才返回,相反,會立即獲取一個臨時結果
(並不是最終的結果,可能是封裝好的一個物件)。

阻塞

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(如遇到io操作)。
函式只有在得到結果之後才會將阻塞的執行緒啟用。
有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。
對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。
舉例:
1. 同步呼叫:apply一個累計1億次的任務,該呼叫會一直等待,直到任務返回結果為止,但並未阻塞住(即便是被搶走cpu的執行許可權,那也是處於就緒態);
2. 阻塞呼叫:當socket工作在阻塞模式的時候,如果沒有資料的情況下呼叫recv函式,則當前執行緒就會被掛起,直到有資料為止。

非阻塞

非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前也會立刻返回,同時該函式不會阻塞當前執行緒。

小結

1. 同步與非同步針對的是函式/任務的呼叫方式:
同步就是當一個程序發起一個函式(任務)呼叫的時候,一直等到函式(任務)完成,而程序繼續處於啟用狀態。
而非同步情況下是當一個程序發起一個函式(任務)呼叫的時候,不會等函式返回,
而是繼續往下執行當,函式返回的時候通過狀態、通知、事件等方式通知程序任務完成。

2. 阻塞與非阻塞針對的是程序或執行緒:
阻塞是當請求不能滿足的時候就將程序掛起,而非阻塞則不會阻塞當前程序

程序的層次結構

無論UNIX還是windows,程序只有一個父程序,不同的是:

  1. 在UNIX中所有的程序,都是以init程序為根,組成樹形結構。父子程序共同組成一個程序組,這樣,當從鍵盤發出一個訊號時,該訊號被送給當前與鍵盤相關的程序組中的所有成員。

  2. 在windows中,沒有程序層次的概念,所有的程序都是地位相同的,唯一類似於程序層次的暗示,是在建立程序時,父程序得到一個特別的令牌(稱為控制代碼),該控制代碼可以用來控制子程序,但是父程序有權把該控制代碼傳給其他子程序,這樣就沒有層次了。