進程的概念html
進程是操做系統的概念,每當咱們執行一個程序時,對於操做系統來說就建立了一個進程,在這個過程當中,伴隨着資源的分配和釋放。能夠認爲進程是一個程序的一次執行過程。linux
進程通訊的概念服務器
進程用戶空間是相互獨立的,通常而言是不能相互訪問的。但不少狀況下進程間須要互相通訊,來完成系統的某項功能。進程經過與內核及其它進程之間的互相通訊來協調它們的行爲。網絡
進程通訊的應用場景多線程
數據傳輸:一個進程須要將它的數據發送給另外一個進程,發送的數據量在一個字節到幾兆字節之間。socket
共享數據:多個進程想要操做共享數據,一個進程對共享數據的修改,別的進程應該馬上看到。函數
通知事件:一個進程須要向另外一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。操作系統
資源共享:多個進程之間共享一樣的資源。爲了做到這一點,須要內核提供鎖和同步機制。線程
進程控制:有些進程但願徹底控制另外一個進程的執行(如Debug進程),此時控制進程但願可以攔截另外一個進程的全部陷入和異常,並可以及時知道它的狀態改變。設計
進程通訊的方式
1.管道
管道分爲有名管道和無名管道
無名管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用.進程的親緣關係通常指的是父子關係。無明管道通常用於兩個不一樣進程之間的通訊。當一個進程建立了一個管道,並調用fork建立本身的一個子進程後,父進程關閉讀管道端,子進程關閉寫管道端,這樣提供了兩個進程之間數據流動的一種方式。
有名管道也是一種半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
2.信號量
信號量是一個計數器,能夠用來控制多個線程對共享資源的訪問.,它不是用於交換大批數據,而用於多線程之間的同步.它常做爲一種鎖機制,防止某進程在訪問資源時其它進程也訪問該資源.所以,主要做爲進程間以及同一個進程內不一樣線程之間的同步手段.
Linux提供了一組精心設計的信號量接口來對信號進行操做,它們不僅是針對二進制信號量,下面將會對這些函數進行介紹,但請注意,這些函數都是用來對成組的信號量值進行操做的。它們聲明在頭文件sys/sem.h中。
semget函數
它的做用是建立一個新信號量或取得一個已有信號量
semop函數
它的做用是改變信號量的值
semctl函數
該函數用來直接控制信號量信息
3.信號
信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生.
4.消息隊列
消息隊列是消息的鏈表,存放在內核中並由消息隊列標識符標識.消息隊列克服了信號傳遞信息少,管道只能承載無格式字節流以及緩衝區大小受限等特色.消息隊列是UNIX下不一樣進程之間可實現共享資源的一種機制,UNIX容許不一樣進程將格式化的數據流以消息隊列形式發送給任意進程.對消息隊列具備操做權限的進程均可以使用msget完成對消息隊列的操做控制.經過使用消息類型,進程能夠按任何順序讀信息,或爲消息安排優先級順序.
5.共享內存
共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問.共享內存是最快的IPC(進程間通訊)方式,它是針對其它進程間通訊方式運行效率低而專門設計的.它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步與通訊.
6.套接字
socket,即套接字是一種通訊機制,憑藉這種機制,客戶/服務器(即要進行通訊的進程)系統的開發工做既能夠在本地單機上進行,也能夠跨網絡進行。也就是說它可讓不在同一臺計算機但經過網絡鏈接計算機上的進程進行通訊。也由於這樣,套接字明確地將客戶端和服務器區分開來。
套接字的特性由3個屬性肯定,它們分別是:域、類型和協議。
可用於不一樣及其間的進程通訊