天天看點

程序和線程、單線程、多線程和多程序程序和線程單線程和多線程多線程和多程序

歡迎學習交流!!!

持續更新中…

文章目錄

  • 程序和線程
    • 理論知識
    • 二者差別
  • 單線程和多線程
  • 多線程和多程序

程序和線程

       由于理論概念難以了解,我在查資料的過程中經常能看到這樣一個形象的比喻:

程序 == 火車,線程 == 車廂

  • 線程在程序下行進(單純的車廂無法運作)
  • 一個程序可以包含多個線程(一輛火車可以有多個車廂)
  • 不同程序間資料很難共享(一輛火車上的乘客很難換到另外一輛火車,比如站點換乘)
  • 同一程序下不同線程間資料很易共享(A車廂換到B車廂很容易)
  • 程序要比線程消耗更多的計算機資源(采用多列火車相比多個車廂更耗資源)
  • 程序間不會互相影響,一個線程挂掉将導緻整個程序挂掉(一列火車不會影響到另外一列火車,但是如果一列火車上中間的一節車廂着火了,将影響到所有車廂)
  • 程序可以拓展到多機,程序最多适合多核(不同火車可以開在多個軌道上,同一火車的車廂不能在行進的不同的軌道上)
  • 程序使用的記憶體位址可以上鎖,即一個線程使用某些共享記憶體時,其他線程必須等它結束,才能使用這一塊記憶體。(比如火車上的洗手間)-“互斥鎖”
  • 程序使用的記憶體位址可以限定使用量(比如火車上的餐廳,最多隻允許多少人進入,如果滿了需要在門口等,等有人出來了才能進去)-“信号量”
除此之外,也可以看一下阮一峰大神的一篇部落格:程序與線程的一個簡單解釋,大神用圖解釋地十厘清楚,他将程序和線程比喻成工廠和勞工的關系
程式和線程、單線程、多線程和多程式程式和線程單線程和多線程多線程和多程式

在任務管理器中可以檢視自己電腦目前的程序:

程式和線程、單線程、多線程和多程式程式和線程單線程和多線程多線程和多程式

理論知識

       程序是資源(CPU、記憶體等)配置設定的基本/最小機關,具有一定獨立功能的程式關于某個資料集合上的一次運作活動。系統由一個個程序(程式)組成,一般情況下,包括文本區域(text region)、資料區域(data region)和堆棧(stack region)。
  • 文本區域存儲處理器執行的代碼
  • 資料區域存儲變量和程序執行期間使用的動态配置設定的記憶體;
  • 堆棧區域存儲着活動過程調用的指令和本地變量。

       是以程序的建立和銷毀都是相對于系統資源,是以是一種比較昂貴的操作。程序有三個狀态:

  • 等待态:等待某個事件的完成;
  • 就緒态:等待系統配置設定處理器以便運作;
  • 運作态:占有處理器正在運作。

       程序是搶占式的争奪CPU運作自身,而CPU單核的情況下同一時間隻能執行一個程序的代碼,但是多程序的實作則是通過CPU飛快的切換不同程序,是以使得看上去就像是多個程序在同時進行。

通信問題:由于程序間是隔離的,各自擁有自己的記憶體記憶體資源,是以相對于線程比較安全, 是以不同程序之間的資料隻能通過 IPC(Inter-Process Communication) 進行通信共享。

       線程是程序的一個實體,是獨立運作和獨立排程的基本機關(CPU上真正運作的是線程)。線程自己基本上不擁有系統資源,隻擁有一點在運作中必不可少的資源(如程式計數器,一組寄存器和棧),但是它可與同屬一個程序的其他的線程共享程序所擁有的全部資源。
  • 線程屬于程序
  • 線程共享程序的記憶體位址空間
  • 線程幾乎不占有系統資源

