大家好,進(jìn)程間通信消息隊(duì)列相信很多的網(wǎng)友都不是很明白,包括進(jìn)程通信消息隊(duì)列也是一樣,不過(guò)沒(méi)有關(guān)系,接下來(lái)就來(lái)為大家分享關(guān)于進(jìn)程間通信消息隊(duì)列和進(jìn)程通信消息隊(duì)列的一些知識(shí)點(diǎn),大家可以關(guān)注收藏,免得下次來(lái)找不到哦,下面我們開始吧!
Linux多線程通信
PIPE和FIFO用來(lái)實(shí)現(xiàn)進(jìn)程間相互發(fā)送非常短小的、頻率很高的消息;
這兩種方式通常適用于兩個(gè)進(jìn)程間的通信。
共享內(nèi)存用來(lái)實(shí)現(xiàn)進(jìn)程間共享的、非常龐大的、讀寫操作頻率很高的數(shù)據(jù)(配合信號(hào)量使用);這種方式通常適用于多進(jìn)程間通信。
其他考慮用socket。這里的“其他情況”,其實(shí)是今天主要會(huì)碰到的情況:分布式開發(fā)。
在多進(jìn)程、多線程、多模塊所構(gòu)成的今天最常見的分布式系統(tǒng)開發(fā)中,socket是第一選擇
。消息隊(duì)列,現(xiàn)在建議不要使用了----因?yàn)檎也坏绞褂盟鼈兊睦碛伞T趯?shí)際中,我個(gè)人感覺(jué),PIPE和FIFO可以偶爾使用下,共享內(nèi)存都用的不多了。在效率上說(shuō),socket有包裝數(shù)據(jù)和解包數(shù)據(jù)的過(guò)程,所以理論上來(lái)說(shuō)socket是沒(méi)有PIPE/FIFO快,不過(guò)現(xiàn)在計(jì)算機(jī)上真心不計(jì)較這么一點(diǎn)點(diǎn)速度損失的。你費(fèi)勁糾結(jié)半天,不如我把socket設(shè)計(jì)好了,多插一塊CPU來(lái)得更劃算。另外,進(jìn)程間通信的數(shù)據(jù)一般來(lái)說(shuō)我們都會(huì)存入數(shù)據(jù)庫(kù)的,這樣萬(wàn)一某個(gè)進(jìn)程突然死掉或者整個(gè)服務(wù)器死了,也不至于丟失重要數(shù)據(jù)、便于回滾到之前的狀態(tài)。從這個(gè)角度考慮,適用共享內(nèi)存的情況也更少了,所以socket使用得更多。再多說(shuō)一點(diǎn)關(guān)于共享內(nèi)存的:共享內(nèi)存的效率確實(shí)高,但它的重點(diǎn)在“共享”二字上。如果的確有好些進(jìn)程共享一大塊數(shù)據(jù)(如果把每個(gè)進(jìn)程都看做是類的對(duì)象的話,那么共享數(shù)據(jù)就是這個(gè)類的static數(shù)據(jù)成員),那么共享內(nèi)存就是一個(gè)不二的選擇了。但是在面向?qū)ο蟮慕裉欤覀兏嗟臅r(shí)候是多線程+鎖+線程間共享數(shù)據(jù)。因此共享進(jìn)程在今天使用的也越來(lái)越少了。不過(guò),在面對(duì)一些極度追求效率的需求時(shí),共享內(nèi)存就會(huì)成為唯一的選擇,比如高頻交易系統(tǒng)。除此以外,一般是不需要特意使用共享內(nèi)存的。另外,PIPE和共享內(nèi)存是不能跨LAN的
(FIFO可以但FIFO只能用于兩個(gè)進(jìn)程通信)。
如果你的分布式系統(tǒng)隨著需求的增加而越來(lái)越大所以你想把不同的模塊放在不同機(jī)器上而你之前開發(fā)的時(shí)候用了PIPE或者共享內(nèi)存,那么你將不得不對(duì)代碼進(jìn)行大幅修改......同時(shí),即使FIFO可以跨越LAN,其代碼的可讀性、易操作性和可移植性、適應(yīng)性也遠(yuǎn)沒(méi)有socket大。這也就是為什么一開始說(shuō)socket是第一選擇的原因。最后還有個(gè)信號(hào)簡(jiǎn)單說(shuō)一下。請(qǐng)注意,是信號(hào),不是信號(hào)量。
信號(hào)量是用于同步線程間的對(duì)象的使用的(建議題主看我的答案,自認(rèn)為比較通俗易懂:semaphore和mutex的區(qū)別?-Linux-知乎
)。信號(hào)也是進(jìn)程間通信的一種方式。比如在Linux系統(tǒng)下,一個(gè)進(jìn)程正在執(zhí)行時(shí),你用鍵盤按Ctrl+c,就是給這個(gè)進(jìn)程發(fā)送了一個(gè)信號(hào)。進(jìn)程在捕捉到這個(gè)信號(hào)后會(huì)做相應(yīng)的動(dòng)作。雖然信號(hào)是可以自定義的,但這并不能改變信號(hào)的局限性:不能跨LAN、信息量極其有限
。在現(xiàn)代的分布式系統(tǒng)中,通常都是消息驅(qū)動(dòng):
即進(jìn)程受到某個(gè)消息后,通過(guò)對(duì)消息的內(nèi)容的分析然后做相應(yīng)的動(dòng)作。如果你把你的分布式系統(tǒng)設(shè)置成信號(hào)驅(qū)動(dòng)的,這就表示你收到一個(gè)信號(hào)就要做一個(gè)動(dòng)作而一個(gè)信號(hào)的本質(zhì)其實(shí)就是一個(gè)數(shù)字而已。這樣系統(tǒng)稍微大一點(diǎn)的話,系統(tǒng)將變得異常難以維護(hù);甚至在很多時(shí)候,信號(hào)驅(qū)動(dòng)是無(wú)法滿足我們的需求的。因此現(xiàn)在我們一般也不用信號(hào)了。因此,請(qǐng)記住:除非你有非常有說(shuō)服力的理由,否則請(qǐng)用socket。
順便給你推薦個(gè)基于socket的輕量級(jí)的消息庫(kù):ZeroMQ。什么叫做程序控制塊
程序控制塊:俗稱(PCB)包含進(jìn)程的描述信息和控制信息,是進(jìn)程存在的唯一標(biāo)志。
PCB主要由四大部分組成:
進(jìn)程的描述信:進(jìn)程ID和進(jìn)程名稱:進(jìn)程ID是唯一的代表每一個(gè)進(jìn)程。進(jìn)程狀態(tài):運(yùn)行、就緒、阻塞進(jìn)程優(yōu)先級(jí):進(jìn)程調(diào)度的重要依據(jù)。
進(jìn)程的調(diào)度信息:程序的起始地址:程序的第一指令的內(nèi)存地址,程序開始執(zhí)行的地址。通信信息:進(jìn)程間通信時(shí)的消息隊(duì)列。
進(jìn)程資源信息:內(nèi)存信息:內(nèi)存占用情況和內(nèi)存管理所用的數(shù)據(jù)結(jié)構(gòu)。I/O設(shè)備信息:所用的I/O設(shè)備編號(hào)及對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)。文件句柄:所打開的文件信息。
進(jìn)程上下文:執(zhí)行時(shí)各種CPU寄存器的值、當(dāng)前程序計(jì)數(shù)器(PC)的值以及各棧的值等,可視為進(jìn)程的環(huán)境。
linux進(jìn)程調(diào)度詳解
linux進(jìn)程調(diào)度:
無(wú)論是在批處理系統(tǒng)還是分時(shí)系統(tǒng)中,用戶進(jìn)程數(shù)一般都多于處理機(jī)數(shù)、這將導(dǎo)致它們互相爭(zhēng)奪處理機(jī)。
另外,系統(tǒng)進(jìn)程也同樣需要使用處理機(jī)。
這就要求進(jìn)程調(diào)度程序按一定的策略,動(dòng)態(tài)地把處理機(jī)分配給處于就緒隊(duì)列中的某一個(gè)進(jìn)程,以使之執(zhí)行。
linux進(jìn)程調(diào)度基本屬性:
1.多態(tài)性從誕生、運(yùn)行,直至消滅
2.多個(gè)不同的進(jìn)程可以包括相同的程序
3.三種基本狀態(tài)它們之間可進(jìn)行轉(zhuǎn)換
4.并發(fā)性并發(fā)執(zhí)行的進(jìn)程輪流占用處理器
linux進(jìn)程調(diào)度原理:
調(diào)度程序運(yùn)行時(shí),要在所有可運(yùn)行狀態(tài)的進(jìn)程中選擇最值得運(yùn)行的進(jìn)程投入運(yùn)行。
在每個(gè)進(jìn)程的task_struct結(jié)構(gòu)中有以下四項(xiàng):policy、priority、counter、rt_priority。
這四項(xiàng)是選擇進(jìn)程的依據(jù)。
其中,policy是進(jìn)程的調(diào)度策略,用來(lái)區(qū)分實(shí)時(shí)進(jìn)程和普通進(jìn)程,實(shí)時(shí)進(jìn)程優(yōu)先于普通進(jìn)程運(yùn)行;
priority是進(jìn)程(包括實(shí)時(shí)和普通)的靜態(tài)優(yōu)先級(jí);
counter是進(jìn)程剩余的時(shí)間片,它的起始值就是priority的值;
由于counter在后面計(jì)算一個(gè)處于可運(yùn)行狀態(tài)的進(jìn)程值得運(yùn)行的程度goodness時(shí)起重要作用,因此,counter也可以看作是進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)。
rt_priority是實(shí)時(shí)進(jìn)程特有的,用于實(shí)時(shí)進(jìn)程間的選擇。
c語(yǔ)言多進(jìn)程編程
多進(jìn)程這個(gè)詞用的比較少,在Linux下應(yīng)該很容易實(shí)行,進(jìn)程間通信問(wèn)題,管道,消息隊(duì)列,共享內(nèi)存都可以
linux多線程同步之消息隊(duì)列有何特點(diǎn)l
區(qū)別和聯(lián)系:
1、進(jìn)程是獨(dú)立運(yùn)行的實(shí)體,有獨(dú)立的資源分配;
2、同一進(jìn)程的線程之間共享進(jìn)程的資源;
3、所有的進(jìn)程至少有一個(gè)執(zhí)行線程;
4、線程的創(chuàng)建和切換代價(jià)比進(jìn)程的小;線程間的通信方法:1、同一進(jìn)程的線程之間通信的最簡(jiǎn)單辦法就是使用全局變量;2、不同進(jìn)程的線程之間通信需要通過(guò)下面進(jìn)程間的通信來(lái)實(shí)現(xiàn);進(jìn)程間的通信方法:1、管道2、信號(hào)量3、共享內(nèi)存4、消息隊(duì)列5、套接字
關(guān)于進(jìn)程間通信消息隊(duì)列的內(nèi)容到此結(jié)束,希望對(duì)大家有所幫助。