Linux下程序間通訊的原理

2022-01-19 21:04:03 字數 1701 閱讀 4846

了解 linux ipc 相關的概念和原理有助於我們理解 binder 通訊原理。因此,在介紹 binder 跨程序通訊原理之前,我們先聊聊 linux 系統下傳統的程序間通訊是如何實現。

linux 程序間通訊的原理圖如下圖所示:

可以看出來,liunx 中跨程序通訊涉及到的一些基本概念如下:

簡單的說就是作業系統中,程序與程序間記憶體是不共享的。兩個程序就像兩個平行的世界,a 程序沒法直接訪問 b 程序的資料,這就是程序隔離的通俗解釋。

a 程序和 b 程序之間要進行資料互動就得採用特殊的通訊機制:程序間通訊(ipc)。

作業系統的核心是核心,獨立於普通的應用程式,可以訪問受保護的記憶體空間,也可以訪問底層硬體裝置的許可權。

為了保護使用者程序不能直接操作核心,保證核心的安全,作業系統從邏輯上將虛擬空間劃分為使用者空間(user space)和核心空間(kernel space)。簡單的說就是,核心空間(kernel)是系統核心執行的空間,使用者空間(user space)是使用者程式執行的空間。為了保證安全性,它們之間是隔離的。

雖然從邏輯上進行了使用者空間和核心空間的劃分,但不可避免的使用者空間需要訪問核心資源,比如檔案操作、訪問網路等等。為了突破隔離限制,就需要借助系統呼叫來實現。系統呼叫是使用者空間訪問核心空間的唯一方式,保證了所有的資源訪問都是在核心的控制下進行的,避免了使用者程式對系統資源的越權訪問,提公升了系統安全性和穩定性。

linux 使用兩級保護機制:0 級供系統核心使用,3 級供使用者程式使用。

當乙個任務(程序)執行系統呼叫而在核心**中執行時,稱程序處於核心執行態(核心態)。此時處理器處於特權級最高的(0級)核心**中執行。當程序處於核心態時,執行的核心**會使用當前程序的核心棧。每個程序都有自己的核心棧。當程序在執行使用者自己的**的時候,我們稱其處於使用者執行態(使用者態)。此時處理器在特權級最低的(3級)使用者**中執行。

系統呼叫主要通過如下兩個函式來實現:

copy_from_user() //

將資料從使用者空間拷貝到核心空間

copy_to_user() //

將資料從核心空間拷貝到使用者空間

通常的做法是訊息傳送方將要傳送的資料存放在記憶體快取區中,通過系統呼叫進入核心態。然後核心程式在核心空間分配記憶體,開闢一塊核心快取區,呼叫 copyfromuser() 函式將資料從使用者空間的記憶體快取區拷貝到核心空間的核心快取區中。同樣的,接收方程序在接收資料時在自己的使用者空間開闢一塊記憶體快取區,然後核心程式呼叫 copytouser() 函式將資料從核心快取區拷貝到接收程序的記憶體快取區。這樣資料傳送方程序和資料接收方程序就完成了一次資料傳輸,我們稱完成了一次程序間通訊。

1. 效能低下:一次資料傳遞需要經歷記憶體快取區 --> 核心快取區 --> 記憶體快取區,需要 2 次資料拷貝;

2. 接收端無法確定儲存空間:接收資料的快取區由資料接收程序提供,但是接收程序並不知道需要多大的空間來存放將要傳遞過來的資料,因此只能開闢盡可能大的記憶體空間或者先呼叫 api 接收訊息頭來獲取訊息體的大小,這兩種做法不是浪費空間就是浪費時間.

linux下程序間通訊

linux下程序間通訊的幾種主要手段簡介 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊 訊號 signal 訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發...

Linux下程序間通訊

linux下的程序通訊基本上是從unix平台上的程序通訊繼承來的。而對unix發展做出最大貢獻的倆大主力at t的貝爾實驗室及bsd 加州大學伯克利分校的伯克利軟體發布中心 在程序的通訊方面的側重點有所不同。前者是對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了 system v ipc...

linux下程序間通訊(2)

1.訊息佇列 訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少 管道只能承載無格式位元組流以及緩衝區大小受限等缺點。2.訊息佇列結構定義 struct msqid ds msgque msgmni 向量 msgque msgmni 是乙個msqid ds結構...