CHAPTER 02 クライアントアプリケーションとサーバープロセス – プロとしてのOracleアーキテクチャ入門

今回のentryでは、「SECTION I Oracleアーキテクチャ概要」の「CHAPTER 02 クライアントアプリケーションとサーバープロセス」について補足説明します。
この章では、SQL*PlusなどのOracleに接続するアプリケーションである「クライアントアプリケーション」
とクライアントから指示に従い実際に処理を実行する「サーバープロセス」について説明しています。

あるクライアントアプリケーションがOracleに接続すると、そのクライアントアプリケー
ション専用のサーバープロセスが起動します。
ここで、クライアントアプリケーションとサーバープロセスの間に設定されるコネクションを、
Oracleではセッションと呼びます。
これらについては、書籍で説明したとおりですが、このentryでは、
Linux上でクライアントアプリケーションとしてSQL*PlusでOracleに接続した場合を例に、
クライアントアプリケーションとサーバープロセスの関係について、
プロセスの相互関係、セッションの観点から確認してみます。

まず、SQL*Plusを起動して、connectコマンドでOracleに接続すると、サーバープロセス
が起動します。
これは、SQL*Plusにおいて、fork()、exec()システムコールを実行することで、
プロセスが複製され、複製されたプロセスの実体がoracleプログラムに変わるためです。
このような処理を行うことで、サーバープロセスに対応したプロセスが新規に作成されます。
そして、このサーバープロセスはSQL*Plusの子プロセスとなり、
サーバープロセスとSQL*Plusは子プロセス、親プロセスの関係をもちます。
そして、2つのプロセス間にパイプと呼ばれるプロセス間通信路を設定します。
すなわち、セッションはパイプにより実現されるわけです。

ここで説明した動作を実際に確認してみましょう。
まず、SQL*Plusを実行して、Oracleに接続してみます。

[o11106@hp1 ~]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 – Production on 日 11月 9 15:36:10 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

SQL> connect / as sysdba
接続されました。
SQL>

このとき、pstreeコマンドを使用して、プロセスの親子関係を確認してみます。

[o11106@hp1 ~]$ pstree -p -a o11106
bash(9438)
(略)
sshd,9667
`-bash,9668
`-sqlplus,9694
`-oracle,9697 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

SQL*Plus(コマンド名:sqlplus, プロセスID:9694)と、
サーバープロセス(コマンド名:oracle, プロセスID:9697)が親子関係にあることが
確認できます。

次に、サーバープロセスとSQL*Plusの間に存在するパイプを確認してみましょう。

[o11106@hp1 ~]$ sudo /usr/sbin/lsof -u o11106 |head -1
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
[o11106@hp1 ~]$ sudo /usr/sbin/lsof -u o11106 |grep pipe
(略)
sqlplus 9694 o11106 14w FIFO 0,7 75491 pipe
sqlplus 9694 o11106 15r FIFO 0,7 75492 pipe
oracle 9697 o11106 13r FIFO 0,7 75491 pipe
oracle 9697 o11106 16w FIFO 0,7 75492 pipe
(略)

SQL*Plus(コマンド名:sqlplus, プロセスID:9694)と、
サーバープロセス(コマンド名:oracle, プロセスID:9697)
の間に2つのパイプ(NODE:75491,75492) が存在することがわかるでしょう。
図式すると以下のようになります。

w r
SQL*Plus —-—> サーバープロセス
(PID:9694) r w (PID:9697)
<---—-

このようなfork(), exec()システムコール、pipeを使った子プロセスの生成、親子プロセス間の
通信はUNIX系プラットフォームにおいてはごくごく一般的な方法です。
Oracleにおいても、このような一般的な方法を用いて、ローカル接続を実現しています。

なお、リモート接続の場合はリスナープロセス(コマンド名:tnslsnr)がサーバープロセスを
子プロセスとして生成しています。(内部的にdouble-folkを使用)

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>