進程間通信—system V
- 1. System V 共享內存(Shared Memory)
- 1.1 共享內存的建立過程
- 1.2 共享內存函數
- 2. System V 消息隊列(Message Queues)
- 3. System V 信號量(Semaphores)
- 4. 總結
前言:
之前所提的管道通信是基于文件的,OS沒有做過多的設計工作。
system V 進程間通信:OS特地設計的通信方式。想盡一切辦法讓不同的進程看到同一份資源(由OS提供)。
system V通信方式為:共享內存、消息隊列、信號量。
共享內存、消息隊列是以傳送數據為目的;信號量是為了保證進程同步與互斥而設計的,屬于通信范疇。
以下是 System V IPC 的三種主要組件的詳細講解:
1. System V 共享內存(Shared Memory)
在進程間通信(IPC進程間通信)中,共享內存(Shared Memory)是一種非常高效的方式,它允許不同的進程直接訪問同一塊內存區域,從而避免了數據復制和大量的上下文切換。使用共享內存,多個進程可以直接訪問同一份內存資源,使得它們之間的通信速度非常快,通常用于高性能的系統和應用中。故共享內存允許多個進程共享同一塊物理內存區域。所有進程都可以直接讀寫共享內存,這樣就能避免復制數據,提高效率。它是 System V IPC 中速度最快的通信方式。
共享內存的工作原理基于內存映射:
系統創建一個特定的內存區域,并將該區域映射到多個進程的地址空間。每個進程可以通過直接訪問這塊內存區域來讀寫數據。共享內存區域通常會在進程的地址空間中作為一個特殊的內存區域被映射,可以由多個進程并發訪問。為了使得多個進程能夠看到同一份資源,需要通過操作系統提供的 API 來創建、映射和訪問共享內存區域。
上圖所示講解:
1、物理內存映射到進程的地址空間中
現代操作系統使用虛擬內存技術,讓每個進程有獨立的虛擬地址空間,而不直接使用物理內存的地址。這使得進程在訪問內存時,只知道自己的虛擬地址,而操作系統會負責將這些虛擬地址映射到實際的物理內存地址。這個過程叫做 內存映射。
2、如何實現——修改頁表,在虛擬地址空間中開辟空間
在現代操作系統中,每個進程都擁有一張頁表,用于記錄虛擬地址與物理地址之間的映射關系。頁表將虛擬地址空間劃分為一個個頁,每一頁有對應的物理內存頁。
虛擬地址:這是程序運行時使用的地址,進程看到的地址。
物理地址:這是實際內存中數據的存儲位置。
當一個進程需要訪問某個虛擬地址時,操作系統通過頁表查找該虛擬地址對應的物理地址。如果映射已經建立,硬件可以直接訪問物理內存。如果沒有映射,操作系統會觸發 頁面錯誤(Page Fault),并負責加載數據或分配新的物理內存頁。
修改頁表 就是指操作系統在管理虛擬內存時,動態地更新頁表,將某個虛擬地址映射到一個物理地址。這種修改通常發生在操作系統進行內存分配、程序加載時,或者進程在運行過程中需要更多內存時。
3、有沒有能力?——用系統接口,完成所謂的開辟空間,建立映射
操作系統通過一組 系統調用(System Calls) 來提供管理虛擬內存的能力。這些系統調用允許程序請求操作系統為其分配虛擬內存,并為該內存區域建立物理內存的映射。
內存分配:當一個程序或進程需要更多的內存時,它會調用操作系統提供的內存分配函數(比如 malloc(),brk(),mmap() 等),操作系統根據進程的請求,為它分配一塊 虛擬內存。
映射物理內存:操作系統會在物理內存中找到一塊可用區域,然后通過更新頁表,將這塊虛擬內存區域與物理內存頁進行映射。操作系統通過頁表來管理這些映射關系,確保進程訪問虛擬地址時能正確地映射到物理地址。
4、用系統接口,完成所謂的開辟空間,建立映射,開辟虛擬空間后返回給用戶,都是OS做的
在操作系統中,進程無法直接操作硬件或內存。所有關于虛擬內存的管理和分配都由操作系統負責。操作系統為進程提供了 系統調用接口,通過這些接口,進程可以請求內存分配、釋放內存等操作。
例如,mmap() 是一種常用的內存映射系統調用,能夠請求操作系統將一個文件或一塊物理內存映射到進程的虛擬地址空間中。操作系統收到這些請求后,會根據需要分配或映射合適的內存塊,并更新頁表。
開辟虛擬空間:操作系統根據進程請求開辟虛擬內存空間,將這些虛擬地址空間通過頁表映射到物理內存。
返回給用戶:當操作系統完成內存分配和映射后,會將這塊分配好的虛擬內存區域的地址返回給進程,進程可以在此區域進行讀寫操作。
這些內存管理和映射的過程都是由操作系統通過系統調用來實現的,程序員無需直接操作物理內存,而是通過系統接口請求內存。
1.1 共享內存的建立過程
1、申請共享內存(開辟好物理內存)
2、將共享內存掛接(建立映射關系)到地址空間
3、上述1、2完成即開始通信
4、去關聯(修改頁表,取消映射關系)共享內存
4、釋放共享內存(將內存歸還給OS)
shm 是 共享內存(Shared Memory) 的簡稱,是操作系統中一種用于進程間通信(IPC,Inter-Process Communication)的機制。通過共享內存,多個進程可以訪問同一塊物理內存區域,從而在進程間快速交換數據。
共享內存(Shared Memory)是什