<oracle-4> oracle进程

Oracle中的各个进程要完成某个特定的任务或一组任务,每个进程都会分配内部内存(PGA内存,前一篇讲过oracle内存结构,主要有SGA,PGA和UGA)来完成它的任务。Oracle实例主要有3类进程。
1. 服务器进程(server process):这些进程根据客户的请求来完成工作。 比如专用服务器进程和共享服务器进程都是服务器进程。
2. 后台进程(background process):这些进程随数据库而启动,用于完成各种维护任务,如将块写至磁盘,维护在线重做日志,清理异常终止的今晨个,维护自动工作负载存储库(AWR)等。
3. 从属进程(slave process):这些进程类似于后台进程,不过他们要代表后台进程或服务器进程完成一些额外的工作。

4.1 服务器进程
服务器进程就是 代表客户会话完成工作的进程。 应用向数据库发送的sql语句最后就要由这些进程接收并执行。
这里重点介绍下专用服务器连接和共享服务器连接。

专用服务器连接(dedicated server):采用专用服务器连接时,会在服务器上得到针对这个连接的一个专用进程。数据库连接与服务器上的一个进程或线程之间存在 一对一的映射。
共享服务器连接(shared server):采用共享服务器连接时,多个会话可以共享一个服务器进程池,其中的进程由oracle实例生成和管理。你所连接的是一个数据库调度程序(dispatcher),而不是特意为连接创建的一个专用服务器进程。

注意:有一点很重要,要知道oracle术语中的 连接和会话之间的区别。 连接(connection)就是客户进程与oracle实例之间的一条物理路径(例如,客户与实例之间的一个网络连接)。 会话(session)则不同,这时数据库中的一个逻辑实体,客户进程可以在会话上执行sql等。多个独立的会话可以与一个连接相关联,这些会话甚至可以独立于连接存在。

专用服务器进程和共享服务器进程的任务是一样的:要处理你所提交的所有sql。当你向数据库提交一个select * from emp查询时, (1)会有一个oracle专用/共享服务器进程解析这个查询, (2)并把它放在共享池中(或者最好能发现这个查询已经在共享池中)。这个进程要提出查询计划,如果必要,还要执行这个查询计划,可能在缓冲区中找到必要的数据,或者将数据从磁盘读入缓冲区缓存中。

这些服务器进程是干重活的进程。在很多情况下,你都会发现这些进程占用的系统cpu时间最多,因为正是这些进程来执行排序、汇总、连接等工作,几乎所有工作都是这些进程做的。

4.1.1 专用服务器连接
在专用服务器模式下,客户连接和服务器进程(或者有可能是线程,看是linux还是windows)之间会有一个一对一的映射。如果一台unix主机上有100条专用服务器连接,就会有相应的100个进程在执行。


客户应用中链接着oracle库,这些库提供了与数据库通信所需的API。这些API知道如何向数据库提交查询,并处理返回的游标。他们知道如何把请求打包为网络调用,专用服务器则知道如何将这些网络调用解开。这部分软件称为Oracle Net,不过在以前的版本中可能称为SQL*Net或Net8.这时一个网络软件/协议,Oracle利用这个软件来支持客户/服务器处理。即使客户和服务器在同一台机器上,也会采用这种两进程体系结构。这个体系结构有两个好处:
1.远程执行(remote execution):客户应用可能在另一台机器上执行(而不是数据库所在的机器)。
2.地址空间隔离(address space isolation):服务器进程可以读写SGA。如果客户进程和服务器进程物理地链接在一起,客户进程中一个错误的指针就能轻松地破坏SGA中的数据结构。

4.1.2 共享服务器连接
共享服务器连接强制要求 必须使用Oracle Net,即使客户和服务器都在同一台机器上也不例外。如果不适用Oracle TNS监听器,就无法使用共享服务器。如前所述,客户应用会连接到Oracle TNS监听器,并重定向或转交给一个调度程序。调度程序充当客户应用和共享服务器进程之间的导管。


在此可以看到,客户应用(其中链接了Oracle库)会与一个调度程序进程物理连接。对于给定的实例,可以配置多个调度程序,但是对应数百个用户只有一个调度程序的情况并不鲜见。

4.1.3 数据库常驻连接池
数据库常驻连接池(DRCP)是连接数据库并建立会话的一种新方法。有些应用接口自身不支持高效连接池(如PHP),DRCP就是为这种应用接口设计的一种更为高效的连接池方法。

在共享服务器连接中,共享服务器进程由多个会话共享,一个会话可能会使用多个共享服务器。采用DRCP时不再是这样,从池中选出的专用服务器进程会在会话的整个生命期中为客户进程所专用。在共享服务器中,如果在会话中要对数据库执行3个语句,这3个语句很有可能会由3个不同的共享服务器进程来执行。但通过使用DRCP,这三个语句都将由从池中为会话分配的专用服务器来执行。所以,DRCP不仅具备共享服务器的进程池功能,同时还具有专用服务器性能特征。

