一篇文字讓你明白程式與執行緒的關係
前言:
看到一個好的文章,感覺講的不錯分享一下
本章主要介紹程式與執行緒的區別與聯絡相關知識點,也是我們面試過程中,經常會問到的了一個問題。希望通過這篇文章,能讓大家理解相關知識點~
涉及面試題:
- 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.一個執行緒可以建立和撤銷另一個執行緒,同一個程式中的多個執行緒之間可以併發執行
相關文章
- 一篇讓你明白程式與執行緒之間的區別與聯絡執行緒
- 程式執行緒協程關係執行緒
- 執行緒與程式之間有什麼關係?Linux執行緒與程式有什麼區別?執行緒Linux
- Java程式和執行緒關係及區別Java執行緒
- 不懂 ZooKeeper?沒關係,這一篇給你講的明明白白
- 透過一個模擬程式讓你明白WCF大致的執行流程
- 執行緒的讓步與阻塞執行緒
- 一文帶你懟明白程式和執行緒通訊原理執行緒
- 執行緒、執行緒與程式、ULT與KLT執行緒
- 請教:java的子執行緒和主控執行緒之間的關係?Java執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Java多執行緒——消費者與生產者的關係Java執行緒
- 【JAVA併發第一篇】Java的程式與執行緒Java執行緒
- 掌握webpack(一)一張圖讓你明白webpack中output的filename、path、publicPath與主流外掛的關係Web
- 程式與執行緒執行緒
- 執行緒與程式執行緒
- 證明執行緒池ThreadPoolExecutor的核心執行緒數,最大執行緒數,佇列長度的關係執行緒thread佇列
- Python 多執行緒無用?深入總結 二(深入瞭解GIL 執行緒守護 執行緒程式CPU關係)Python執行緒
- 通過一個模擬程式讓你明白ASP.NET MVC是如何執行的ASP.NETMVC
- javascript執行緒及與執行緒有關的效能優化JavaScript執行緒優化
- 徹底明白Java的多執行緒-執行緒間的通訊(2)(轉)Java執行緒
- 徹底明白Java的多執行緒-執行緒間的通訊(1)(轉)Java執行緒
- Android程式框架:執行緒與執行緒池Android框架執行緒
- Java多執行緒1:程式與執行緒概述Java執行緒
- 程式與執行緒--原理執行緒
- 一篇文章讓你明白運維發展方向運維
- PHP 的多程式與執行緒PHP執行緒
- 程式與執行緒的區別執行緒
- 程式與執行緒的產生執行緒
- Android的程式與執行緒Android執行緒
- java基礎:執行緒與程式;執行緒的分工,協作,互斥;volatile關鍵字Java執行緒
- 程式和執行緒相關執行緒
- 程式設計思想之多執行緒與多程式(2):執行緒優先順序與執行緒安全程式設計執行緒
- JDK21的虛擬執行緒是什麼?和平臺執行緒什麼關係?JDK執行緒
- android程式與執行緒詳解二:執行緒Android執行緒
- 一篇文章讓你明白你多級快取的分層架構快取架構
- 執行緒與多執行緒執行緒
- 程式與執行緒區別執行緒