程序與執行緒雜談
今天同事突然問我執行緒與程序的關係,雖然給她解釋完,但是看她茫然的眼神,我就知道並沒有解釋清楚。
程式概述
談程序與執行緒之前,我們先談下什麼是程式,程式是為實現特定目標或解決特定問題而用計算機語言編寫命令序列的集合。說得通俗點就是你用計算機聽得懂話(程式語言)命令計算機為你做特定的事情。
程序概述
在我理解中,一個程序就是一個程式的一次執行過程,如果要專業的話來說
程序是一個具有一定獨立功能的程式在一個數據集上的一次動態執行的過程,是作業系統進行資源分配和排程的一個獨立單位,是應用程式執行的載體。程序是一種抽象的概念,從來沒有統一的標準定義。程序一般由程式,資料集合和程序控制塊三部分組成。 程式用於描述程序要完成的功能,是控制程序執行的指令集。 資料集合是程式在執行時所需要的資料和工作區;程式控制塊包含程序的描述資訊和控制資訊是程序存在的唯一標誌
例項
開啟window的工作管理員,建立一個記事本,開啟記事本,會發現在工作管理員的程序列表發現“記事本”這個程序
我們多建立3個記事本,全部開啟,觀察程序列表,會發現有四個程序正在執行
那程序是如何工作的,執行緒(小弟)就閃亮登場了,在談執行緒前,我們先總結下程式與程序的關係。
程式與程序的關係
- 一個程式可以對應多個程序,表示該程式被多次執行。
- 一個程序只能對應於一個程式,表示該程序是按照某個程式進行的一次執行過程。
執行緒
很多人好奇程序是如何做事的。事實上程序就是個大爺,是不做事的,而是吩咐別人做事,"別人"就是執行緒這位苦逼的被壓榨者,當程序要做一件事,就會開啟一個執行緒,所以我們可以得出一個結論,一個程序至少要有一個執行緒。沒有執行緒這位苦逼的勞力就沒人做事。被這麼壓榨的執行緒有一天終於爆發了,準備搞事情,農民起義。不幸的是他還沒正式行動前就失敗了。失敗的原因如下
- 執行緒不能單獨存在,必須依賴且由程序產生,它是程序的組成部分
- 程序可以有多個執行緒(多執行緒),極端情況下,至少有一條執行緒。
例項
開啟記事本,工作管理員
可以看到這個記事本的程序裡,有6個執行緒。
執行緒的生命週期
新建-->就緒-->執行-->阻塞-->死亡
上廁所
你平時去商城上廁所,準備去上廁所就是新建,上廁所要排隊,排隊就是就緒,有坑位了,輪到你了,拉屎就是執行,你拉完屎發現沒有手紙,要等待別人給你送紙過來,這個狀態就是阻塞,等你上完廁所出來,上廁所這件事情結束了就是死亡狀態了。
注意:便祕也是阻塞狀態,你便祕太久了,別人等不及了,把你趕走,這個就是掛起,還有一種情況,你便祕了,別人等不及了,跟你說你先出去醞釀一下,5分鐘後再過來拉屎,這就是睡眠
多執行緒
很多人有這樣的體驗,開啟瀏覽器,一邊寫部落格,一邊聽歌,我們必須開啟兩個網頁。一個用來寫作,一個聽歌曲,現在瀏覽器有兩種處理方案,一種先執行聽歌任務,播放任務結束後,在執行寫作任務。如果按這種方式執行,寫部落格的想砸電腦的心都有了,另一種就是多執行緒執行,
瀏覽器開啟兩個執行緒,一個執行緒負責播放音樂任務,一個執行緒開啟部落格寫作,相當於並行處理兩個任務。但這裡的並行有時候並不是真正的的並行,而是將CPU分片, 每一片的單位是0.001秒,兩個執行緒輪番佔用CPU的時間,最終在2個執行緒優先順序相同的情況下,會各佔用CPU 0.5秒的時間。但因為這個切換太快了,使用者是根本感覺不到的。但這種機制並不是真正的並行。
- 為了更好的利用cpu的資源,如果只有一個執行緒,則第二個任務必須等到第一個任務結束後才能進行,如果使用多執行緒則在主執行緒執行任務的同時可以執行其他任務,而不需要等待。
- 程序之間不能共享資料,執行緒可以。
- 系統建立程序需要為該程序重新分配系統資源,建立執行緒代價比較小。
總結
程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。