這是我在畢業(yè)時校招阿里系公司時,終面的面試官問我印象最深的一道題,別問,問就是掛了。要是過了早就忘了
首先了解進程是什么
狹義定義就是,進程是一段程序進行的過程。
廣義定義:進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動。它是操作系統動態(tài)執(zhí)行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執(zhí)行單元,簡單說就是你的系統運行時最小單位吧。
進程間通信(IPC)
進程間通信,指的是進程之間信息交換,所交換的信息量少則是一個狀態(tài)或數值,多則成千上萬個字節(jié)。
方式分為兩類:共享內存,消息機制。
重點!!要考的!!
共分為8種
1、共享內存:共享內存就是映射一段能被其他進程所訪問的內存。這段內存由一個進程創(chuàng)建,但多個進程可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式效率低所創(chuàng)建的。它往往與其他的通信機制來配合使用。來實現進程間的同步通信。
因為直接在內存上操作,所以共享內存的速度也就提高了,所以最快。
多進程共享內存
2、管道:管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用,通常指父子進程關系。
單行道[圖片來源網絡]
管道就像一輛單向行駛的車【單行道誰也不能掉頭】,只有車上坐滿人后,車才可以發(fā)動,而當車到達目的地,全體人員都要下車
3、有名管道:有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間通信。
- (1)可以用于沒有親緣關系的進程之間的通信;
- (2)同一數據不能重復讀,讀一次就相當于從管道中拿走;
- (3)可以多端寫入,多端讀取;
4、高級管道:將另一個程序當做一個新的進程在當前程序進程中啟動,則它算是當前程序的子進程,這種方式我們稱為高級管道方式。
5、信號量:信號量是一個技術器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同意進程內不同線程的同步手段。
信號量分為兩種
- 內核信號量,由內核控制路徑使用
- 用戶態(tài)進程使用的信號量,這種信號量又分為POSIX信號量和SYSTEM V信號量。
POSIX信號量又分為有名信號量和無名信號量 有名信號量,其值保存在文件中, 所以它可以用于線程也可以用于進程間的同步。
無名信號量,其值保存在內存中。
內核信號量類似于自旋鎖,因為當鎖關閉著時,它不允許內核控制路徑繼續(xù)進行。然而,當內核控制路徑試圖獲取內核信號量鎖保護的忙資源時,相應的進程就被掛起。只有在資源被釋放時,進程才再次變?yōu)榭蛇\行。
6、消息隊列:消息隊列是由消息的鏈表存放在內核并有消息隊列標識符標識。消息隊列克服了信號傳遞信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)太小受限。
- 我司目前主要通訊方式就是MQ,使用的IBM 的。我認為有幾個好處
- 承受高并發(fā),服務暫時處理不了高并發(fā),可以對消息隊列消息積壓持久化。
- 將消息寫入消息隊列,非必要的業(yè)務邏輯以異步的方式運行,加快響應速度【場景如微信動賬】
- 解耦,將消息寫入消息隊列,需要消息的系統自己從消息隊列中訂閱,從而前置不需要做任何修改。
7、信號:信號是一種比較復雜的通信方式,用于通知接受進程某個時間已發(fā)生。
8、套接字:套解口也是一種進程間通信機制,與其他通信機制不同的是,不可用于不同主機間的進程通信。
常用在后端系統和后端系統間通訊,見下圖
socket通訊[圖片來源網絡]