【Oracle篇】Windows平台单进程多线程架构设计与实现(比对Linux多进程架构)

💫《博主主页》:

           🔎 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跨平台适配的冰山一角,因此我们还是需要不断的学习才能更好的跟上技术潮流💫

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86039.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在微服务中使用 Sentinel

在微服务中集成 Sentinel 1. 添加依赖 对于 Spring Cloud 项目&#xff0c;首先需要添加 Sentinel 的依赖&#xff1a; <!-- Spring Cloud Alibaba Sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-…

中断控制与实现

一、中断基本概念 1、中断 中断是一种异步事件&#xff0c;用于通知处理器某个事件已经发生&#xff0c;需要处理器立即处理。由于I/O操作的不确定因素以及处理器和I/O设备之间的速度不匹配&#xff0c;I/O设备可以通过某种硬件信号异步唤醒对应的处理器的响应&#xff0c;这些…

前端跨域解决方案(7):Node中间件

1 Node 中间件核心 1.1 为什么开发环境需要 Node 代理&#xff1f; 在前端开发中&#xff0c;我们常遇到&#xff1a;前端运行在localhost:3000&#xff0c;后端 API 在localhost:4000&#xff0c;跨域导致请求失败。而传统解决方案有以下局限性&#xff1a; 修改后端 CORS 配…

iwebsec靶场-文件上传漏洞

01-前端JS过滤绕过 1&#xff0c;查看前端代码对文件上传的限制策略 function checkFile() { var file document.getElementsByName(upfile)[0].value; if (file null || file "") { alert("你还没有选择任何文件&a…

