一篇文字讓你明白程式與執行緒的關係

David Hongyu發表於2020-11-30

前言:

看到一個好的文章,感覺講的不錯分享一下

本章主要介紹程式與執行緒的區別與聯絡相關知識點,也是我們面試過程中,經常會問到的了一個問題。希望通過這篇文章,能讓大家理解相關知識點~

涉及面試題:

  • 1.程式與執行緒之間有什麼區別?
  • 2.程式、執行緒都各有什麼特點?
  • 3.程式之間的是怎麼進行互動的呢?
  • 4.什麼是緩衝區溢位?
  • 5.程式之間如何進行互動?
  • 6.執行緒之間如何進行互動?

1. 小栗子:

我們生活中有許許多多關於程式與執行緒的小栗子,比如:1.我們使用開啟一個微信軟體,這個時候就開啟了一個程式, 當我們在微信裡面進行各種操作(檢視朋友圈,掃一掃...),這麼多的操作就是執行緒。 所以我們可以說“程式”是包含“執行緒”的,“執行緒”是“程式”的一個子集。

來源百度百科:

程式(Process) 是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。 在當代面向執行緒設計的計算機結構中,程式是執行緒的容器。程式是指令、資料及其組織形式的描述,程式是程式的實體。是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。程式是指令、資料及其組織形式的描述,程式是程式的實體。

執行緒(thread) 是作業系統能夠進行運算排程的最小單位。它被包含在程式之中,是程式中的實際運作單位。一條執行緒指的是程式中一個單一順序的控制流,一個程式中可以併發多個執行緒,每條執行緒並行執行不同的任務。

我們簡單總結下:

程式:指在系統中正在執行的一個應用程式;程式一旦執行就是程式;程式——資源分配的最小單位。

執行緒:系統分配處理器時間資源的基本單元,或者說程式之內獨立執行的一個單元執行流。執行緒——程式執行的最小單位。

2. 深入理解:

程式

 

2.1 程式(執行緒+記憶體+檔案/網路控制程式碼)

我們通過上面的圖片進行進一步理解

“記憶體”:
我們通常所理解的記憶體是我們所見到的(2G/4G/8G/16G)實體記憶體,它為什麼會在程式之中呢?
實際上,這裡的記憶體是邏輯記憶體。指的是記憶體的定址空間。每個程式的記憶體是相互獨立的。
否則的話會出現一個問題:我們把指標的值改一改就指向其他程式的記憶體了,通過這樣我們豈不是就可以看到其他程式中"微信"或者是"網上銀行"的資訊,
這樣的話,那我們的微信聊天記錄或者是銀行賬戶的資訊就都被別人找到了,這是一個很危險的訊號!顯然這樣是不可能的。

“檔案/網路控制程式碼”:
它們是所有的程式所共有的,例如開啟同一個檔案,去搶同一個網路的埠這樣的操作是被允許的。

“執行緒”:
接下來,我們就要介紹一下我們的“執行緒”有關知識

執行緒

 

2.2 執行緒(棧+PC+TLS)

2.2.1 棧:

我們通常都是說呼叫堆疊,其實這裡的堆是沒有含義的,呼叫堆疊就是呼叫棧的意思。
那麼我們的棧裡面有什麼呢?
我們從主執行緒的入口main函式,會不斷的進行函式呼叫,
每次呼叫的時候,會把所有的引數和返回地址壓入到棧中。

2.2.2 PC:

Program Counter 程式計數器,作業系統真正執行的是一個個的執行緒,
而我們的程式只是它的一個容器。PC就是指向當前的指令,而這個指令是放在記憶體中。
每個執行緒都有一串自己的指標,去指向自己當前所在記憶體的指標。
計算機絕大部分是儲存程式性的,說的就是我們的資料和程式是儲存在同一片記憶體裡的
這個記憶體中既有我們的資料變數又有我們的程式。所以我們的PC指標就是指向我們的記憶體的

2.2.2.1 緩衝區溢位

例如我們經常聽到一個漏洞:緩衝區溢位
這是什麼意思呢?
例如:我們有個地方要輸入使用者名稱,本來是用來存資料的地方。
然後黑客把資料輸入的特別長。這個長度超出了我們給資料儲存的記憶體區,這時候跑到了
我們給程式分配的一部分記憶體中。黑客就可以通過這種辦法將他所要執行的程式碼
寫入到使用者名稱框中,來植入進來。我們的解決方法就是,用使用者名稱的長度來限制不要超過
使用者名稱的緩衝區的大小來解決。

2.3 TLS:

全稱:thread local storage
之前我們看到每個程式都有自己獨立的記憶體,這時候我們想,我們的執行緒有沒有一塊獨立的記憶體呢?答案是有的,就是TLS。
可以用來儲存我們執行緒所獨有的資料。
可以看到:執行緒才是我們作業系統所真正去執行的,而程式呢,則是像容器一樣他把需要的一些東西放在了一起,而把不需要的東西做了一層隔離,進行隔離開來。

3. 程式之間的是怎麼進行互動的呢?

通過TCP/IP的埠來實現

4. 執行緒之間又是怎樣進行互動?

執行緒的通訊就比較簡單,有一大塊共享的記憶體,只要大家的指標是同一個就可以看到各自的記憶體。

5.小結:

1.程式要分配一大部分的記憶體,而執行緒只需要分配一部分棧就可以了.
2.一個程式至少有一個程式,一個程式至少有一個執行緒.
3.程式是資源分配的最小單位,執行緒是程式執行的最小單位。
4.一個執行緒可以建立和撤銷另一個執行緒,同一個程式中的多個執行緒之間可以併發執行

 

 

 

 

相關文章