9 进程结构
这篇文章讨论了在oracle数据库系统中的进程以及为oracle数据库系统可能的不同的配置
这章包含下面的内容:
*进程的介绍
*用户进程的概述
*oracle进程的概述
*共享服务器的体系机构
*独立服务器配置
*程序接口
进程的介绍
所有连接oracle的用户必须执行两个模块的代码来访问数据库实例:
*应用软件或者oracle工具:一个数据库用户执行一个数据库的应用软件(例如:一个预编译的程序)或者一个oracle工具(比如:SQL*PLUS),用户执行这些软件或者工具来向oracle数据库发起SQL语句.
*oracle数据库服务器代码:每个用户都有一些oracle数据库代码代表用户来执行,这些oracle数据库代码解释并且处理应用软件的SQL语句.
这些代码模块是被进程所执行的.一个进程是一个"控制线"或者上一一个在操作系统中执行一系列步骤的机制.(一些操作系统使用术语JOB或者TASK).一个进程正常在它运行的地方都有属于它自己的私人内存.
多进程的oracle系统
多进程oracle(也叫多用户oracle)用几个进程来执行oracle代码的不同的部分和为用户执行额外的进程-或者是每个连接用户的每个进程或者是被多个用户共享的一个或者多个进程.
在oracle实例中的每个进程履行一个特定的工作.通过将oracle和数据库应用软件的工作划分为几个过程的方式,多用户和多应用软件能够同时地连接到一个单独的数据库实例,同时oracle系统也维护了很好的性能.
进程的种类
在oracle系统中的进程可以被分为两个主要的组类:
*用户执行应用软件或者oracle工具代码的进程;
*oracle执行oracle服务器代码的进程.它们包括服务器进程和后台进程;
进程的结构会因为oracle的不同的配置有不同的进程结构,根据操作系统和oracle选项的选择.连接数据库的用户的代码可以配置为独立的服务器或者配置为共享的服务器.
采用独立的服务器,对于每个用户,数据库应用软件被一个不同的进程(用户进程)执行而不是执行oracle数据库服务器代码的进程(一个独立的服务器进程).
采用共享服务器,数据库应用软件也被一个用户进程执行而不是被运行oralce数据库服务器代码的进程.每个运行数据库代码的服务器进程(一个共享服务器进程)能够为多个用户进程服务.
图9-1 说明一个独立的服务器配置情况.是,每个连接用户都有单独的用户进程和一些后台进程执行oracle.
图9-1表现多个用户同时在一个相同的机器上的oracle运行一个应用软件.这个独特的配置通常运行在大型机或者小型机上.
用户进程的概述
当一个用户运行一个应用程序(比如一个Pro*C程序)或者一个 oracle工具(比如:企业管理器或者SQL*PLUS)时,oracle将创建一个用户进程来执行这个用户的应用程序.
连接和会话
连接和会话对于用户进程来说是有紧密联系的,但是在意义上也是有区别的.
一个连接是一个在用户进程和一个oracle实例之间的通信路径.这个通信路径是采用可用的进程之间的通信机制(在同时运行用户进程和oracle的机器上)创建起来的或者是通过网络软件(当有不同的机器在运行应用程序和oracle数据库,并且通过网络通信)创建的.
一个会话是一个用户通过用户进程连接到数据库实例的一个特定的连接.例如:当一个用户启动SQL*PLUS,这个用户必须提供有效的用户名和密码,然后一个为该用户服务的会话就被建立起来.一个会话从用户连接到数据库的时间一直持续到用户断开连接或者关闭数据库应用程序.
可以为一个使用相同的用户名的oralce用户创建多会话并且这些多会话可以同时存在.例如:一个带有用户名/密码为SCOTT/TRIGER的用户能够多次连接到相同的oracle数据库.
在不采用共享服务器的配置中,oracle创建了一个服务器进程来代表每个用户会话.但是,采用共享服务器,许多用户会话能够共享一个单独的服务器进程.
oracle进程的概述
这部分描述了两种运行oracle数据库服务器代码的进程(服务进程和后台进程).也描述了记录oracle进程中发生的数据库的事件的跟踪文件和警告日志.
服务器进程
oracle创建服务器进程来处理连接到数据库实例的用户进程的请求.当应用程序和oracle运行于同一台机器上时在一些情形下,将用户进程和相应的服务器进程结合成为一个单独的进程来减少系统消耗.但是,当应用程序和oracle运行于不同的机器上时,一个用户进程总是通过一个单独的服务器进程来与oracle数据库通信交流.
代表每个用户的应用程序所创建的服务器进程(或者结合的用户/服务器进程的服务部分)能够执行下面的一项或者多项:
*解析和运行应用程序发起的SQL语句;
*如果数据快已经不在SGA中,服务器进程将从磁盘中读取必须的数据块读到SGA的共享数据库高速缓存中;
*以一种应用程序能够处理信息的方式返回结果.
后台进程
为了使性能最大化适应许多用户,一个多进程的oracle系统使用一些额外的oracle进程叫后台进程.
一个oracle实例能够有很多进程;但是并不是所有的进程总是存在.有很多后台进程.查看V$BGPROCESS视图会获取更多的关于后台进程的信息.
一个oracle实例的后台进程包括下面所列出的:
*数据库写进程(DBWn)
*日志写进程(LGWR)
*检查点进程(CKPT)
*系统监控进程(SMON)
*进程监控进程(PMON)
*恢复进程(RECO)
*工作队列进程
*归档进程(ARCn)
*队列监控进程(QMNn)
*其他的后台进程
在许多操作系统中,后台进程是当在数据库实例被启动时自动地被创建的.
图9-2说明每个后台进程是如何与oracle数据库的不同部分相互作用的,并且这部分的其他部描述每个进程.
数据库写进程
数据库写进程(DBWn)将高速缓存中的内容写进数据文件中。DBWn进程是将数据库高速缓存中的被修改的缓存器中的数据(脏数据)写进数据文件中这个任务负责。尽管一个数据库写进程(DBW0)对于大多数系统来说是足够的,但如果你的系统修改数据的事务比较的频繁,
你也可以配置额外的写进程(从DBW1到DBW9和DBWa到DBWi)来改进系统性能。这些额外的DBWn对单处理器的系统来说是没有用的。
当数据库高速缓存中的一个缓存内容被修改,它将被标识为脏数据。一个冷数据缓存器(coldbuffer,不知道怎么翻译好的)是一个根据最近最少使用算法排在最不经常使用位置的缓存器。DBWn进程将cold buffer和脏数据写进磁盘以便用户进程能够找到cold buffer和干净的缓存器用来将读进的新的数据块中的数据存放到高速缓存中。当高速缓存中的数据被用户进程写成脏数据,空闲的缓存数据块的数量将减少。如果空闲缓存数据块的数量降的太低的话,那些必须要从磁盘中读取数据块到缓存中的用户进程是不能够找到空闲缓存数据块的。DBWn管理缓存器中的数据块以便用户进程总是能够找到空闲缓存数据块。
通过写cold,脏数据的缓存中的数据到磁盘中,DBWn进程改进了查找空闲缓存数据块的性能,同时保持最近使用的缓存数据保留在内存中。例如:被经常访问的小表或者索引的的部分数据块被保留在缓存中以便用户对这些数据块的访问不再需要从磁盘中读取数据块数据。LRU算法保留被经常被访问的数据块在缓存中以便当一个缓存内容被写进磁盘中去之后,那么该缓存中不可能再包含那些之后很快又会被使用的数据块的数据。
初始参数DB_WRITE_PROCESS定义了DBWn进程的数量。DBWn进程的最大数量为20。如果在数据库被启动的时候该参数没有被用户定义,那么oracle数据库自身根据CPU和处理器组的数量来决定如何设置DB_WRITE_PROCESS参数值。
DBWn进程在下面的条件下写脏数据到磁盘中去:
*当一个服务进程在扫描到缓存器的极限数量也不能找到一个干净的可重用的缓存数据块, 那么该服务器进程通知DBWn进程去写脏数据。当DBWn进程在执行其他的处理时,DBWn进程 可以异步地写脏数据到磁盘中去;
*DBWn进程周期的写缓存数据到磁盘来使检查点向前移动,这个检查点是在重做日志中数据 库实例恢复的开始位置。这个日志位置是由在高速缓存中最旧的脏数据所决定。
在所有例子中,DBWn进程是执行批量的(多数据块的)写来改进写数据的性能。在一次多数据块写过程中被写的数据块的数量是根据操作系统的不同而有所变化的。
写日志进程
写日志进程(LGWR)负责重做日志缓存的管理-将指定的重做日志缓存中的数据写到一个在磁盘上的重做日志文件中。LGWR是将从自上次写日志进程以来的已经被复制到高速缓存中的所有的重做日志项写进重做日志文件中。
LGWR进程写高速缓存中的连续的一部分写进磁盘中。LGWR进程写下列内容:
*当一个用户进程提交一个事务的一个提交记录
*重做日志缓存,写的触发条件如下:
每三秒
当重做日志缓存已经三十之一满时
如果需要时,当一个DBWn进程将被修改的缓存数据块写到磁盘中时
注意:在DBWn进程写一个被修改的缓存之前,所有与该缓存的变化相关的重做日志必须被写进磁盘中(叫写前协议)。如果DBWn进程发现一些重做记录没有被写进磁盘中,在LGWR进程能够写数据缓存出去之前,DBWn进程将通知LGWR进程将这些重做记录写进磁盘中去并且等LGWR进程完成写重做日志缓存的操作。
LGWR同步地也将这些高速缓存写进重做日志文件的活动镜像组。如果在镜像组文件中的一个文件被破坏或者不可获取,LGWR继续将高速缓存内容写进组中其他的文件中并且将一个错误当作日志记录到LGWR进程的跟踪文件中和系统警告日志中去。如果在组中的所有文件被破坏,或者该组由于在组还没有被归档而变为不可获取,LGWR进程将不能够继续运行。
当一个用户声明一个提交语句,LGWR进程将一个提交记录放进重做日志缓存中,并且将该提交记录以及该事务的重做项立即被写进磁盘。对相应的数据块的变更被延期修改直到oracle采用一种更加有效的方式将变更写进磁盘。这个叫做快速提交机制。包含事务提交记录的重做项的原子写操作是一个可以决定事务已经被提交的单独的活动。
对于一个正在提交的事务oracle返回一个成功的代码,尽管数据缓存内容还没有被写进磁盘中去。
注意:在有些情况下,如果需要更多的缓存空间,在一个事务被提交之前LGWR进程可以写重做日志项。只有该事务之后被提交这些日志项才会变为永久存在的。
当一个用户提交一个事务,这个事务被分配一个系统变更号(SCN),这个SCN以及在重做日志中的该事务的重做项是被oracle记录下来的。这些SCN被记录在重做日志中以便在RAC和分布式数据库中的恢复操作可以被保持同步。
在活动高峰期,LGWR进程可以采用组提交的方式来向重做日志文件中做写操作。例如:假设一个用户提交一个事务。LGWR进程必须将事务的重做项写进磁盘中,并且在写操作的同时,其他用户也发起了一些提交语句。但是,LGWR进程不能够向重做日志文件中做写操作提交这些事务直到LGWR进程已经完成了先前的写操作。当第一个事务的重做项被写进重做日志文件中之后,那些等待事务(还没有提交的事务)的重做项的项列表可以在一个操作中一次性都被写进磁盘中,这样比一个事务一个事务地处理事务项需要更少的磁盘I/O从而提高性能。因此,oracle为了减少磁盘I/O交互使LGWR进程的性能最大化。如果在高峰期需要连续提交,然后从重做日志缓存中的每次LGWR进程的写操作可以包含多个提交事务记录。
检查点进程(CKPT)
当一个检查点出现时,oracle必须更新所有数据文件的头来记录该检查点的细节。这个事情是由CKPT进程来完成的。CKPT进程不会将数据块写进磁盘中;DBWn进程才总是执行将数据块写进磁盘的操作。
在企业管理器中被System_Statistics监控器显示出来的DBWR checkpoints(数据库写进程被要求扫描缓存并且为所有数据块做下检查点标识的次数)说明数据库需要完成的检查点的数量。
进程监控进程(PMON)
当一个用户进程失败时进程监控进程执行进程恢复。PMON进程负责整理数据库高速缓存和释放用户进程过去使用的资源。例如:PMON进程重新设置活动事务表的状态,释放锁以及从活动进程列表中移除一些特定的进程ID。
PMON进程周期的检查调度器和服务进程的状态,并且重新启动那些已经停止运行的服务进程和调度器(不包括那些oracle有意要求终止的任何进程)。PMON进程也通过网络监听器记录关于数据库实例和调度器的信息。
和系统监控进程一样,进程监控进程也周期地去检查看看是否需要进程监控并且如果其他进程检测到需要进程监控则调用进程监控进程。
恢复进程(RECO)
恢复进程(RECO)是在分布式数据库配置的一个后台进程,该进程可以自动地解决在分布式事务中的失败。分布式系统中的一个结点中的RECO进程自动地连接到与一个可疑的分布的事务有关的其他数据库。当RECO进程在有关的数据库服务器之间重新建立一个连接时,它自动地解决所有可疑的事务,通过从每个数据库中的未决的事务表中移除那些与这些可疑的事务对应的任何行记录信息。
如果RECO进程连接到远程的服务器失败,则RECO进程在一段时候间隔之后自动地尝试再次连接。但是,在RECO进程试图尝试另一个连接之前RECO进程需要等一个指数增长的时间量。只在实例允许分布式事务存在的条件下RECO进程才会运行。并发的分布式的事务的数量是没有限制的。
任务队列进程
任务队列进程一般是用于批处理。它们是运行用户任务。它们可以被看做一个计划的服务,这个服务可以以oracle数据库实例上的PL/SQL语句或者存储过程的形式被用来计划任务。
动态的任务队列进程可以在给定的时间间隔内并发地运行许多任务。当任务队列进程被CJQ进程分配任务时任务队列进程运行用户任务。下面是所发生的:
1、协调的进程—CJQ0,周期地在系统的JOB$表中查询需要被运行的任务。被查询出来的新的任务是按照时间排序的执行的;
2、CJQ0进程动态地产生任务队列进程(J000..J999)来运行任务;
3、任务队列进程执行运行被CJQ进程查询出来需要执行的任务中的一个。这些进程一次执行一个任务;
4、在这些任务队列进程完成一个单独的任务执行之后,这些进程将获得更多的任务。如果没有任务需要被执行,那么任务队列进程处于一个睡眠状态,从这个睡眠状态中周期地被叫醒来执行更多的任务。如果任务队列进程没有发现任何新的任务,那么该进程在预设的时间间隔之后停止任务进程。
初始参数JOB_QUEUE_PROCESSES代表在一个数据库实例上可以并发的运行的任务队列进程的最大的个数。但是,客户端不应该假设所有的任务队列进程对于任务执行来说都是可获取的。
注意;如果初始参数JOB_QUEUE_PROCESSES被设置为0,那么协调的进程—CJQ0将不会被启动。
归档进程(ARCn)
在一个日志切换已经发生之后归档进程(ARCn)复制重做日志文件到一个指定的存储设备上。ARCn进程只有当数据库处于归档模式下才出现,并且是自动的归档模式。
一个数据库实例中能够多达10个ARCn进程(ARC0到ARC9)。只要当前的ARCn进程的数量对于处理工作量来说不够用时LGWR进程将启动一个新的ARCn进程。当LGWR进程将启动一个新的ARCn进程时警告日志将对之做一个记录。
如果你期望对大数据量的工作量进程归档,比如在大批量的加载数据的时候,你可以通过定义初始参数LOG_ARCHIVE_MAX_PROCESSES的值来指定多归档进程的个数。ALTER SYSTEM语句可以动态地改变这个参数的值来增加或者减少ARCn进程的个数。但是,你不需要改变这个参数的默认值1,因为系统会决定需要多少ARCn进程,并且在当数据库工作量需要更多的ARCn进程时LGWR进程自动地启动更多的ARCn进程。
队列监控进程(QMNn)
队列监控进程是一个为oracle流高级队列设置的一个可选的后台进程,它是用来监控消息队列。你可以设置达到10个队列监控进程。这些进程,象任务队列进程一样,是与oracle其他的进程不同的因为该进程的失败不会引起该实例的失败。
其他的后台进程
还有一些那些可能运行的其他的后台进程。这些进程包括下面:
MMON进程执行各种与管理相关的后台进程,例如:
*只要一个被给的度量违反了它的极限值则声明警告;
*通过产生额外的进程(MMON进程)来进程快照操作;
*对于最近已经修改过的SQL对象进程捕捉统计信息;
MMNL执行一些频繁的但是不重要的与管理相关的任务,比如:会话历史捕捉和度量计算。
MMAN是用在数据库内部的任务。
RBAL在一个自动的存储管理实例中为磁盘组之间做协调平衡活动。它对自动存储管理磁盘执行一个全局的公开。ORBn在自动存储管理实例中执行实际的平衡数据区域之间的数据移动工作。一次可以有许多这种进程,被叫作ORB0,ORB1等等。
OSMB进程在采用自动存储管理磁盘组的数据库实例中出现。OSMB进程可以和自动存储管理实例进行交流和通信。
跟踪文件和警告日志
每个服务和后台进程都能够向相关的跟踪文件做写操作.当一个进程检测到有一个内部的错误,那该进程会将该错误的有关信息写进跟踪文件中.如果上一内部的错误出现并且信息被写进跟踪文件中,那么数据库管理员应该与oracle技术支持服务联系。
与后台进程有关的跟踪文件的所有的文件名都包含那些产生跟踪文件的进程的名字。对于进程产生的异常是任务队列进程产生的跟踪文件。
在跟踪文件中额外的信息可以为优化应用程序或者一个数据库实例提供向导。后台进程在适当的时候总是向跟踪文件中写上面方面的信息。
每个数据库也有一个alter.log文件。一个数据库的警告日志是一个对消息和错误信息按照年代顺序排好序的日志,包括下面的错误情况:
*发生的所有内部的错误(ORA-600),块损坏错误(ORA-1576),以及死锁错误(ORA-60);
*管理的操作,比如:create/alter/drop database /tablespace 的SQL语句以及企业管理器或者SQL*PLUS语句中的startup,shutdown,archive log以及recover;
*与共享服务器和调度进程的函数有关的一些消息和错误;
*一个物化视图的自动刷新过程中的错误;
Oracle数据库用警告日志来保持对这些事件的记录从而代替在操作员的控制台上的显示。(许多系统也将这些信息显示在控制台上)。如果一个管理的操作是成功的,那么一个消息以及一个时间都被写进警告日志中表示“操作完成”。
共享服务体系机构
共享服务体系机构消除了对一个独立的服务器进程的每个连接的需要。 一个调度器指引多引入的网络会话去向共享服务进程池中申请共享服务进程。来自服务进程的共享池中的一个空闲共享服务进程从公共的队列中获取一个申请,这样的意味着共享服务进程的一小部分能够和许多独立服务器一样执行一样多数量的处理工作。
在共享服务器系统中许多不同的进程是需要的:
*一个网络监听进程,用来将用户进程与调度器或者独立的服务器连接起来(监听 进程是oracle Net Services服务的一部分,而不是oracle的一部分);
*一个或者多个调度器进程;
*一个或者多个共享服务器进程;
共享服务进程需要oracle Net Services或者SQL*Net版本2。
注意:为了能够使用共享服务器,一个用户进程必须通过oracle Net Services或者SQL*Net版本2来连接,即使进程是和数据库实例运行在同一机器上。
当一个数据库实例启动时,网络监听进程打开并且通过哪个用户连接oracle数据库建立一个通信路径。然后,每个调度器进程给予监听进程一个地址,在这个地址上调度器监听连接请求。至少一个调度器进程必须被配置好并且为数据库客户端启动会用的每个网络协议。
当一个用户进程做了一个连接请求时,监听器检查该请求并且决定是否该用户进程可以使用共享服务器进程。如果可以,那么监听器返回那个工作负荷最轻的调度器进程的地址,然后用户直接连接该调度器。
一些用户进程不能和调度器通信,所以网络监听进程就不能够连接到调度器上。在这种情况下,或者如果用户进程申请一个独立的服务器,那么监听器会创建一个独立的服务器并且建立一个适当的连接。
Oracle的共享服务器体系结构增强了对同时连接到数据库上的应用软件和客户的数量的可拓展性。在不需要对应用软件本身做任何变更的情况下,它能够使存在的应用软件个数按比例增加。
调度器的请求和响应队列
来自于用户的一个请求是用户的部分SQL语句的一个单独的程序接口调用。当一个用户进行一个调谑用时,它的调度器在请求队列中放置一个请求,在那请求队列中该请求将被下一个可获取的共享服务进程所获得。
请求队列是在SGA中并且对于数据库实例的所有调度进程来说是公共的。共享服务进程为获取新的请求检查公共的请求队列,根据先入先出原则获得新的请求。一个共享服务进程获得在请求队列中的一个请求,并且进行对数据库的所有的必须的调用来完成那个请求。
当服务完成该请求时,该服务进程将在调用调度器的响应队列上放置一个响应。每个调度器 SGA中有属于自己的响应队列。这个调度器然后对适当的用户进程返回完全的回应。
例如:在一个定单登入系统中每个职员的用户进程连接到一个调度器并且每个职员发起的请求被发送到那个调度器中,即将请求放入请求队列中。下个可获取的共享服务进程执行该请求,为该请求服务,并且将其响应放到其响应队列中去。当一个职员的请求结束时,该职员保留对调度器的连接,但是处理该请求的共享服务进程被释放并且可以被其他的请求所用。当一个职员正和一个客户说话时,其他的职员也能够用相同的共享服务进程。
图9-3说明通过程序接口用户进程是如何和调度器进行通信的,并且调度器是如何将用户的请求传达给共享服务进程
图9-3 共性服务配置和进程
调度进程(Dnnn)
调度进程通过允许用户进程来共享一定数量的服务进程来支持共享服务配置。采用共享服务,对于同样数量的用户可以采用少一点的共享服务进程。因此,共享服务能够支持许多用户,特别是在客户应用和服务操作在不同的机器上的C/S环境。
注意:连接到一个调度器上的每个用户进程必须要通过oracle Net Services 版本2来操作,即使用户进程和调度进程运行在同一个机器上。
你可以为单个数据库实例创建多个调度进程。至少需要为用于oracle的每个网络协议创建一个调度器。数据库管理员依据操作系统的限制和为每个进程被连接的数量来启动最佳数量的调度进程,数据库管理员也可以在数据库实例运行时添加和删除调度进程。
注意:连接到调度器上的每个用户进程必须通过Oracle Net Serviec或者SQL*NET版本2来操作,即使用户进程和调度进程是运行在同一个机器上。
在共享服务器配置中,一个网络监听进程等待来自客户应用程序的连接请求,并且发送请求给调度进程。如果网络监听不能够将客户程序连接到调度器上,那么该监听进程启动一个独立的服务进程,然后连接客户应用程序到该独立的服务器上。监听进程不是oracle数据库实例的一部分,而是和oracle一起合作的网络进程的一部分。
共享服务进程(Snnn)
每个共享服务进程在共享服务配置中为多个客户请求服务。共享服务进程和独立的服务进程提供同样的功能。,除了共享服务进程不能够和一个特定的用户进程有关联。相反,在共享服务配置中一个共享服务进程可以为任何一个客户进程服务。
一个共享服务进程的PGA不包含用户相关的数据(用户相关的数据需要被所有的共享服务进程所访问)。一个共享服务进程的PGA只包含堆空间和进程指定的变量。
所有与会话相关的信息被包含在SGA中。每个共享服务进程需要能够访问所有会话的数据空间以便任何一个服务可以处理来自任何一个会话的请求。在SGA中每个会话的数据所需的空间都被分配。你可以通过在用户的配置文件中设置资源PRIVATE_SGA参数为被被要求得到的空间数量来限制分配给每个会话的空间数量。
Oracle基于请求队列的长度动态地调整共享服务进程的数量。共享服务进程的数量可以设置的范围在初始参数SHARE_SERVERS和MAX_SHARED_SERVERS的值之间。
共享服务器的被限制操作
当连接到调度器进程的时候一些的管理活动不能够被执行,包括:关闭或者启动实例和介质恢复。当连接到调度进程的时候如果你试图执行这些活动,那么一个错误将会产生。
当用管理员身份连接这些活动是经常性会被执行的。在配置为共享服务器的系统时当你想用管理员特权来连接时,你必须在你的连接字符串中陈述你想用一个独立的服务进程(SERVER=DEDICATED)来取代一个调度进程。
独立的服务器配置
图2说明oracle采用独立的服务器结构在两台机器上运行。在这种配置中,一个用户进程在一台机器上运行数据库的应用程序,并且在另一台机器上运行相关的oracle数据库服务器的一个服务进程。
图9-4 oracle采用独立的服务进程
用户和服务进程是两个独立的,不同的进程。代表每个用户进程所创建的单独的服务进程被称为一个独立的服务进程(或者影子进程),因为这个服务进程只代表相关的用户进程来运行。
这种配置主张在用户进程和服务进程之间的数量是一对一的关系。即使当用户没有活跃地向数据库做请求,独立的服务进程也保留一个服务进程(尽管这个服务进程是不活跃的并且可以在一些操作系统中被标识为在系统外)。
图9-4 显示了通过网络连接运行在单独的服务器上的用户进程和服务进程。但是,如果客户应用程序和oracle数据库服务代码运行在相同的机器上一个单独的服务器结构也可以被使用,但是如果他们是以一个单独的进程来运行的话主操作系统不能对两个程序做单独的维护。UNIX系统是就是这样一个操作系统的例子。
在独立的服务器配置中,用户和服务进程采用不同的机制进行通信:
*如果系统被配置以便用户进程和独立的服务进程运行在同一个机器上,程序接口使用主操作系统的进程间的通信机制来执行它的工作;
*如果用户进程和独立的服务进程运行在不同的机器上,程序接口提供在程序间的通信机制(例如:网络软件和oracle Net Services)
*独立的服务结构有时候导致效率不高。考虑一个使用独立的服务器的定单登入系统。一个客户要求下一个定单同时职员输入一个定单到数据库系统中去。对于一个事务的大部分时间中,职员是和客户说话中,同时分配给该职员的服务进程是处于空闲状态中。在一个事务的大部分时间内,服务进程是不需要的,并且系统对于其他职员输入定单也是比较慢的。对于像上面的应用程序情况,共享服务进程也许是更好点的。
程序接口
程序接口是在数据库应用程序和oracle之间的软件层。程序接口包括:
*设置安全栅栏,阻止客户断的用户进程对SGA的破坏性的访问;
*程序接口作为一个通信机制,使信息请求格式化,并且捕捉和返回错误信息;
*转换和翻译数据,特别是在不同的机器之间或者是外部的程序类型;
Oracle代码被当作服务器,代表一个应用程序执行数据库的任务,比如:从数据块中获取数据。Oracle代码是由几个部分组成的,是由oracle软件和指定的操作系统软件提供的这些组成部分。
程序接口结构
程序接口是有下面的几块组成的:
*oracle调用接口(OCI)或者是oracle的运行库(SQLLIB);
*程序接口的客户或者用户端(也被叫做UPI);
*各种oracle网络服务驱动(指定协议的通信软件);
*操作系统通信软件;
*程序接口的服务或者oracle端(也被叫做OPI)
程序接口的用户端和oracle端都运行oracle软件,驱动也是。
Oracle的网络服务是程序接口的一部分,它是允许客户应用程序和oracle数据库服务器在你的通信网络中是居住在单独的机器上的。
程序接口驱动
驱动是那些通常是通过网络来传输数据的软件的组成部分。它们执行的操作比如:连接,断开连接,发信号通知错误,以及测试错误。驱动对于一个通信协议来说是特定的,并且总是有一个默认的驱动。
你可以安装多个驱动(比如:异步的或者DECnet驱动),并且选择一个作为一个默认的驱动,但是允许一个特定的用户在一个连接时刻使用特定的想要的其他驱动。不同的进程能够使用不同的驱动。一个单独的进程可以有并发的连接,采用不同的oracle网络服务驱动连接到一个单独的数据库中或者连接到多个数据库(或者是本地的或者是远程的)。
操作系统的通信软件
程序接口的连接客户端到oracle端的低层软件是通信软件,该通信软件由主操作系统提供。DECnet, TCP/IP, LU6.2, 和ASYNC等是一些通信软件的例子。通信软件可以由oracle数据库提供,但是通常是从硬件的卖主或者是第三放软件供应商那单独的购买下。