📢 先给各位来个灵魂拷问💡:当Oracle在Linux上跑着十几个进程(PMON、SMON、DBWn...)时,它在Windows上会跑几个进程?
A. 10个+(Linux直呼内行)B. 1个(Windows表示要精简)C. 看心情(DBA的血压也跟着看心情)
…正确答案是B,是不是和各位大佬想的不一样!(此刻无数DBA和小伙伴已同步按下Ctrl+Shift+Esc,开始对着Windows任务管理器陷入沉思……)
作为一个和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多进程架构进行对比,最后演示如何通过“Administration Assistant for Windows”工具查询对应会话的线程ID。
特别说明💥:本篇文章部分理论性知识点均来源于版权归 Oracle 所有的官方公开文档手册,并结合了我个人的解读和案例演示。若需要调整,请联系,会尽快处理😄
官方文档对于Oracle在Windows平台上单进程多线程架构的介绍(Oracle 12c):
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ntqrf/overview-of-oracle-database-on-windows-architecture.html#GUID-0F2F5235-69CB-4A77-908E-B9BFFACB286A
官方文档对于Oracle在Linux平台上多进程架构的介绍(Oracle 12c):
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/cncpt/introduction-to-oracle-database.html#GUID-A42A6EF0-20F8-4F4B-AFF7-09C100AE581E
收藏
加关注 

如下图是Windows上的Oracle数据库体系结构,这里博主就直接上官方文档上的截图了,反而比博主直接手绘更直观。

Oracle实例在Windows服务上运行(这是一个注册到操作系统的后台进程),该服务由Windows启动,无需用户交互即可启动。它包含访问数据库所需的内存结构和线程。
客户端通过一个线程连接到Oracle实例,线程直接与进程监控器连接。内存结构包括共享池、库缓存、数据字典缓存、数据库缓冲缓存和重做日志缓冲区。
图中可以看到线程包括数据库写入线程、日志写入线程、内存管理线程、进程监控线程、进程派生线程、系统监控线程、检查点处理线程(Windows平台默认运行)、分布式恢复后台线程,以及归档处理线程(在数据库可用时是可选的)。
并且该Oracle实例包含数据文件、控制文件和重做日志文件。与数据库相关的还有参数文件、密码文件和归档日志文件。
在Windows上运行的Oracle数据库的内部进程架构采用基于线程的设计,线程是进程内运行程序指令的对象。线程允许在单个进程内实现并发操作,使进程能够在不同处理器上同时运行程序的不同部分。基于线程的架构具有以下优势:
在内部实现上,线程模型的代码结构紧凑,与Oracle数据库主体代码分离。异常处理程序和例程会跟踪并释放资源,从而增强健壮性,避免因资源泄漏或程序异常导致的停机。
在Windows上,Oracle数据库或Oracle自动存储管理实例(包含线程和内存结构)是一个Windows服务:即向操作系统注册的后台进程。该服务由Windows启动,无需用户交互即可运行,使得数据库能够在计算机启动时自动打开。
当在Windows上运行多个Oracle数据库或Oracle自动存储管理实例时,每个实例都运行自己的Windows服务,并包含多个组件线程。每个线程对于数据库可用性都是必需的,或者是特定平台的可选线程。根据配置不同,后台进程会读写各种数据文件。
左右拉动查看完整表格 ⬅️➡️
PS小提示:通过如下SQL查看正在运行的线程。
SQL> select * from v$bgprocess where paddr <> '00'; 关于Oracle在Windows平台上单进程多线程架构就介绍到这里,一个oracle.exe进程扛下所有🏃♂️。下面也简单介绍一下Linux多进程架构并对比一下它们之间的区别🤷♂️。

如下图是Linux上的Oracle数据库体系结构,这里博主就直接上官方文档上的截图了,反而比博主直接手绘更直观。

Oracle数据库在Linux平台上采用经典的多进程架构设计,这种架构通过功能划分实现了高效的资源管理和系统稳定性。如图所示,整个体系由多个协同工作的进程组成,每个进程承担特定的职责。
系统全局区(SGA):SGA是Oracle实例的核心内存结构,包含多个关键子区域:
后台进程:Oracle的主要后台进程包括:
程序全局区(PGA):每个服务器进程拥有独立的PGA,包含:
各进程通过共享内存(SGA)和信号量进行通信,确保数据一致性和系统协调运行。这种设计既保证了各进程的独立性,又实现了高效的数据共享。
左右拉动查看完整表格 ⬅️➡️
1.操作系统内核设计差异
fork()系统调用优化(写时复制技术)2.性能优化考量
3.平台兼容性需求
4.开发维护成本

以下是整理成表格形式的Oracle数据库在Windows和UNIX平台的主要差异,完整说明请参考官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ntqrf/oracle-database-differences-on-windows-and-unix.html
左右拉动查看完整表格 ⬅️➡️
了解了上面的内容,大家都知道了Oracle在Wndows上采用的是单进程多线程架构,因此,0race一旦启动,在任务管理器里只能看到一个oracle.exe的进程。如果想要查看Oracle的各个后台进程(Linux系统下的称谓),例如PMON、SMON、DBWn、LGWR、CKPT等,或者需要看哪些用户进程、服务器进程,可以通过如下几个步骤实现:
(属于网页连接数据库时必要开启的)。(非必须启动)




可以看到当前orcl实例下的所有用户进程、服务器进程、后台进程(如PMON、SMON、DBWn等),这样就可以按照SQL查出的线程ID对对应的线程在系统层面进行终止操作啦!

Oracle数据库在Windows和Linux平台展现了截然不同的架构设计:Windows采用单进程多线程模型🧵,像一个全能选手;Linux则是多进程架构👥,如专业团队分工。这体现了Oracle对不同操作系统的深度适配与架构智慧✨。当然这种差异仅仅是Oracle跨平台适配的冰山一角,因此我们还是需要不断的学习才能更好的跟上技术潮流💫