1. 程式人生 > >linux記憶體保護機制及程序間通訊原理

linux記憶體保護機制及程序間通訊原理

Linux的虛擬儲存器使得每個程序有著統一的、一致的4G地址空間。能支援該功能的主要本質是因為當頁面不在實體記憶體時,由於缺頁異常,將導致異常處理程式從交換空間中把資料換入實體記憶體,然後重新執行導致該異常的指令,而此時就可以正常的訪問,程序本身完全不用去關心該過程。

程序地址空間的低3G是使用者空間即使用者態,所需的CPU許可權為3;而高1G即為核心態,所需的CPU許可權為1Linux通過這兩個許可權值來達到隔離使用者態與核心態目的。而兩者的通訊方式只能通過得到系統確認的系統呼叫方式來進行通訊,即當要訪問核心態的資料的時候,必須通過系統呼叫來訪問,而系統呼叫的最主要的一個過程就是修改一個暫存器的狀態標誌——

CPU特權值,此時就可以訪問核心態下的資料了。

Linux的記憶體保護除了有兩個不同的態外,還有就是每個程序是相互隔離的,即不同程序之間是看不到對方的空間的,每個程序有著自己的地址空間,並且任何時候只有一個程序地址空間有效,這也是為什麼任何時候只有一個程序在執行(單CPU)。當程序進行切換的時候會相應的修改頁表基地址暫存器,通過修改該暫存器來達到地址空間的切換。這也是為什麼程序訪問不到其它程序地址空間的原因——當它在執行的時候使用的頁表基地址暫存器一定是它的,那麼映射出來的地址也絕對是屬於它自己的,這樣就可以防止它破壞別的程序。而程序間的通訊,其本質大多數是利用在核心態裡開闢一些空間,通過這些空間來進行資料傳輸(多次拷貝,將核心態緩衝區的資料拷貝到使用者態緩衝區copy_to_user)。而通常常見的如

mmap及共享記憶體則是通過另外兩種不同的方式進行的;其中共享記憶體是通過在一個程序的地址空間中建立一個新的段(共享記憶體區域),然後把該區域掛載到另一個程序(要與之通訊的程序),此時兩者的虛擬地址不一定一樣,但是它們的實體地址卻是一樣的,所以它們在記憶體中只儲存一份,他們的訪問直接通過掛載後的虛擬地址進行訪問,不再需要核心空間的copy,這也是為什麼共享記憶體是程序間通訊最快的原因。而mmap則是利用檔案來做為中轉站,達到資料通訊的目的,其本質與共享記憶體有點相似。

相關推薦

linux記憶體保護機制程序通訊原理

Linux的虛擬儲存器使得每個程序有著統一的、一致的4G地址空間。能支援該功能的主要本質是因為當頁面不在實體記憶體時,由於缺頁異常,將導致異常處理程式從交換空間中把資料換入實體記憶體,然後重新執行導致該異常的指令,而此時就可以正常的訪問,程序本身完全不用去關心該過程。 程序地

Linux 通過共享記憶體機制實現程序通訊

問題背景 編寫程式 sender ,它建立一個共享記憶體,然後等待使用者通過終端輸入一串字元,並將這串字元通過共享記憶體傳送給 receiver;最後,它等待 receiver 的應答,收到應答訊息後,將接收到的應答資訊顯示在終端螢幕上,刪除共享記憶體,結束程式的執行。 編寫 receiver 程

程序/執行緒同步的方式和機制程序通訊【轉】