4.1.4 连接与会话
连接并不是会话的同义词,这一点让很多人都很诧异。在一条连接上可以建立0个,1个或多个会话。各个会话是单独而且独立的。即使他们共享同一个数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,一条连接上的各个会话可以使用不同的用户身份。
在oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器也可能连接到调度程序。
1.连接(connection):连接时从客户到oracle实例的一条物理路径。连接可以再网络上建立,或者通过IPC机制建立。通常会在客户进程与一个专用服务器或一个调度程序之间建立连接。
2.会话(session):会话在实例中存在的一个逻辑实体。这就是你的会话状态(session state), 也就是表示特定会话的一组内存中的数据结构。提到“数据库连接”时,大多数人首先想到的就是“会话”。你需要服务器中的会话上执行sql,提交事务和运行存储过程。会话和连接之间是多对多关系。我们通常在程序中说的“连接数”其实是“会话数”。

4.1.5 专用服务器与共享服务器
1. 什么时候使用专用服务器
因为存在一对一的映射,所以不必担心长时间运行的事务会阻塞其他事务。其他事务只通过其自己的专用进程来处理。因此,在 非OLTP环境中,也就是可能有长时间运行事务的情况下,应该只考虑使用这种模式。专用服务器是oracle的推荐配置,他能很好地扩展。只要服务器有足够的硬件(CPU和RAM)来应对系统所需的专用服务器进程个数,专用服务器甚至可以用于 数千条并发连接。
某些操作必须在专用服务器模式下执行,如数据库启动和关闭,所以每个数据库中可能同时又专用服务器和共享服务器,也可能只设置一个专用服务器。

2.什么时候使用共享服务器
共享服务器的设置和配置尽管并不难,但是比设置专用服务器要多一步。不过,二者之间的主要区别不在于其设置,而是操作的模式。

顾名思义,共享服务器是一种共享资源,而专用服务器不是。使用共享资源时,必须当心, 不要太长时间独占这个资源。如果独占了共享服务器资源,会导致系统看上去好像挂起了一样。
这就是共享服务器的首要原则: 要确保事务的持续时间尽量短。事务可以频繁执行,但必须在短时间内执行完, 这正是OLTP系统的特点。而且,共享服务器只适用于OLTP系统,这种系统的特点就是事务短而且频繁,事务以毫秒为单位。共享服务器对数据仓库很不适用,因为在数据仓库中,可能会执行耗时1分钟,2分钟甚至更长时间的查询。如果你的系统90%都是OLTP,只有10%不那么OLTP,那么可以再同一个实例上适当地混合使用专用服务器和共享服务器。
当然,使用共享服务器还有一个很重要的原因,这就是有时你别无选择。许多高级连接特性都需要使用共享服务器,如果你想使用Oracle net连接池,就必须使用共享服务器。如果想在数据库之间使用数据库链接集合,也必须对这些链接使用共享服务器。
共享服务器主要为我们做了3件好事:减少操作系统进程/线程数;刻意地限制并发度;减少系统所需内存。

注意:如果你的应用中已经使用了一个连接池特性(例如你在使用J2EE连接池),而且适当地确定了连接池的大小,再使用共享服务器只会成为性能杀手,导致性能下降。

4.1.6 专用/共享服务器小结
除非你的系统负载过重,或者需要为一个特定的特性使用共享服务器,否则专用服务器可能最合适。专用服务器设置起来很简单(实际上,根本没有设置),而且调优也更容易。

4.2 后台进程
Oracle实例包括两部分, SGA和一组后台进程。后台进程执行保证数据库运行所需的实际维护任务。例如,有一个进程为我们维护块缓冲区缓存,根据需要将块写出到数据文件。另一个进程负责当在线重做日志文件写满时将它复制到一个归档目标。可以使用V$bgprocess视图查看所有可能的oracle后台进程。
有两类后台进程:有一个中心(focused)任务的进程以及完成各种其他任务的进程(即工具进程)。作为开发人员,这部分可以不做深入了解。

4.3 从属进程
下面来看最后一类oracle进程:从属进程(slave process)。Oracle中有两类从属进程:IO从属进程和并行查询从属进程。
IO从属进程用于为不支持异步IO的系统或设备模拟异步IO。
Oracle 7.1.6引入了并行查询功能。这个功能是指:对于select、create table、create index、update等sql语句,创建一个执行计划,其中包含可以同时完成的多个(子)执行计划。将每个执行计划的输出合并在一起构成一个更大的结果。其目标是仅用少量的时间来完成操作。

猜你喜欢

转载自zoroeye.iteye.com/blog/2173398