解讀進程與線程區別、進程間通信

解讀進程與線程區別、進程間通信

把簡單的問題回答得不簡單,謂之深度

01 前言


記得大學學習操作系統的時候,心裏就想着這是啥子東西,然後面試的時候我們就想着爲啥我沒有學過這東西。當你確定好方向之後一般就很少去關注方向之外的東西,就比如我選擇了前端開發,就很少關注操作系統和計算機基礎的東西,但是面試卻常考這些似乎比較偏僻的知識點。

我們常說一面面試會考你基礎,這個基礎可不是你方向的基礎知識,而是接近底層的計算機基礎。我記得第一次面試的時候就是百度的面試官,沒有過多問我前端方向的知識,而是問我計算機的尋址方式,操作系統的I/O操作。說實話那些沒有好好複習真的不會。所以我們對基礎的東西一定要好好準備,說不定哪一天的用上了。
在這裏插入圖片描述

02 進程與線程


進程是系統進行資源分配和調度的一個單位,是操作系統結構的基礎;線程是CPU調度和分配的基本單位,它包含於進程中,是進程中實際運作的單位。一個進程可以包含多個線程,分別執行不同的任務。

進程和線程的區別

  • 定義方面:進程是程序在某個數據集合上的一次運行活動;線程是進程中的一個執行路徑。(進程可以創建多個線程)
  • 角色方面:在支持線程機制的系統中,進程是系統資源分配的單位,線程是CPU調度的單位。
  • 資源共享方面:進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧和棧指針,程序計數器等寄存器。
  • 獨立性方面:進程有自己獨立的地址空間,而線程沒有,線程必須依賴於進程而存在。
  • 開銷方面。進程切換的開銷較大。線程相對較小。

阮一峯老師在博客中寫到:計算機就是一個巨大的工廠,工廠內有很多車間,但是電力只能每次供給一個車間。也就是說單個CPU一次只能執行一個任務。而進程就是一個車間,裏面有很多工人負責不同的任務,就是線程。

車間的空間是工人共享的,這就表明了線程共享所在進程的地址空間和資源。但是進程中某些資源是不能同時共享的,比如衛生間一次只能進一個人,當該資源正在使用時其他線程就不能使用。
在這裏插入圖片描述

爲什麼要引入線程呢?

  • **應用的需要:**比如打開一個瀏覽器,我想一邊瀏覽網頁,一邊下載文件,一邊播放音樂。如果一個瀏覽器是一個進程,那麼這樣的需求需要線程機制。
  • **開銷的考慮:**在進程內創建、終止線程比創建、終止進程要快。同一進程內的線程間切換比進程間的切換要快,尤其是用戶級線程間的切換。線程之間相互通信無須通過內核(同一進程內的線程共享內存和文件)
  • **性能的考慮:**多個線程中,任務功能不同(有的負責計算,有的負責I/O),如果有多個處理器,一個進程就可以有很多的任務同時在執行。

03 進程通信


既然計算機是一個巨大的工廠,那麼車間之間肯定要產生通信的情況。依照這種想法,那在車間之間開闢一個通道即可,這就是管道通信。

每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數據必須通過內核,在內核中開闢一塊緩衝區,進程A把數據從用戶空間拷到內核緩衝區,進程B再從內核緩衝區把數據讀走,內核提供的這種機制稱爲進程間通信。管道通信是半雙工通信,數據只能單向流動。

1、管道通信
在這裏插入圖片描述

2、共享內存通信

共享內存就是允許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞數據的一種非常有效的方式。不同進程之間共享的內存通常安排爲同一段物理內存。

進程可以將同一段共享內存連接到它們自己的地址空間中,所有進程都可以訪問共享內存中的地址。但是並未提供同步機制,需要藉助信號量來限制訪問,不然會導致數據混亂。
在這裏插入圖片描述

3、消息隊列通信

消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。每個數據塊都被認爲含有一個類型,接收進程可以獨立地接收含有不同類型的數據結構。我們可以通過發送消息來避免命名管道的同步和阻塞問題。
在這裏插入圖片描述

4、信號量通信

爲了防止出現因多個程序同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有一個執行線程訪問代碼的臨界區域。

臨界區域是指執行數據更新的代碼需要獨佔式地執行。而信號量就可以提供這樣的一種訪問機制,讓一個臨界區同一時間只有一個線程在訪問它,也就是說信號量是用來協調進程對共享資源的訪問的。

由於信號量只能進行兩種操作等待和發送信號,即P(sv)和V(sv),他們的行爲是這樣的:

P(sv):如果sv的值大於零,就給它減1;如果它的值爲零,就掛起該進程的執行。

V(sv):如果有其他進程因等待sv而被掛起,就讓它恢復運行,如果沒有進程因等待sv而掛起,就給它加1。

舉個例子,就是兩個進程共享信號量sv,一旦其中一個進程執行了P(sv)操作,它將得到信號量,並可以進入臨界區,使sv減1。而第二個進程將被阻止進入臨界區,因爲當它試圖執行P(sv)時,sv爲0,它會被掛起以等待第一個進程離開臨界區域並執行V(sv)釋放信號量,這時第二個進程就可以恢復執行。
在這裏插入圖片描述

5、Socket通信

在同一臺計算機,進程之間上面提到的通信,如果是不同的計算機呢?網絡上不同的計算機,也可以通信,那麼就得使用網絡套接字(socket)。socket就是在不同計算機之間進行通信的一個抽象。它工作於TCP/IP協議中應用層和傳輸層之間的一個抽象。
在這裏插入圖片描述

客戶端的過程比較簡單,創建 Socket,連接服務器,將 Socket 與遠程主機連接,發送數據,讀取響應數據,直到數據交換完畢,關閉連接,結束 TCP 對話。

服務端先初始化 Socket,建立流式套接字,與本機地址及端口進行綁定,然後通知 TCP,等待來自客戶端的連接。如果這時客戶端與服務器建立了連接,客戶端發送數據請求,服務器接收請求並處理請求,然後把響應數據發送給客戶端,客戶端讀取數據,直到數據交換完畢。最後關閉連接,交互結束。

04 小結


作爲前端很有必要了解一下網絡方面的知識,這也是計算機通用的基礎。無論互聯網還是內網,通信都是要經過連接後才能進行通信。對每一個知識背後的原理了解清楚,解決問題的能力就多一點。

參考文章

  • 阮一峯 進程與線程的一個簡單解釋
  • Socket通信原理
  • 進程間通信8種方式詳解
  • 進程與線程的區別

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章