(轉自:https://www.cnblogs.com/virusolf/p/5331946.html) 一、程序/執行緒間同步機制。 臨界區、互斥區、事件、訊號量四種方式臨界區(Critical Section)、互斥量(Mutex)、訊號量(Semaphore)、事件(Event)的區別

linux 用命名管道實現程序通訊

什麼是命名管道 命名管道和匿名管道一樣適用於程序之間的通訊linux匿名管道詳解,但是使用範圍不同,匿名管道要求必須是親緣程序,而命名管道卻沒有這個限制,它可以用於同一臺機器主機上的任意程序間通訊。

php高階應用之程序控制程序通訊

很少有用php寫服務的,然而有些場景又要求能有一個這樣的伺服器程式,它能夠與php無縫結合,並且提供高可靠靠效能的服務,並且提供現有架構所沒有的一些高階特性,例如支援自定義協議,支援長連線等等。PPM(PHP-Process-Manager)是我用PHP開發的一款程序管理

深入Linux核心架構——鎖與程序通訊

Linux作為多工系統,當一個程序生成的資料傳輸到另一個程序時,或資料由多個程序共享時,或程序必須彼此等待時,或需要協調資源的使用時,應用程式必須彼此通訊。 一、控制機制 1、競態條件 幾個程序在訪問資源時彼此干擾的情況通常稱之為競態條件(race condition)。在對分散式應用程式設計時,這種情

Android中Binder機制實現程序通訊

           基本上不管是何種開發都會涉及到程序間通訊的問題,即IPC,而安卓系統的IPC方式主要是Binder,先列舉幾種IPC的方式,對比Binder看看。       Linux裡

如何利用記憶體池和共享記憶體構建高速的程序通訊模型

#include "messagequeue.h" #include BYTE* CMssageQueue::mpCurrAddr = nullptr; CMssageQueue::CMssageQueue() { miBegin = 0; miEnd = 0; miOffse

linux下使用FIFO進行程序通訊

無名管道應用的一個重大限制是它沒有名字,因此,只能用於具有親緣關係的程序間通訊,在有名管道(named pipe或FIFO)提出後,該限制得到了克服。FIFO不同於管道之處在於它提供一個路徑名與之關聯,以FIFO的檔案形式存在於檔案系統中。這樣,即使與FIFO的建立程序不存在親緣關係的程序,只要可以訪問該

深入Python程序通訊原理

繼上節使用原生多程序並行執行,基於Redis作為訊息佇列完成了圓周率的計算,本節我們使用原生作業系統訊息佇列來替換Redis。檔案使用檔案進行通訊是最簡單的一種通訊方式,子程序將結果輸出到臨時檔案,父程序從檔案中讀出來。檔名使用子程序的程序id來命名。程序隨時都可以通過 os

linux程序通訊的幾種機制的比較適用場合

用於程序間通訊(IPC)的四種不同技術:  1. 訊息傳遞(管道,FIFO,posix和system v訊息佇列)  2. 同步(互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,Posix和System V訊號燈)  3. 共享記憶體區(匿名共享記憶體區,有名Posix共享記憶體區,有名System V共享記憶體區)

c/c++ linux 程序通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

Linux程序通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

Linux(高階程式設計)8————程序通訊4(共享記憶體

共享記憶體是什麼? 因為程序之間是相互獨立的,他們有各自程序地址空間,那麼他們需要通訊時就要藉助核心來為他們建立橋樑,像之前我們瞭解的管道、訊息佇列就是核心做的工作來為程序間通訊架的橋樑。共享記憶體也是核心為程序間通訊駕的一座橋樑,只不過這座橋樑比其他橋樑更優,共享記憶體是核心為需要通訊

Linux關於程序通訊共享記憶體

共享記憶體概念 共享記憶體允許兩個不相關的程序去訪問同一部分邏輯記憶體 如果需要在兩個執行中的程序之間傳輸資料,共享記憶體將是一種效率極高的解決方案 共享記憶體是由IPC為一個程序建立的一個特殊的地址範圍,它將出現在程序的地址空間中。 其他程序可以把同一段共享記憶體段“連

Linux 程序通訊(六)共享記憶體

可以說, 共享記憶體是一種最為高效的程序間通訊方式, 因為程序可以直接讀寫記憶體, 不需要任何資料的複製。 為了在多個程序間交換資訊, 核心專門留出了一塊記憶體區, 這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。 因此, 程序就可以直接讀寫這一記憶體區而不需要

Linux程序通訊機制----訊息佇列

一、什麼是訊息 訊息(message)是一個格式化的可變長的資訊單元。訊息機制允許由一個程序給其它任意的程序傳送一個訊息。當一個程序收到多個訊息時,可將它們排成一個訊息佇列。 1、訊息機制的資料結構 (1)訊息首部 記錄一些與訊息有關的資訊,如訊息的型別、大小、

嵌入式linux網路程式設計,UNIX域套接字,AF_LOCAL,PF_LOCAL,PF_UNIX,,AF_UNIX,程序通訊機制

文章目錄 1,UNIX域套接字 2,UNIX域套接字模型 3,UNIX域套接字 --- 示例 3.1,net.h 3.2,client.c 3.3,sever.c 3.4,linklist.h 3.5,link

嵌入式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()

Linux系統程式設計——程序通訊:共享記憶體

概述 共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當一個程序改變了這塊地址中的內容的時候,其它程序都會察覺到這個更改。 共享記憶體的特點: 1)共