一篇讓你明白程序與執行緒之間的區別與聯絡
前言
歡迎關注公眾號: Coder程式設計
獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!
本章主要介紹程序與執行緒的區別與聯絡相關知識點,也是我們面試過程中,經常會問到的了一個問題。希望通過這篇文章,能讓大家理解相關知識點~
涉及面試題:
- 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.一個執行緒可以建立和撤銷另一個執行緒,同一個程序中的多個執行緒之間可以併發執行.
文末
本章節介紹了程序與執行緒之間的區別與聯絡,以及其他方面的小知識點,也是面試過程中會出現的內容點。
裡面涉及到了許多的小知識點,我們並沒有擴充套件開來講解,會放在今後的文章中做進一步的闡述。
歡迎關注公眾號: Coder程式設計
獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!