圖解進程線程、互斥鎖與信號量-看完不懂你來打我

在上學的時候,老師講到進程與線程的時候多是這樣講的:vue

  • 進程是一個具備必定獨立功能的程序在一個數據集上的一次動態執行的過程,是操做系統進行資源分配和調度的一個獨立單元,是應用程序運行的載體。
  • 線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程能夠有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。

那個時候爲了考試我都背下來了,可是內心想說:what?這都是些什麼東西? 下面讓我來試着用更通俗的語言來給你說說進程、線程、互斥鎖、信號量的那些事。算法

1、房子與居住者

咱們能夠將本身平時住的房子類比爲一個進程,每個房間及其佔用者比喻爲一個線程。房子自己並不會作任何的事情,可是線程是房子裏面每個活躍的人,他們平時洗衣、作飯、看電視……,就像線程執行本身的代碼同樣在運行着。spring

單線程
單線程就是一個叫作「進程」的房子裏面,只住了你一我的,你能夠在這個房子裏面任什麼時候間去作任何的事情。你是看電視、仍是玩電腦,全都有你本身說的算。想幹什麼幹什麼,想什麼時間作什麼就什麼時間作什麼。編程

多線程
可是若是你處在一個「多人」的房子裏面,每一個房子裏面都有叫作「線程」的住戶:線程一、線程二、線程三、線程4,狀況就不得不發生變化了。假如這些線程是你的老婆、孩子、父母。後端

  • 父母老人午睡的時候你不能開音響
  • 老婆要看「甄嬛傳」,你就不能看球賽
  • 孩子沒睡覺,你就別想看書
  • ……

多線程出現這些問題的根本緣由在於」共享資源「:時間、電視、廁所、廚房……等等。那咱們下面來看看,如何處理協調使用這些"共享資源"?springboot

2、鎖(互斥鎖)

在多線程編程中有」鎖」的概念,在你的房子裏面也有鎖。若是你的老婆在上廁所並鎖上門,她就是在獨享這個「房子(進程)」裏面的公共資源「衛生間」,若是你的家裏只有這一個衛生間,你做爲另一個線程就只能先等待。多線程

線程對鎖的佔用是有優先級的,就像在你的家裏也有優先級。當你家只有一個衛生間的時候,孩子、老婆、你同時要去上廁所,一般來講 你的優先級是1,你老婆的優先級是100,你孩子的優先級是255。須要說明的是:數值越小優先級越低。可是不一樣的狀況下會有不一樣的優先級調度算法,關鍵核心因子是優先級設置與等待時間,若是你確實等待了很長時間,老婆孩子可能看你快憋不住了,讓你先去使用洗手間也是能夠的。前後端分離

3、信號量

如今讓咱們從衛生間走入廚房,首先咱們要明確的一點是:廚房裏面能夠有一我的,也能夠有多我的。
那咱們怎麼控制使用「廚房」這個公共資源的人數(線程數)?一個比較好的方法就是使用信號量。微服務

「信號量」在編程術語中使用單詞semaphore,那什麼是「信號量」?信號量就比如你家廚房入口架子上擺了三把鍋:spa

  • 若是你的孩子熱奶拿走一把,你的老婆熱湯拿走一把,你的媽媽作菜拿走一把,你想煮麪條就沒有鍋了。當你看到這種狀況,你就不會進入廚房了,也就說廚房按照「鍋的數量」做爲信號量,只能容納三我的(線程)。
  • 當你的老婆熱完湯以後,把鍋從新放回架子上,你就能夠去得到一個鍋,你就能夠進入廚房了。

因此說:當信號量總數爲1的時候,也就是你家只有一把鍋,此時信號量做用就等同於互斥鎖。

4、專業點好麼

來一張專業點的圖,別讓您誤會我是講故事的。講技術,我但是認真的!

歡迎關注個人博客,裏面有不少精品合集

  • 本文轉載註明出處(必須帶鏈接,不能只轉文字):字母哥博客

以爲對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創做動力! 。另外,筆者最近一段時間輸出了以下的精品內容,期待您的關注。

相關文章
相關標籤/搜索