💫《博主主頁》:
? ? ? ? ? ?🔎?CSDN主頁__奈斯DB
? ? ? ? ? ?🔎?IF Club社區主頁__奈斯、
🔥《擅長領域》:擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控;并對SQLserver、NoSQL(MongoDB)有了解
💖如果覺得文章對你有所幫助,歡迎點贊收藏加關注💖
📢 先給各位來個靈魂拷問💡:當Oracle在Linux上跑著十幾個進程(PMON、SMON、DBWn...)時,它在Windows上會跑幾個進程?
A. 10個+(Linux直呼內行)
B. 1個(Windows表示要精簡)
C. 看心情(DBA的血壓也跟著看心情)
...正確答案是B,但故事遠比你想象的精彩!
? ? 作為一個和Oracle打交道的老司機,第一次在Windows上看到這個現象時,差點以為數據庫沒啟動成功😂 —— Windows“任務管理器”里孤零零的一個oracle.exe,說好的多進程架構呢?那么今天這邊文章給大家介紹一下windows上進程架構的變化,眾所周知在Linux上Oracle是多進程架構,但這一架構在windows上發生了變化,變成了單進程多線程架構。
? ? 博主之前系統學習過Oracle的進程結構,所以自然而然的就以為windows上也是多進程架構(我相信大部分人應該也都這樣認為),這一觀點在Linux/Unix環境下完全正確?,但在Windows平臺卻存在根本性差異?。
? ? 了解到windows單進程多線程這個知識點還是挺湊巧的,當時公司有Oracle在Windows系統上部署,需要我協助處理一個死鎖問題,Linux系統上通常會通過 ps -ef | grep ora_命令 查看后臺相關死鎖進程📊,所以按照之前的Linux架構理解,就直接右鍵打開了“任務管理器”結果發現并沒有相關的進程在后面(PS:“任務管理器”是查看windows上運行的進程、用戶、服務等的,和Linux上通過 ps -ef | grep ora_命令查看后臺進程是一個道理),然而“任務管理器”中只顯示了一個oracle.exe進程和Oracle相關🖥?,自己也就蒙了,為啥沒有其他Oracle相關的進程號,查閱官方文檔才知道,Oracle在windows變成了單進程多線程架構,Oracle在Windows平臺采用了完全不同的線程架構實現,所有用戶進程、服務器進程、后臺進程(如PMON、SMON、DBWn等)均以線程形式運行在同一個oracle.exe進程地址空間中 🧵,所以并不能通過“任務管理器”查看,需要通過“Administration Assistant for Windows”管理工具來查看Oracle實例進程下的所有線程,那么帶著這個問題給大家分享一下Windows平臺單進程多線程架構設計與實現,并比對Linux多進程架構。
? ? ? ? ? ? ? ? ? ?
特別說明💥:本篇文章部分理論性知識點均來源于版權歸 Oracle 所有的官方公開文檔手冊,并結合了我個人的理解和案例演示。如有問題,請聯系,會盡快處理。轉載請標明出處😄
? ? ? ? ? ? ? ? ? ??
官方文檔對于Oracle在Windows平臺上單進程多線程架構的介紹(Oracle 12c):
Overview of Oracle Database on Windows Architecture
?? ? ? ? ? ? ? ??
官方文檔對于Oracle在Linux平臺上多進程架構的介紹(Oracle 12c):
Introduction to Oracle Database
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
目錄
Oracle在Windows平臺上單進程多線程架構:
Oracle在Linux平臺上多進程架構:
單進程多線程 VS 多進程:
windows上查看Oracle后臺線程:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
Oracle在Windows平臺上單進程多線程架構:
?? ? 如下圖是Windows上的Oracle數據庫體系結構,這里博主就直接上官方文檔上的截圖了,反而比博主直接手繪更直觀。
? ? Oracle實例在Windows服務上運行(這是一個注冊到操作系統的后臺進程),該服務由Windows啟動,無需用戶交互即可啟動。它包含訪問數據庫所需的內存結構和線程。
? ? 客戶端通過一個線程連接到Oracle實例,線程直接與進程監控器連接。內存結構包括共享池、庫緩存、數據字典緩存、數據庫緩沖緩存和重做日志緩沖區。
? ? 圖中可以看到線程包括數據庫寫入線程、日志寫入線程、內存管理線程、進程監控線程、進程派生線程、系統監控線程、檢查點處理線程(Windows平臺默認運行)、分布式恢復后臺線程,以及歸檔處理線程(在數據庫可用時是可選的)。
? ? 并且該Oracle實例包含數據文件、控制文件和重做日志文件。與數據庫相關的還有參數文件、密碼文件和歸檔日志文件。
? ? 在Windows上運行的Oracle數據庫的內部進程架構采用基于線程的設計,線程是進程內運行程序指令的對象。線程允許在單個進程內實現并發操作,使進程能夠在不同處理器上同時運行程序的不同部分。基于線程的架構具有以下優勢:
更快的上下文切換
更簡單的系統全局區分配機制,因為不需要使用共享內存
更快地創建新連接,因為線程比進程創建速度更快
減少內存使用,因為線程比進程共享更多數據結構
? ? 在內部實現上,線程模型的代碼結構緊湊,與Oracle數據庫主體代碼分離。異常處理程序和例程會跟蹤并釋放資源,從而增強健壯性,避免因資源泄漏或程序異常導致的停機。
? ? 在Windows上,Oracle數據庫或Oracle自動存儲管理實例(包含線程和內存結構)是一個Windows服務:即向操作系統注冊的后臺進程。該服務由Windows啟動,無需用戶交互即可運行,使得數據庫能夠在計算機啟動時自動打開。
? ? 當在Windows上運行多個Oracle數據庫或Oracle自動存儲管理實例時,每個實例都運行自己的Windows服務,并包含多個組件線程。每個線程對于數據庫可用性都是必需的,或者是特定平臺的可選線程。根據配置不同,后臺進程會讀寫各種數據文件。
? ? ? ? ? ? ? ? ?
Oracle在Windows平臺上所需的部分重要線程舉例:
線程
描述
必選/可選
DBWO
數據庫寫入線程
所需
LGWR
日志寫入線程
所需
MMAN
內存管理線程
所需
PMON
進程監控線程
所需
PSPO
進程派生線程
所需
SMON
系統監控線程
所需
CKPT
檢查點處理線程(Windows平臺默認運行)
所需
ARCO
歸檔處理線程(Windows平臺)
所需
RECO
分布式恢復后臺線程
所需
PS小提示:通過如下SQL查看正在運行的線程。
SQL> select * from v$bgprocess where paddr <> '00';
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? 關于Oracle在Windows平臺上單進程多線程架構就介紹到這里,一個oracle.exe進程扛下所有🏃?♂?。下面也簡單介紹一下Linux多進程架構并對比一下它們之間的區別🤷?♂?。
? ? ? ? ? ? ? ? ??
Oracle在Linux平臺上多進程架構:
? ? 如下圖是Linux上的Oracle數據庫體系結構,這里博主就直接上官方文檔上的截圖了,反而比博主直接手繪更直觀。
? ? Oracle數據庫在Linux平臺上采用經典的多進程架構設計,這種架構通過功能劃分實現了高效的資源管理和系統穩定性。如圖所示,整個體系由多個協同工作的進程組成,每個進程承擔特定的職責。
? ? ? ? ? ? ? ? ? ? ? ? ?
核心架構組件
1. 系統全局區(SGA):SGA是Oracle實例的核心內存結構,包含多個關鍵子區域:
共享池(Shared Pool):存儲SQL解析樹和執行計劃
數據庫緩沖區(Database Buffer Cache):緩存數據塊
重做日志緩沖區(Redo Log Buffer):臨時存儲重做記錄
大型池(Large Pool):為特定操作提供內存分配
.............
2. 后臺進程:Oracle的主要后臺進程包括:
DBWn (Database Writer):負責將修改后的數據塊寫入數據文件
LGWR (Log Writer):將重做日志緩沖區內容寫入在線重做日志文件
CKPT (Checkpoint):觸發檢查點,同步數據文件
SMON (System Monitor):執行系統級清理和恢復
PMON (Process Monitor):監控用戶進程狀態并處理異常終止
.............
3. 程序全局區(PGA):每個服務器進程擁有獨立的PGA,包含:
私有SQL區域
會話內存
SQL工作區
? ? ? ? ? ? ??
進程間協作機制
? ? 各進程通過共享內存(SGA)和信號量進行通信,確保數據一致性和系統協調運行。這種設計既保證了各進程的獨立性,又實現了高效的數據共享。
? ? ? ? ? ? ? ? ? ? ??
單進程多線程 VS 多進程:
一、架構對比
特性 Windows單進程多線程架構 Linux多進程架構 執行單元 單進程(ORACLE.EXE)內多線程 多個獨立進程(PMON/SMON/DBWn等) 內存管理 共享同一進程地址空間 各進程有獨立地址空間 上下文切換 線程切換(約1-2微秒) 進程切換(約5-10微秒) 故障隔離 線程崩潰可能影響整個實例 進程崩潰通常不會波及其他組件 監控方式 需專用工具查看線程(v$bgprocess視圖) 直接通過 ps -ef
命令查看典型部署 注冊為Windows服務 以守護進程(daemon)形式運行
二、Windows采用單進程多線程的深層原因
1. 操作系統內核設計差異
Windows線程模型優勢:
原生線程調度器更高效(基于NT內核的線程優先級機制)
進程創建開銷大(約100ms/進程 vs 線程創建約10ms)
Linux特性:
fork()
系統調用優化(寫時復制技術)進程間通信(IPC)效率高(共享內存/信號量成熟)
2. 性能優化考量
連接創建速度:
Windows線程創建比進程快5-10倍
對于OLTP高頻短連接場景優勢明顯
內存占用:
Windows線程:共享SGA/PGA,節省30%+內存
Linux進程:每個連接需獨立PGA分配
3. 平臺兼容性需求
Windows早期版本(如NT 4.0)對POSIX進程支持有限
服務化集成要求(必須符合Windows Service Control Manager規范)
4. 開發維護成本
統一代碼庫:通過
#ifdef _WIN32
條件編譯實現跨平臺避免為Windows重寫全套IPC機制(直接使用線程同步原語)
三、關鍵差異可視化:
內存共享方式:
Windows:自動共享(進程內)
Linux:需顯式配置IPC
故障影響范圍:
Windows:線程崩潰影響整個方框
Linux:單個進程崩潰不影響其他組件
四、Oracle數據庫在Windows與UNIX平臺的差異(官方文檔):
? ? 以下是整理成表格形式的Oracle數據庫在Windows和UNIX平臺的主要差異,完整說明請參考官方文檔:Oracle Database Differences on Windows and UNIX
功能類別 UNIX/Linux平臺特性 Windows平臺特性 進程架構 多進程/線程混合模式(12.2+) 單進程多線程 自動啟停 需要配置多個目錄下的初始化腳本 作為Windows服務自動管理 后臺作業 完善的批處理控制機制 通過任務計劃程序實現 診斷工具 使用sar、vmstat等專用工具 使用性能監視器和WMI 磁盤寫入 支持繞過文件系統緩存直寫 同樣支持繞過文件系統緩存直寫 動態庫 使用.so共享庫 使用DLL動態鏈接庫 安裝賬戶 需要創建oracle用戶和DBA組,禁止使用root賬戶 使用Windows賬戶體系 DB_WRITERS 通過參數配置多個寫入進程 自動線程化管理 內存管理 默認內核配置通常需要手動優化 自動適配系統資源 分布式事務 無原生對應組件 通過MS DTC實現 多Oracle Home 嚴格遵循OFA規范 簡化安裝路徑管理 存儲選項 支持文件系統和原始分區 主要使用文件系統 服務管理 使用守護進程(daemon) 作為Windows服務運行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
windows上查看Oracle后臺線程:
? ? 了解了上面的內容,大家都知道了Oracle在Wndows上采用的是單進程多線程架構,因此,0race一旦啟動,在任務管理器里只能看到一個oracle.exe的進程。如果想要查看Oracle的各個后臺進程(Linux系統下的稱謂),例如PMON、SMON、DBWn、LGWR、CKPT等,或者需要看哪些用戶進程、服務器進程,可以通過如下幾個步驟實現:
? ? ??
1)先查看Windows上運行了那些Oracle后臺服務:服務器管理器——工具——服務
- Oracle ORCL VSS Writer Service:Oracle卷映射拷貝寫入服務,VSS(Volume Shadow Copy Service)能夠讓存儲基礎設備(比如磁盤,陣列等)創建高保真的時間點映像,即映射拷貝(shadow copy)。它可以在多卷或者單個卷上創建映射拷貝,同時不會影響到系統的系統能。(非必須啟動)
- OracleDBConsoleorcl:Oracle數據庫控制臺服務,orcl是Oracle的實例標識,默認的實例為orcl。oracle健康檢查專家塞姆說,在運行Enterprise Manager(企業管理器OEM)的時候,需要啟動這個服務(屬于網頁連接數據庫時必要開啟的)。(非必須啟動)
- OracleJobSchedulerORCL:Oracle作業調度(定時器)服務,ORCL是Oracle實例標識。(非必須啟動)
- OracleMTSRecoveryService:服務端控制。oracle健康檢查專家塞姆說,該服務允許數據庫充當一個微軟事務服務器MTS、COM/COM+對象和分布式環境下的事務的資源管理器。(非必須啟動)
- OracleOraDb11g_home1ClrAgent:Oracle數據庫.NET擴展服務的一部分。 (非必須啟動)
- OracleOraDb11g_home1TNSListener:監聽器服務,服務只有在數據庫需要遠程訪問的時候才需要。(非必須啟動)。
- OracleServiceORCL:數據庫服務(數據庫實例),是Oracle核心服務該服務,是數據庫啟動的基礎, 只有該服務啟動,Oracle數據庫才能正常啟動。(必須啟動)
?? ? ? ?
2)首先打開“任務管理器”,可以看到oracle的主進程oracle.exe。注意:在任務管理器運行的進程其實就是Windows服務,那個服務打開了在任務管理器就可以看到
? ? ? ? ? ? ? ? ??
3)在Windows上查看主進程oracle.exe的各個線程,在所有程序中找到“Administration Assistant for Windows”工具
?? ? ? ? ? ? ? ??
4)找到數據庫(實例),右鍵對應的實例,選擇“進程信息”,就可以看到后臺線程,當然也看到看到所有的用戶、服務器線程
? ??可以看到當前orcl實例下的所有用戶進程、服務器進程、后臺進程(如PMON、SMON、DBWn等),這樣就可以按照SQL查出的線程ID對對應的線程在系統層面進行終止操作啦!
? ? Oracle數據庫在Windows和Linux平臺展現了截然不同的架構設計:Windows采用單進程多線程模型🧵,像一個全能選手包攬所有工作;Linux則采用多進程架構👥,如同專業團隊分工協作。這種差異不僅體現了Oracle對不同操作系統的深度適配,更揭示了企業級軟件的架構智慧?。當然這種差異僅僅是Oracle跨平臺適配的冰山一角,因此我們還是需要不斷的學習才能更好的跟上技術潮流💫
? ??