1. 程式人生 > >詳解程序之間的通訊方式

詳解程序之間的通訊方式

一、管道

    管道類似於一種特殊的檔案(並不是),它存在於記憶體中,程序可以對它進行讀寫,它提供流控制,保證程序的正確讀寫,即管道為空時讀程序會阻塞,管道為滿時寫程序會阻塞,以此實現程序之間的通訊。

  管道有三種:1.普通管道(無名管道、也常直接稱管道) 2.流管道 3.命名管道(FIFO)

  • 普通管道    

               它是半雙工的,即只能單向傳輸

             它是有程序關係限制的,只能在父子程序之間使用

  • 流管道

             相對於普通管道而言,它不止是單向傳輸,可以雙向傳輸。

  •     命名管道(FIFO):

             相對於普通管道而言,它沒有程序關係限制,可以在無關程序之間進行資料交換。


二、訊息佇列

        類似於用連結串列的結構儲存訊息。

                     

        它相比於管道,不止只能傳輸位元組流,也沒有緩衝區大小的限制

      它獨立於程序存在,程序終止時,訊息佇列及其內容並不會被刪除。

它實現了訊息的隨機讀取。

三、套接字(socket)

        與其它通訊機制不同是,套接字可用於不同機器間的程序通訊,即可用於網路之間的程序通訊。

           

四、訊號量

        訊號量用於實現程序間的互斥與同步,而不是用於儲存程序間通訊資料。它是一個計數器,用來控制多個程序對共享資源的訪問,常作為一種鎖機制,實現程序間的同步和互斥。(JUC的Semaphore的設計思想來源吧)


五、共享記憶體

        即多個程序共享某塊記憶體,共享記憶體是通訊方式中最快的一種。

作業系統建立一塊共享記憶體,並將其對映到參與通訊的每個程序的地址空間上,程序就可以直接對這塊共享記憶體進行讀寫。

                

那麼,共享記憶體這種方式為什麼是最快的呢?

這是因為共享記憶體的整個通訊過程對訊息的複製只有兩次。

                1.從資料來源複製到共享記憶體 

                2.從共享記憶體複製到資料目的地

          而管道、訊息佇列等方式對訊息的複製需要四次,因為有緩衝區的存在,讀寫都要經過緩衝區。

相關推薦

程序之間通訊方式

一、管道    管道類似於一種特殊的檔案(並不是),它存在於記憶體中,程序可以對它進行讀寫,它提供流控制,保證程序的正確讀寫,即管道為空時讀程序會阻塞,管道為滿時寫程序會阻塞,以此實現程序之間的通訊。  管道有三種:1.普通管道(無名管道、也常直接稱管道) 2.流管道 3.命

QT之QSharedMemory 程序通訊

QSharedMemory的幾個重要介面: setKey(),這是標記共享記憶體的一個識別符號, 在整個作業系統的共享記憶體中,用這個key去標識它,唯一標識。 create(),建立共享記憶體,向os申請記憶體空間, 如果不建立,呼叫attach()會失敗, 在creat

我最喜歡的程序之間通訊方式-訊息匯流排

道哥的第 020 篇原創 [TOC] ## 一、Linux 系統中的程序之間通訊(IPC) 作為一名嵌入式軟體開發人員來說,處理程序之間的通訊是很常見的事情。從通訊目的的角度來看,我們可以把程序之間的通訊分成 3 種: > 1. 為了程序的排程: 可以通過訊號來實現; > 2. 為

4種程序通訊方式

     程序間通訊有4種方式,以下從簡單到複雜的方式出場:1.管道(pipe)     管道是一種具有兩個端點的通訊通道,一個管道實際上就是隻存在在記憶體中的檔案,對這個檔案操作需要兩個已經開啟檔案進行,他們代表管道的兩端,也叫兩個句檳,管道是一種特殊的檔案,不屬於一種檔案系統,而是一種獨立的檔案系統,有自

IPC(中)-程序通訊方式

IPC(中) 1 Android中IPC方式 在第一篇IPC(上)中我們已經介紹了IPC的基礎知識:序列化和Binder,本篇將詳細介紹各種跨程序通訊方式.具體有如下幾種: Intent中extras傳遞 共享檔案 Binder ContentPr

微信小程式——頁面之間的跳轉方式【路由】和引數傳遞

微信小程式擁有web網頁和Application共同的特徵,我們的頁面都不是孤立存在的,而是通過和其他頁面進行互動,來共同完成系統的功能。今天我們來研究小程式頁面之間的跳轉方式。 1.先導 在Android中,我們Activity和Fragmen

Nginx兩種方式實現訪問控制

vfk 用戶 用戶輸入 bfd pcre 效果 sys ado 密碼認證 簡介 基於用戶的訪問控制就是對網頁目錄進行認證配置,用戶輸入用戶名密碼之後才能訪問網頁基於IP的訪問控制即使可以通過配置基於ip的訪問控制,達到讓某些ip能夠訪問,限制哪些ip不能訪問的效果 實驗環境

程序之間通訊

