一篇讓你明白進程與線程之間的區別與聯繫

前言

歡迎關注公衆號:Coder編程 獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!git

本章主要介紹進程與線程的區別與聯繫相關知識點,也是咱們面試過程當中,常常會問到的了一個問題。但願經過這篇文章,能讓你們理解相關知識點~github

涉及面試題:面試

  • 1.進程與線程之間有什麼區別?
  • 2.進程、線程都各有什麼特色?
  • 3.進程之間的是怎麼進行交互的呢?
  • 4.什麼是緩衝區溢出?
  • 5.進程之間如何進行交互?
  • 6.線程之間如何進行交互?

上面的面試題能夠看出,其實都是一回事,只是換了一種提問方式,只要咱們能掌握核心要點,隨便面試官怎麼提問,咱們都能輕鬆應對!編程

1. 小栗子:

咱們生活中有許許多多關於進程與線程的小栗子,好比:1.咱們使用打開一個微信軟件,這個時候就開啓了一個進程,
當咱們在微信裏面進行各類操做(查看朋友圈,掃一掃...),這麼多的操做就是線程。
因此咱們能夠說「進程」是包含「線程」的,「線程」是「進程」的一個子集。
複製代碼

來源百度百科:微信

進程(Process) 是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。 在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。程序是指令、數據及其組織形式的描述,進程是程序的實體。網絡

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

咱們簡單總結下:函數

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

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

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編程 獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!

Github我的目錄

Gitee我的目錄

歡迎關注並Satr~

微信公衆號
相關文章
相關標籤/搜索