GitHub 趋势日报 (2025年06月23日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 390 suna 387 system-prompts-and-models-of-ai-tools 383 Web-Dev-For-Beginners…

告别水印烦恼,一键解锁高清无痕图片与视频!

在这个数字化飞速发展的时代&#xff0c;无论是设计小白还是创意达人&#xff0c;都可能遇到这样的困扰&#xff1a;心仪的图片或视频因水印而大打折扣&#xff0c;创意灵感因水印而受限。别急&#xff0c;今天就为大家带来几款神器&#xff0c;让你轻松告别水印烦恼&#xff0…

LangChain4j在Java企业应用中的实战指南:构建RAG系统与智能应用-2

LangChain4j在Java企业应用中的实战指南&#xff1a;构建RAG系统与智能应用-2 开篇&#xff1a;LangChain4j框架及其在Java生态中的定位 随着人工智能技术的快速发展&#xff0c;尤其是大语言模型&#xff08;Large Language Models, LLMs&#xff09;的广泛应用&#xff0c;…

Cola StateMachine 的无状态(Stateless)特性详解

Cola StateMachine 的无状态&#xff08;Stateless&#xff09;特性详解 在现代分布式系统中&#xff0c;无状态设计是构建高可用、可扩展服务的关键原则之一。Cola StateMachine 作为一款轻量级的状态机框架&#xff0c;通过其独特的设计理念实现了良好的无状态特性。本文将深…

使用事件通知来处理页面回退时传递参数和赋值问题

背景。uniapp开发微信小程序。在当前页面需要选择条件&#xff0c;如选择城市。会打开新的页面。此时选择之后需要关闭页面回到当初的页面。但问题出现了。onLoad等事件是不会加载的。相关链接。uniapp页面通讯说明使用事件通知来处理页面回退时传递参数和赋值问题 页面之间的…

腾讯云COS“私有桶”下,App如何安全获得音频调用流程

流程图 #mermaid-svg-Phy4VCltBRZ90UH8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Phy4VCltBRZ90UH8 .error-icon{fill:#552222;}#mermaid-svg-Phy4VCltBRZ90UH8 .error-text{fill:#552222;stroke:#552222;}#me…

基于深度学习的侧信道分析(DLSCA)Python实现(带测试)

一、DLSCA原理介绍 基于深度学习的侧信道分析(DLSCA)是一种结合深度神经网络与侧信道分析技术的密码分析方法。该方法利用深度学习模型从能量消耗、电磁辐射等侧信道信息中提取与密钥相关的特征模式。相比传统分析方法&#xff0c;DLSCA能够自动学习复杂的特征关系&#xff0c…

云原生 CAD 让制造业设计协同更便捷

随着互联网、云计算技术的突飞猛进&#xff0c;CAD向着网络化、协同化的方向快速发展&#xff0c;云CAD软件逐渐映入人们的眼帘。云原生CAD不仅打破了传统CAD软件对硬件配置的依赖&#xff0c;更以数据驱动的协同创新模式&#xff0c;重塑了制造业的产品研发流程与组织协作形态…

Docker容器核心操作指南:`docker run`参数深度解析

技术聚焦 作为容器化技术的起点&#xff0c;docker run命令承担着90%的容器创建工作。其关键参数-d&#xff08;后台模式&#xff09;与-it&#xff08;交互模式&#xff09;的合理运用&#xff0c;直接影响容器行为模式与运维效率。本文将深度拆解两大模式的应用场景与…

基于单片机的语音控制设计(论文)

摘要 自然语音作为人机交互在目前得以广泛的应用以及极大的发展前景。该设计介绍了基于非指定人语音芯片LD3320的语音控制器结构及其实现语音控制的方法。该语音控制器利用STM32F103C8T6单片机作为主要控制器&#xff0c;控制芯片对输入的进行语音识别并处理&#xff0c;根据语…

【论文阅读 | CVPRW 2023 |CSSA :基于通道切换和空间注意力的多模态目标检测】

论文阅读 | CVPRW 2023 |CSSA &#xff1a;基于通道切换和空间注意力的多模态目标检测 1.摘要&&引言2.方法2.1 框架概述2.2 通道切换通道注意力2.3 空间注意力 3. 实验3.1 实验设置3.1.1 数据集3.1.2 实现细节3.1.3 评估指标 3.2 对比研究3.2.1 定量结果3.2.2 定性结果…

《前端资源守卫者:SRI安全防护全解析》

SRI&#xff08;子资源完整性&#xff09;作为守护前端安全的隐形盾牌&#xff0c;以精妙的技术设计构建起资源验证防线。深入理解其工作逻辑与配置方法&#xff0c;是每位前端开发者筑牢应用安全的必修课。 SRI的核心价值&#xff0c;在于为外部资源打造独一无二的“数字身份…

项目需求评审报告参考模板

该文档是需求评审报告模板 内容涵盖评审基础信息,如项目名称、评审时间、地点、级别、方式等;包含评审签到表,记录角色、部门、职务、姓名等信息;还有评审工作量统计相关内容;以及评审问题跟踪表,记录问题描述、状态、解决人及时限等,还附有填表说明,对评审适用范围、工…

从依赖进口到自主创新:AI 电子设计系统如何重塑 EDA 全流程

EDA全称是Electronic Design Automation&#xff0c;即电子设计自动化&#xff0c;是利用计算机软件完成电路设计、仿真、验证等流程的设计工具&#xff0c;贯穿于芯片和板级电路设计、制造、测试等环节&#xff0c;是不可或缺的基础设计工具。 EDA与电子材料、装备是电子信…

前端工程化之微前端

微前端 微前端基本知识主要的微前端框架iframe优点&#xff1a;缺点&#xff1a; single-spa示例主应用spa-root-config.jsmicrofrontend-layout.htmlindex.ejs 子应用spa-react-app2.jsroot.component.js 修改路由spa-demo/microfrontend-layout.htmlspa-demo/react-app1/webp…

MemcacheRedis--缓存服务器理论

Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、 提高可扩展性。 缓存服务器作用: 加快访问速度 ,缓解数据库压力 1. memcached&#xff08;单节点在用&#xff09; 1.1 特点 1…