IPC 指的是程序間通訊 之所以開啟子程序 ,肯定需要他幫我們完成任務,很多情況下,需要將資料返回給父程序。 然而程序記憶體是物理隔離的 解決方案: 1.將共享資料放在檔案中,就是慢 2.管道 subprocess 中那個管道只能單向通訊,必須有父子關係 3.共享一塊記憶體區域 得作業系統幫你

linux 程序通訊方式

1 無名管道通訊 無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 2 高階管道通訊 高階管道(popen):將另一個程式當做一個新的程序在當前程式程序中啟動,則它算是當前程式的子程序

Linux下程序通訊方式 - UNIX Domain Socket

概述 Linux下程序通訊方式有很多,比較典型的有套接字,平時比較常用的套接字是基於TCP/IP協議的,適用於兩臺不同主機上兩個程序間通訊, 通訊之前需要指定IP地址. 但是如果同一臺主機上兩個程序間通訊用套接字,還需要指定ip地址,有點過於繁瑣. 這個時候就需要用到UNIX Domain Sock

面試必問:程序與執行緒的異同以及程序通訊方式

秋招面試必問的題目,感覺今年被問了差不多10次了。 1.程序與執行緒 程序:具有獨立功能的程式關於某個資料集合上的一次執行活動。 執行緒:程序的一個實體。 比喻:一列火車是一個程序,火車的每一節車廂是執行緒。 2.程序與執行緒的聯絡 ①一個執行緒只能屬於一個程序,一個程序

程序通訊方式及特點

轉自 程序通訊的含義 程序是轉入記憶體並準備執行的程式,每個程式都有私有的虛擬地址空間,由程式碼,資料以及它可利用的系統資源(如檔案,管道)組成.多程序/多執行緒是windows作業系統的一個基本特徵.Linux系統一般都統稱為程序. 由於不同的程序執行在各自不同的記憶體空間中,其中一

安卓多執行緒間通訊和多程序之間通訊有什麼不同?分別怎麼實現?

**當一個程式第一次啟動的時候,Android會去動一個Linux進行和一個主執行緒,預設情況下,所有改程式元件都將在該程序和執行緒中 執行,同時Android會為每個應用程式分配一個單獨的Linux使用者,Android會盡量保留一個正在執行的程序,只在記憶體資源出現不足時,Andro

Angularjs實現控制器之間通訊方式示例

利用angularjs開發專案中,控制器之間的通訊,比如引數的傳遞,資料的傳遞,都是比較常見的。控制器之間的通訊,顯得尤為重要。常見的方式有如下兩種:一、angular服務的方式;二、基於事件廣播的方式;另外,還有基於作用域繼承的方式。下面先說一下前兩種方式: 一、基於angular服務的方式: 在angu

最快的程序通訊方式你get了麼

  前言:天下武功為快不破!在資訊爆炸、快速發展的新時代...,扯遠了...。程序間通訊方式有很多,但最快的方式你知道麼?由我娓娓道來...   一、共享記憶體方式   主角閃亮登場了,噔噔瞪...,最快的方式就是共享記憶體了。實現共享記憶體的方式主要有兩種: 儲存對映I/O mmap函式實現 s

嵌入式Linux併發程式設計,程序通訊方式,System V IPC,訊號燈集,建立/開啟semget(),初始化semctl(),P/V操作semop(),sembuf結構體定義

文章目錄 1,System V IPC - 訊號燈 2,System V IPC - 訊號燈特點 3,System V訊號燈使用步驟 3.1,訊號燈建立/開啟 semget() 3.2,訊號燈初始化 semctl()

嵌入式Linux併發程式設計,程序通訊方式,System V IPC,訊息佇列,開啟/建立msgget(), 傳送訊息msgsnd(),格式,接收訊息msgrcv(),控制訊息佇列 msgctl()

文章目錄 1,訊息佇列 2,訊息佇列結構 3,訊息佇列使用步驟 3.1,開啟/建立訊息佇列 msgget() 3.1.1,開啟/建立訊息佇列---示例msgget() 3.2,向訊息佇列傳送訊息 msgs

嵌入式Linux併發程式設計,程序通訊方式,System V IPC物件,ftok(),共享記憶體使用步驟,建立shmget(),對映shmat(),撤銷對映shmdt(),控制shmctl(),注意

文章目錄 1,System V IPC 2,使用IPC物件的大致流程 3,生成KEY值ftok() ftok示例 4,共享記憶體 4.1,共享記憶體使用步驟 4.2,共享記憶體建立 shmget()

(三)程序通訊方式-----訊息佇列

訊息佇列 訊息佇列,是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識。使用者程序可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。 同管道檔案相比,訊息佇列中的每個訊息指定特定的訊息型別,接收的時候可以不需要按照佇列次序讀取,可以根據自定義型別

Linux程序通訊方式一:有名管道FIFO

有名管道 我們經常把FIFO稱為有名管道(命名管道)。使用它可以實現兩個不相干的程序之間的通訊。它雖然被稱之為檔案,但是管道檔案在磁碟上只有一個inode結點,這個ionde結點指向的是記憶體中的一塊區域,當A程序建立並使用有名管道時,直接把資料寫入記憶體中,而B程序也是直