簡體   English   中英

操作系統中的共享內存段

[英]Shared Memory Segment in Operating System

共享內存屬於哪里? 這意味着它由堆棧和堆等每個單獨的進程擁有。 所以,其他程序無法訪問其他程序的堆棧。 或者它是一個常見的內存段,可供任意數量的進程使用。 下圖以圖解方式顯示了我的問題。

圖1:

    -----------------       -----------------       -----------------    
    |    stack      |       |    stack      |       |    stack      |
    |               |       |               |       |               |
    |  Shared m/y   |   --->|  Shared m/y   |<---   |  Shared m/y   |
    |               |   |   |               |   |   |               |
    |     heap      |   |   |    Heap       |   |   |    Heap       |
    |               |   |   |               |   |   |               |
    |  Data segment |   |   | Data segment  |   |   | Data segment  |
    |               |   |   |               |   |   |               |
    |      text     |___|   |      text     |   |___|   text        | 
    -----------------       -----------------       -----------------
        Process 1                Process 2               Process 3

(要么)

圖2:

                -----------------------------------------
                |                                        |
                |                                        |
                |          Shared Memory                 |<--
        ------->|                                        |  |
        |       |                                        |  |
        |       -----------------------------------------   |
        |                           ^                       |
        |                           |                       |  
    -----------------       -----------------       ----------------- 
    |    stack      |       |    stack      |       |    stack      |
    |               |       |               |       |               |
    |     heap      |       |    Heap       |       |    Heap       |
    |               |       |               |       |               |
    |  Data segment |       | Data segment  |       | Data segment  |
    |               |       |               |       |               |
    |      text     |       |      text     |       |   text        | 
    -----------------       -----------------       -----------------
       Process 1               Process 2                Process 3

在圖1中,每個進程在進程的地址空間內都有一段共享內存。 過程2的共享內存由進程1和進程3訪問。在圖2中,共享內存是所有進程都可訪問的內存段。 因此,在上面兩個場景中,由進程用於共享內存段。

考慮這個的正確方法是這樣的:

  • 系統有一定數量的物理內存,可供操作系統使用(計算機中的物理RAM芯片)
  • 每個進程都有一個虛擬地址空間,它不直接對應物理內存。
  • 操作系統可以將其可用的物理內存的任何部分映射到進程的虛擬地址空間。

基本上,操作系統可以說:“將此物理內存塊放入地址0x12345678的虛擬地址空間”。 進程虛擬地址空間中的每個數據最終都位於物理內存中的某個位置。 堆棧,堆,共享內存,......在這方面都是一樣的。 區分共享內存的唯一方法是多個進程將相同的物理內存映射到其地址空間。

秀色可餐:

系統內存到虛擬地址空間映射

實際上,事情有點復雜,但這種描述給出了基本的想法。

我懷疑你的部分困惑來自術語。 在64位之前的英特爾中,數據按細分組織。 術語也用於鏈接器來描述如何在程序中組裝數據(在32位Intel中可以映射到硬件段)。 但是,對於您的問題,您應該刪除術語

英特爾64位和大多數非英特爾系統的一般工作方式是將物理內存划分為某些固定大小的PAGE FRAMES(例如4K,1K)。 CPU的存儲器管理單元在相同大小的PAGES上操作。 操作系統為包含頁面的每個進程設置線性邏輯地址空間。 操作系統使用PAGE TABLE將邏輯進程地址空間的頁面映射到物理頁面幀。

當每個進程運行時,它會看到自己的邏輯地址空間,其地址范圍為0到任意值。 每個進程的地址空間中的頁面映射到物理頁面幀,並且內存管理單元使用頁面表自動使用頁面框架使用頁面到物理內存地址進行從邏輯地址的轉換。

該系統使每個過程都不​​會弄亂其他過程。 通常,如果進程X訪問邏輯地址Q並且進程Y訪問邏輯地址Q,則它們將訪問不同的物理內存位置,因為它們的頁表將具有不同的映射。

我所知道的每個使用邏輯內存轉換的系統都能夠讓多個進程將邏輯頁面映射到相同的物理頁面框架:共享內存。 進程可以使用此機制快速交換數據(代價是管理與該數據的同步)。

在這種類型的共享中,物理頁面幀不必映射到相同的邏輯地址(通常不是)。

處理X可以將頁面幀P映射到頁面A,而處理Y可以將頁面幀P映射到頁面B.

還有另一種形式的共享內存通常以完全不同的方式實現。 處理器或操作系統(在某些處理器上)定義系統地址空間的一系列邏輯地址。 此范圍的地址對於所有進程都是相同的,並且所有進程在此范圍內具有相同的邏輯地址到物理頁面幀的映射。

系統地址受到保護,因此只能在內核模式下訪問,因此進程不能相互混淆。

在這里考慮頁面而不是段。

在共享存儲器模型中,建立由協作進程共享的存儲器區域。 然后,進程可以通過讀取和寫入共享區域來交換信息。

共享內存區域駐留在創建共享內存段的進程的地址空間中。 希望使用此共享內存段進行通信的其他進程必須將其附加到其地址空間。 通常,操作系統會嘗試阻止一個進程訪問另一個進程的內存(病毒試圖破壞它)。 共享內存要求兩個或多個進程同意刪除此限制。 然后,他們可以通過在共享區域中讀取和寫入數據來交換信息。 數據的形式和位置由這些過程決定,不受操作系統的控制。 這些過程還負責確保他們不會同時寫入同一位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM