程序與執行緒

2022-05-17 11:48:09 字數 3705 閱讀 9129

加入abc

三個依次執行,但是

a阻塞了

,就直接不執行a了

,直接跳過去執行b,和

c,最後在執行

a多道程式設計, 

提高了cpu

的利用率

程序:本質上就是乙個一段程式的執行過程

(抽象的概念

)執行緒:

最小的執行單元(例項

)程序:

最小的資源單位

(作業系統在分資源時

,只能分到程序這裡

)程序就相當於乙個容器,

裡面可以容納多個執行緒

程序只是把資源集中到一起,(程序只是乙個資源單位,或者說乙個資源集合),而執行緒才是cpu上的執行單位

假如有兩個程式a和b,程式a在執行到一半的過程中,需要讀取大量的資料輸入(i/o操作),

而此時cpu只能靜靜地等待任務a讀取完資料才能繼續執行,這樣就白白浪費了cpu資源。

是不是在程式a讀取資料的過程中,讓程式b去執行,當程式a讀取完資料之後,讓

程式b暫停,然後讓程式a繼續執行?

既然是切換,那麼這就涉及到了狀態的儲存,狀態的恢復,加上程式a與程式b所需要的系統資

源(記憶體,硬碟,鍵盤等等)是不一樣的。自然而然的就需要有乙個東西去記錄程式a和程式b

分別需要什麼資源,怎樣去識別程式a和程式b等等,所以就有了乙個叫程序的抽象

通俗的說就是

想象一位有一手好廚藝的計算機科學家egon正在為他的女兒元昊烘製生日蛋糕。

他有做生日蛋糕的食譜,

廚房裡有所需的原料:麵粉、雞蛋、韭菜,蒜泥等。

在這個比喻中:

做蛋糕的食譜就是程式(即用適當形式描述的演算法)

計算機科學家就是處理器(cpu)

而做蛋糕的各種原料就是輸入資料

程序就是廚師閱讀食譜、取來各種原料以及烘製蛋糕等一系列動作的總和

執行緒的出現是為了降低上下文切換的消耗,提高系統的併發性,並突破乙個程序只能幹一樣事的缺陷,

使到程序內併發成為可能。

假設,乙個文字程式,需要接受鍵盤輸入,將內容顯示在螢幕上,還需要儲存資訊到硬碟中。若只有

乙個程序,勢必造成同一時間只能幹一樣事的尷尬(當儲存時,就不能通過鍵盤輸入內容)。若有多

個程序,每個程序負責乙個任務,程序a負責接收鍵盤輸入的任務,程序b負責將內容顯示在螢幕上的

任務,程序c負責儲存內容到硬碟中的任務。這裡程序a,b,c間的協作涉及到了程序通訊問題,而且

有共同都需要擁有的東西-------文字內容,不停的切換造成效能上的損失。若有一種機制,可以使

任務a,b,c共享資源,這樣上下文切換所需要儲存和恢復的內容就少了,同時又可以減少通訊所帶

來的效能損耗,那就好了。是的,這種機制就是執行緒。

1. 多執行緒共享乙個程序的位址空間

2. 執行緒比程序更輕量級,執行緒比程序更容易建立可撤銷,在許多作業系統中,建立乙個執行緒比建立乙個程序要快10-100倍,在有大量執行緒需要動態和快速修改時,這一特性很有用

3. 若多個執行緒都是cpu密集型的,那麼並不能獲得效能上的增強,但是如果存在大量的計算和大量的i/o處理,擁有多個執行緒允許這些活動彼此重疊執行,從而會加快程式執行的速度。

4. 在多cpu系統中,為了最大限度的利用多核,可以開啟多個執行緒,比開程序開銷要小的多。(這一條並不適用於python)

併發:在同一時間間隔內執行

(指系統具有處理多個任務的能力

,cpu切換)

並行:在同一時刻執行        

(同時處理多個任務

,)關係:

並行是併發的乙個子集

2.併發和並行的區別:

