首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SGA 架構與進程附掛機制:UNIX 共享記憶體 vs Windows 執行緒模型

     編輯:Oracle 資料庫基礎

前言

系統全域區 (SGA) 是 Oracle 實例的核心共享記憶體區域。理解 SGA 內部結構、進程如何附掛存取、以及 UNIX 與 Windows 底層實作差異,是深入掌握 Oracle 架構的關鍵。

一、SGA 核心職責

功能說明對應組件
維護內部資料結構鎖、閂、佇列、SCN 等同步原語Shared Pool, Redo Log Buffer
緩存磁碟資料資料塊、索引塊、Undo 塊Database Buffer Cache
Redo 緩存交易重做記錄先寫此處,再由 LGWR 刷盤Redo Log Buffer
保存解析後 SQL 計畫Library Cache:共享 SQL 區、PL/SQL 程序Shared Pool

二、進程附掛 SGA 的底層機制

UNIX/Linux:System V Shared Memory


/* 簡化流程 */
shmget(key, size, IPC_CREAT | 0660)  →  取得共享記憶體段 ID (shmid)
shmat(shmid, NULL, 0)                →  映射到進程虛擬位址空間,返回附掛位址
/* 進程現在可直接讀寫 SGA 位址範圍 */
  • ipcs -m 可查看 Oracle 共享記憶體段
  • 所有 Oracle 前景/背景進程附掛**同一共享記憶體段**
  • SGA 位址空間在所有進程中**相同虛擬位址** (靜態映射) 或**不同位址但內容同步** (動態映射)
  • 大頁面 支援:減少頁表項目、降低 TLB Miss、提升效能

Windows:單一進程多執行緒模型

  • Oracle 實例 = **單一進程** (oracle.exe) + **多執行緒**
  • 所有執行緒共享**同一虛擬記憶體空間**
  • SGA 直接以 VirtualAlloc()/malloc() 分配於進程堆疊
  • 無需 `shmat()`,執行緒天然可見 SGA 位址
  • 背景進程 (DBW0, LGWR...) 皆為執行緒

三、架構對比圖解

┌─────────────────────────────────────────────────────────────────┐
│                        UNIX 架構                                 │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐             │
│  │ PMON    │  │ SMON    │  │ DBW0    │  │ Server  │  ...        │
│  │ Process │  │ Process │  │ Process │  │ Process │             │
│  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘             │
│       │            │            │            │                   │
│       └────────────┴────────────┴────────────┘                   │
│                    │                                             │
│            shmat() │                                             │
│                    ▼                                             │
│         ┌─────────────────────┐                                  │
│         │   SGA Shared Memory │  (Single Segment)                │
│         │   Segment (shmid)   │                                  │
│         └─────────────────────┘                                  │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                        Windows 架構                              │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    oracle.exe Process                    │   │
│  │  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐           │   │
│  │  │PMON  │ │SMON  │ │DBW0  │ │Server│ │Server│  ...      │   │
│  │  │Thread│ │Thread│ │Thread│ │Thread│ │Thread│           │   │
│  │  └──────┘ └──────┘ └──────┘ └──────┘ └──────┘           │   │
│  │                                                         │   │
│  │  ┌─────────────────────────────────────────────────┐   │   │
│  │  │              SGA (Process Heap)                 │   │   │
│  │  └─────────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

四、關鍵差異影響分析

層面UNIX 多進程Windows 多執行緒
進程隔離強 (崩潰不波及他進程)弱 (單一進程崩潰全掛)
Context Switch 開銷較大 (進程切換)較小 (執行緒切換)
記憶體保護進程級 (mprotect)需靠執行緒協作
大頁面支援成熟 (HugePages)Large Pages 支援良好
除錯/追蹤gdb/pstack 附掛進程Windbg 附掛進程/執行緒
擴展性上限受限於 OS 進程上限 (pid_max)受限於虛擬記憶體/執行緒堆疊

五、SGA 內部組件與 Granule

  • SGA 以 **Granule (顆粒)** 為分配單位:< 1GB → 4MB,≥ 1GB → 16MB
  • 動態調整 (`ALTER SYSTEM SET db_cache_size=...`) 以 Granule 為單位增減
  • 各組件在共享記憶體段中連續或分散分佈

六、驗證與監控


-- 查看 SGA 組件大小
SELECT component, current_size/1024/1024 AS mb 
FROM v$sga_dynamic_components;

-- UNIX: 查看共享記憶體段
! ipcs -m
# 輸出範例:
# 0x00000000  12345678  oracle   660   2097152  4  (2GB SGA)

-- Windows: 查看進程記憶體
! tasklist /FI "IMAGENAME eq oracle.exe" /FO LIST
# 或使用 VMMap / Process Explorer 觀察 Heap/Shared Memory 區域

七、最佳實踐建議

  1. UNIX 啟用 HugePages:vm.nr_hugepages = SGA_GB * 512 (2MB 頁),減少頁表、避免 Swap
  2. Windows 設定 Large Pages:授予 Lock Pages in Memory 權限給 Oracle 服務帳號
  3. SGA_MAX_SIZE 設定上限:防止動態增長耗盡共享記憶體段
  4. 監控 V$SGA_RESIZE_OPS:頻繁縮放暗示記憶體壓力
  5. 避免 32 位元 Oracle:虛擬位址空間 4GB 限制嚴重制約 SGA 大小

結語

SGA 是 Oracle 實例的「心臟」,UNIX 採用 **System V Shared Memory + 多進程附掛**,Windows 採用 **單進程多執行緒 + 共享堆疊**。兩種模型各有優劣,但對 DBA 而言,關鍵在於:理解底層機制差異、正確配置 OS 級記憶體參數 (HugePages/Large Pages)、監控動態調整行為。這才是穩定高效運行 Oracle 的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved