15. 进程架构
15.1. 进程简介
进程是操作系统中可以运行一系列步骤的机制。这个机制取决于操作系统。例如,在 Linux 上,Oracle 后台进程是一个 Linux 进程。在 Windows 上,Oracle 后台进程是进程内的执行线程。代码模块由进程运行。所有连接到 Oracle 数据库的用户都必须运行以下模块才能访问数据库实例:
■ 应用程序或 Oracle 数据库实用程序
数据库用户运行数据库应用程序,例如预编译程序或数据库工具(如 SQL*Plus),它向数据库发出 SQL 语句。
■ Oracle 数据库代码
每个用户都有代表他们执行的 Oracle 数据库代码,解释和处理应用程序的 SQL 语句。
进程通常在其自己的私有内存区域中运行。大多数进程可以定期写入关联的跟踪文件(见第 13-21 页的“跟踪文件”)。
15.1.1. 多进程Oracle数据库系统
多进程 Oracle(也称为多用户 Oracle)使用多个进程来运行 Oracle 数据库代码的不同部分,以及为用户额外提供的进程——每个连接用户一个进程,或者多个用户共享一个或多个进程。大多数数据库都是多用户的,因为数据库的一个主要优势是同时管理多个用户所需的数据。
数据库实例中的每个进程执行一个特定任务。通过将数据库和应用程序的工作分成几个进程,多个用户和应用程序可以同时连接到一个实例,同时系统提供良好的性能。
15.1.2. 进程类型
数据库实例包含或与以下类型的进程交互:
■ 客户端进程运行应用程序或 Oracle 工具代码。
■ Oracle 进程运行 Oracle 数据库代码。Oracle 进程包括以下子类型:
– 后台进程与数据库实例一起启动,并执行维护任务,如执行实例恢复、清理进程、将重做缓冲区写入磁盘等。
– 服务器进程根据客户端请求执行工作。 例如,这些进程解析 SQL 查询,将它们放置在共享池中,为每个查询创建并执行查询计划,并从数据库缓冲区缓存或磁盘读取缓冲区。
注意:服务器进程及其在这些进程中分配的进程内存在实例中运行。当服务器进程终止时,实例继续运行。
– 从属进程为后台进程或服务器进程执行额外的任务。
进程结构根据操作系统和选择的 Oracle 数据库选项而有所不同。例如,可以为连接的用户配置专用服务器或共享服务器连接的代码。在共享服务器架构中,每个运行数据库代码的服务器进程可以为多个客户端进程提供服务。
图 15-1 显示了一个使用专用服务器连接的系统全局区域(SGA)和后台进程。对于每个用户连接,应用程序由一个客户端进程运行,该进程与运行数据库代码的专用服务器进程不同。每个客户端进程都与其自己的服务器进程相关联,每个服务器进程都有自己的程序全局区域(PGA)。
15.2. 客户端进程概述
当用户运行诸如 ProC 程序或 SQLPlus 之类的应用程序时,操作系统会创建一个客户端进程(有时称为用户进程)来运行用户应用程序。客户端应用程序中链接了 Oracle 数据库库,这些库提供了与数据库通信所需的 API。
15.2.1. 客户端和服务端进程
客户端进程与直接与实例交互的 Oracle 进程在重要方面有所不同。为客户端进程服务的 Oracle 进程可以读取和写入 SGA,而客户端进程则不能。客户端进程可以在数据库主机以外的主机上运行,而 Oracle 进程则不能。
例如,假设客户端主机上的一个用户启动 SQL*Plus 并通过网络连接到不同主机上的数据库 sample(数据库实例尚未启动):
SQL> CONNECT SYS@inst1 AS SYSDBA
Enter password: ***********
Connected to an idle instance.
在客户端主机上,搜索 sqlplus 或 sample 的进程只显示 sqlplus 客户端进程:
% ps -ef | grep -e sample -e sqlplus | grep -v grep
clientuser 29437 29436 0 15:40 pts/1 00:00:00 sqlplus
as sysdba
在数据库主机上,搜索 sqlplus 或 sample 的进程显示有一个非本地连接的服务器进程,但没有客户端进程:
% ps -ef | grep -e sample -e sqlplus | grep -v grep
serveruser 29441 1 0 15:40 ?
00:00:00 oraclesample (LOCAL=NO)
15.2.2. 连接与会话
连接是客户端进程和数据库实例之间的物理通信路径。通信路径是使用可用的进程间通信机制或网络软件建立的。通常,连接发生在客户端进程和服务器进程或调度器之间,也可以发生在客户端进程和 Oracle 连接管理器(CMAN)之间。会话是数据库实例内存中的一个逻辑实体,代表当前用户登录到数据库的状态。例如,当用户通过密码被数据库认证时,就会为这个用户建立一个会话。会话从用户被数据库认证的时间持续到用户断开连接或退出数据库应用程序的时间。
单个连接上可以建立 0 个、1 个或多个会话。这些会话是独立的:一个会话中的提交不会影响其他会话中的事务。
注意:如果配置了 Oracle Net 连接池,那么连接可能会断开,但会话保持不变。
单个数据库用户可以同时存在多个会话。如图15-2 所示,用户hr可以有多个数据库连接。在专用服务器连接中,数据库会为每个连接创建一个服务器进程。只有导致创建专用服务器的客户端进程才会使用它。在共享服务器连接中,多个客户端进程访问单一的共享服务器进程。
图 15-3 展示了一个情况,用户hr只有一个数据库连接,但这个连接有两个会话。
生成 SQL 语句执行统计信息的自动跟踪报告重现了图 15-3 中的场景。示例 15-2 将 SQL*Plus 连接到数据库作为 SYSTEM 用户,并启用跟踪,从而创建了一个新的会话(包括示例输出)。
示例 15-1中的DISCONNECT命令实际上结束的是会话,而不是连接。打开一个新的终端并以不同的用户身份连接到实例,示例15-2中的查询显示示例 15-1中的连接仍然是活跃的。
15.3. 服务端进程概述
Oracle 数据库创建服务器进程来处理连接到实例的客户端进程的请求。客户端进程总是通过单独的服务器进程与数据库通信。
代表数据库应用程序创建的服务器进程可以执行以下一项或多项任务:
■ 解析和运行应用程序发出的 SQL 语句,包括创建和执行查询计划(见第 7-15 页的“SQL 处理阶段”)
■ 执行 PL/SQL 代码
■ 将数据块从数据文件读入数据库缓冲区缓存(DBWn 后台进程的任务是将修改后的块写回磁盘)
■ 以应用程序可以处理信息的方式返回结果
15.3.1. 专有服务器进程
在专用服务器连接中,客户端连接与一个且仅一个服务器进程相关联(见第 16-9 页的“专用服务器架构”)。在 Linux 上,20 个客户端进程连接到数据库实例由 20 个服务器进程提供服务。每个客户端进程直接与其服务器进程通信。这个服务器进程在会话期间专门用于其客户端进程。服务器进程在其 PGA 中存储进程特定信息和 UGA(见第 14-7 页的“专用和共享服务器模式下的 PGA 使用情况”)。
15.3.2. 共享服务器进程
在共享服务器连接中,客户端应用程序通过网络连接到一个调度进程,而不是服务器进程(见第 16-11 页的“共享服务器架构”)。例如,20 个客户端进程可以连接到一个单独的调度进程。
调度进程接收来自客户端的请求,并将它们放入大池中的请求队列(见第 14-21 页的“大池”)。第一个可用的共享服务器进程从队列中取出请求并处理它。之后,共享服务器将结果放入调度响应队列。调度进程监控这个队列,并将结果传输给客户端。
像专用服务器进程一样,共享服务器进程有自己的 PGA。然而,会话的 UGA 位于 SGA 中,以便任何共享服务器都可以访问会话数据。
15.4. 后台进程概述
多进程 Oracle 数据库使用一些额外的进程,称为后台进程。后台进程执行操作数据库和为多个用户最大化性能所需的维护任务。每个后台进程都有一个单独的任务,但与其他进程协作。例如,LGWR 进程将数据从重做日志缓冲区写入在线重做日志。当一个充满的日志文件准备归档时,LGWR 会发出信号让另一个进程来归档该文件。
Oracle 数据库在数据库实例启动时自动创建后台进程。一个实例可以有很多后台进程,但并非所有配置中的数据库都始终存在。以下查询列出了您的数据库上正在运行的后台进程:
SELECT PNAME FROM V$PROCESS WHERE PNAME IS NOT NULL ORDER BY PNAME;
本节包括以下主题:
■ 必要后台进程
■ 可选后台进程
■ 从属进程
15.4.1. 必要后台进程
强制后台进程在所有典型的数据库配置中都存在。这些进程默认在用最少配置的初始化参数文件启动的数据库实例中运行(见第 13-20 页的示例 13-1)。本节描述了以下强制后台进程:
■ 进程监控进程(PMON)
■ 系统监控进程(SMON)
■ 数据库写入进程(DBWn)
■ 日志写入进程(LGWR)
■ 检查点进程(CKPT)
■ 可管理性监控进程(MMON 和 MMNL)
■ 恢复进程(RECO)
15.4.1.1. 进程监控进程(PMON)
进程监控(PMON)监控其他后台进程,并在服务器或调度器进程异常终止时执行进程恢复。PMON 负责清理数据库缓冲区缓存和释放客户端进程使用的资源。例如,PMON 重置活动事务表的状态,释放不再需要的锁,并从活动进程列表中移除进程 ID。PMON 还向 Oracle Net 监听器注册实例和调度器进程的信息(见第 16-6 页的“Oracle Net 监听器”)。当实例启动时,PMON 轮询监听器以确定其是否正在运行。如果监听器正在运行,那么 PMON 会传递给它相关参数。如果它没有运行,那么 PMON 会定期尝试联系它。
15.4.1.2. 系统监控进程(SMON)
系统监控进程(SMON)负责多种系统级别的清理工作。分配给SMON的职责包括:
■ 在实例启动时执行实例恢复(如果需要)。在Oracle RAC数据库中,一个数据库实例的SMON进程可以为失败的实例执行实例恢复。
■ 恢复在实例恢复期间由于文件读取或表空间离线错误而被跳过的已终止事务。当表空间或文件重新联机时,SMON会恢复这些事务。
■ 清理未使用的临时段。例如,Oracle数据库在创建索引时分配区段。如果操作失败,则SMON会清理临时空间。
■ 在字典管理的表空间内合并连续的空闲区段。
SMON定期检查是否需要执行。其他进程如果检测到需要,可以调用SMON。
15.4.1.3. 数据库写入进程(DBWn)
数据库写入进程(DBWn)将数据库缓冲区的内容写入数据文件。DBWn进程将数据库缓冲区高速缓存中修改过的缓冲区写入磁盘(参见第14-9页的“数据库缓冲区高速缓存”)。
尽管一个数据库写入进程(DBW0)对于大多数系统来说是足够的,但如果你的系统大量修改数据,你可以配置额外的进程——DBW1到DBW9和DBWa到DBWj——以提高写入性能。这些额外的DBWn进程在单处理器系统上没有用处。DBWn进程在以下条件下将脏缓冲区写入磁盘:
■ 当服务器进程在扫描了一定数量的缓冲区后找不到可重用的干净缓冲区时,它会发出信号让DBWn写入。DBWn尽可能异步地将脏缓冲区写入磁盘,同时进行其他处理。
■ DBWn定期写入缓冲区以推进检查点,检查点是实例恢复开始的重做线程中的位置(参见第13-11页的“检查点概述”)。检查点的日志位置由缓冲区高速缓存中最老的脏缓冲区决定。
在许多情况下,DBWn写入的块分散在整个磁盘上。因此,这些写入往往比LGWR执行的顺序写入要慢。DBWn在可能的情况下执行多块写入以提高效率。多块写入中写入的块数因操作系统而异。