所有的併發處理都有排隊等候,喚醒和執行這三個步驟,所以併發是巨集觀的觀念,在微觀上他們都是序列被處理的,只不過資源不會在某乙個上被阻塞(一般是通過時間片輪轉),所以在巨集觀上多個幾乎同時到達的請求同時在被處理。如果是同一時刻到達的請求也會根據優先順序的不同,先後進入佇列排隊等候執行。

併發與並行是兩個既相似但是卻不相同的概念:

併發性:又稱共行性,是指處理多個同時性活動的能力,。

並行:指同時發生兩個併發事件,具有併發的含義。併發不一定並行,也可以說併發事件之間不一定要同一時刻發生。 

併發的實質是乙個物理cpu(也可以是多個物理cpu)在若干個程式之間多路復用,併發性是對有限物理資源強制行使 多使用者共享以提高效率。

並行指兩個或兩個以上事件或活動在同一時刻發生,在多道程式環境下,並行使多個程式同一時刻可在不同cpu上同時執行。    

併發是在同乙個cpu上同時(不是真正的同時,而是看來是同時,因為cpu要在多個程式之間切換)執行多個程式。

並行是每乙個cpu執行乙個程式。

打個比方:併發就像乙個人(cpu)喂兩個小孩(程式)吃飯,表面上是兩個小孩在吃飯,實際是乙個人在喂。

並行就是兩個人喂兩個小孩子吃飯。 

3.併發、並行和多執行緒的關係:

並行需要兩個或兩個以上的執行緒跑在不同的處理器上,併發可以跑在乙個處理器上通過時間片進行切換。

同步與非同步

同步: 當乙個程序執行到i/o(等待外部資料)的時候,你等待:------同步

非同步:                     不等待:一直等到資料接收成功,再回來處理----非同步

同步

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

非同步的概念和同步相對。當乙個非同步功能呼叫發出後,呼叫者不能立刻得到結果。當該非同步功能完成後,通過狀態、通知或**來通知呼叫者。如果非同步功能用狀態來通知,那麼呼叫者就需要每隔一定時間檢查一次,效率就很低(有些初學多執行緒程式設計的人,總喜歡用乙個迴圈去檢查某個變數的值,這其實是一 種很嚴重的錯誤)。如果是使用通知的方式,效率則很高,因為非同步功能幾乎不需要做額外的操作。至於**函式,其實和通知沒太多區

阻塞阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(如遇到io操作)。函式只有在得到結果之後才會將阻塞的執行緒啟用。有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。

#舉例:##

2. 阻塞呼叫:當socket工作在阻塞模式的時候,如果沒有資料的情況下呼叫recv函式,則當前執行緒就會被掛起,直到有資料為止。

非阻塞#

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

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

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

同步,非同步 ,阻塞,非阻塞

程序與執行緒

程序 process 管理單元,管理分配應用程式的資料,的記憶體空間.執行緒 thread 執行單元,執行緒負責執行乙個預先編排好的 段,執行 棧是基於執行緒的.乙個應用程式啟動的時候,程序自動建立,並且會預設建立主線程,主線程負責執行main 方法.thread t new thread new ...

程序與執行緒

程序 是擁有資源的實體,包括 1。乙個程序有乙個虛擬位址空間,不同程序位於不同的 虛擬位址空間中。程序之間若要通訊,必須通過作業系統 的功能呼叫 ipc 2。程序擁有其他資源,例如開啟的檔案和i o裝置。程序結束時,作業系統會自動釋放該程序擁有的所有資源。例如,如果 open乙個檔案而不close它...

程序與執行緒

程序包括 1 私有的虛位址空間 2 可執行程式 與資料 3 開啟系統資源列表控制代碼 4 安全訪問標誌 5 程序id 6 至少有乙個執行執行緒 執行緒包括 1 一組cpu暫存器狀態 2 兩個堆疊 系統態與使用者態 3 tls 執行緒區域性儲存區 4 執行緒id 5 安全特性 因此程序是不活潑的,它從...