通信問題:程序相當于一個容器,而線程而是運作在容器裡面的,是以對于容器内的東西,線程是共同享有的,是以線程間的通信可以直接通過全局變量進行通信,但是由此帶來的例如多個線程讀寫同一個位址變量的時候則将帶來不可預期的後果,是以這時候引入了各種鎖的作用,例如互斥鎖等。

       同時多線程是不安全的,當一個線程崩潰了,會導緻整個程序也崩潰了,即其他線程也崩潰,但多程序而不會,一個程序崩潰了,另一個程序依然照樣運作。

二者差別

  • 程序是資源配置設定的基本機關;線程是程式執行/CPU調動的基本機關。
  • 程序擁有自己的資源空間,沒啟動一個程序,系統就會為它配置設定位址空間;而線程與CPU資源配置設定無關,多個線程共享同一程序内的資源,使用相同的位址空間。
  • 一個程序可以包含若幹個線程。
  • 由于預設程序内隻有一個線程,是以多核CPU處理多程序就像是一個程序一個核心

優劣:

  • 線程之間的通信更友善,同一程序下的線程共享全局變量、靜态變量等資料,而程序之間的通信需要以通信的方式(Inter Process Communication,IPC)進行。不過如何處理好同步與互斥是編寫多線程程式的難點。
  • 線程的排程與切換比程序快很多,同時建立一個線程的開銷也比程序要小很多。
  • 但是多程序程式更健壯,多線程程式隻要有一個線程死掉,整個程序也死掉了,而一個程序死掉并不會對另外一個程序造成影響,因為程序有自己獨立的位址空間。

單線程和多線程

單線程就是一個程序隻開一個線程。

       Javascript 就是屬于單線程,程式順序執行(這裡暫且不提JS異步),可以想象一下隊列,前面一個執行完之後,後面才可以執行,當在使用單線程語言編碼時切勿有過多耗時的同步操作,否則線程會造成阻塞,導緻後續響應無法處理。

       如果采用 Javascript 進行編碼時候,應可能的利用Javascript異步操作的特性。

       單線程處理是指一個程序中隻能有一個線程,其他線程必須等待目前線程執行結束後才能執行。例如,DOS 作業系統就是一個典型的單任務處理,同一時刻隻能進行一項操作。其缺點在于系統完成一個很小的任務都必須占用很長的時間。

       如果遇到大量的資料和過于狹窄的資訊通道,最好的解決方案就是安排更多的線程,也就是「多線程」政策。

       多線程處理是指将一個程序分為幾部分,由多個線程同時獨立完成,進而最大限度地利用 CPU 和使用者的時間,提高系統的效率。

       例如,在執行複制大檔案操作時,系統一方面在進行磁盤的讀寫操作,同時還會顯示一個不斷變化的進度條,這兩個動作是在不同線程中完成的,但給使用者的感受就像兩個動作是同時進行的。

       對比單線程,多線程的優點是執行速度快,同時降低了系統負荷;但其缺點也不容忽略,使用多線程的應用程式一般比較複雜,有時甚至會使應用程式的運作速度變得緩慢,因為開發人員必須提供線程的同步,以保證線程不會并發地請求相同的資源,導緻競争情況的發生。是以要合理地使用多線程處理技術。

多線程和多程序

多線程:是指程式中包含多個執行流,即在一個程式中可以同時運作多個不同的線程來執行不同的任務,也就是說允許單個程式建立多個并行執行的線程來完成各自的任務。

多程序:多程序指的是在同一個時間裡,同一個計算機系統中如果允許兩個或兩個以上的程序處于運作狀态。多程序帶來的好處是明顯的,比如可以聽歌的同時,打開編輯器敲代碼,編輯器和聽歌軟體的程序之間絲毫不會互相幹擾。

作業系統的設計,可以歸納為三點:

  1. 以多程序形式,允許多個任務同時運作;
  2. 以多線程形式,允許單個任務分成不同的部分運作;
  3. 提供協調機制,一方面防止程序之間和線程之間的沖突,另一方面允許程序之間和線程之間共享資源。
優秀文章引用:程序、線程和協程的概念