程序與執行緒

2021-09-25 10:25:39 字數 1899 閱讀 4937

乙個例子:

比如挖乙個隧道,有2種開工方法

1、單執行緒:只在山的一頭挖,直至挖到山的另一頭,從而打通隧道;

2、多執行緒:在山的兩頭挖,「同時」開工,最後在山的中間接通,從而打通隧道,這感覺肯定比1快了很多。

如果2是多執行緒,我們則只有乙個工人,就像我們的計算機中一般來說只有乙個cpu一樣。所以多執行緒不過是cpu在不同的時間片之間切換,而表現出齊頭並進的樣子。

既然挖隧道的人只有乙個,雖然我的施工方案是在山的兩頭開挖,但是由於工作的人只有乙個,所以只有讓這個人在山的兩頭跑,挖一會這頭再去挖另一頭,來回跑是要花費額外時間的(好比執行緒的切換和排程)。

那麼,我們是不是可以說,在單cpu的機器中,多執行緒反而降低了效率呢?

1.不能一概而論。在單cpu系統,比如有io等待,如果在io等待的時候,可以去做一些別的事情,避免等待的時候什麼也做不了,那多執行緒的確能提高效率;

2.現在的程式時間大多花在讀取資料上,真正的計算工作花時間還是相對少的,因此cpu很大時間表現都很閒,就像挖土效率高,運土效率低。不能因為這邊的土沒有運走,而工人就要停止挖土,多執行緒就是要充分利用它的挖土效率。

3.pc機不光只乙個cpu,cpu和其它硬體裝置一起才能完成計算,分工協作,但可能出現其中某個傢伙偷懶或效率低,導致大家都等它,閒著的其它裝置這個時候可以騰出手來幹其它活。單cpu在同一時刻只能幹一件事情,這沒有問題,問題是它並不是7243600都在幹活,其它裝置也是同樣的道理,多執行緒的目的可以最大限度的提高硬體裝置的利用率。

4.同乙個裝置可以同時(並行,互不影響)幹幾件事情,但同乙個裝置在同一時刻肯定只能幹一件事情,一般我們說並行或序列,都以時間段來看的而不是以時間點來看的,比如你一邊消遣還一邊寫**幹活,在一定的時間範圍內,你是並行的,但如果這個時間範圍劃分得非常非常短,那麼是序列的。

5.乙個cpu可以多執行緒。但是乙個單核的cpu任何時間點,都只能在做乙個任務。

所以如果只是像挖隧道這麼簡單的挖,那麼多執行緒的確沒用。

只不過很可惜,計算機不像拿鐵鍬挖隧道這麼簡單。

假設每挖5分鐘,就需要清理一下挖出來的石土。有乙個小車在清理它們。

工人只有乙個。

單執行緒的做法是: 挖5分鐘。然後工人停止挖,小車清理石土的5分鐘裡,工人在等待。

2個執行緒的做發是: 挖5分鐘,小車來清理石土。這5分鐘裡,工人在另一頭挖。

也不是很恰當的比喻。不過至少能說明點問題。

小車清理石土和工人挖土,就相當於磁碟io等待和cpu計算來的關係。所以工人不會等待小車清理完石土再挖土,cpu不會等著io的完成,而是去執行另乙個程序的計算任務。

so,多執行緒就好比乙個人,在等待水開的同時看報紙,而不是等水開了之後再開始看報紙。多執行緒是為了同步完成多項任務,不是為了提高執行效率,而是為了提高資源使用效率來提高系統的效率

燒開水、看報紙就好比有乙個操作耗時,但是又不想讓這個耗時操作影響使用者體驗,這種場景的多執行緒並不是想提公升效率。android開發很多這種場景,比如從網路上拿資料的時候不想讓介面停滯,所以一般都開個執行緒去做。這種需求並不是為了提公升效率,再加上排程時間, 如果是單核cpu,效率肯定是下降的。但是效率不能單從cpu滿載的角度考慮,還得考慮業務,這種方式是不是提公升了業務的效率,多執行緒模組在系統當中扮演的角色是怎樣的,效率不能執著於執行程式的效率。

同理,多程序可以理解為,在山的兩頭挖,有兩個人或者兩個以上的人同時開工,最後在山的中間接通,從而打通隧道。

多程序在一台計算機系統中使用兩個或多個cpu單元。 通過利用計算機系統中可用的全部cpu核心。

多執行緒這是cpu通過同時執行多個執行緒來管理作業系統使用的能力。 多執行緒的主要思想是通過將程序分成多個執行緒來實現並行性。

參考:

[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 安全特性 因此程序是不活潑的,它從...