WR blog

about Enterprise IT, Oracle Database, Jazz/Fusion Music, etc…

WR blog RSS Feed
 
 
 
 

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

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

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

まず、SQLPlusを起動して、connectコマンドでOracleに接続すると、サーバープロセス が起動します。 これは、SQLPlusにおいて、fork()、exec()システムコールを実行することで、 プロセスが複製され、複製されたプロセスの実体がoracleプログラムに変わるためです。 このような処理を行うことで、サーバープロセスに対応したプロセスが新規に作成されます。 そして、このサーバープロセスはSQLPlusの子プロセスとなり、 サーバープロセスとSQLPlusは子プロセス、親プロセスの関係をもちます。 そして、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   ----<PIPE NODE:75491>---> サーバープロセス
(PID:9694) r                       w (PID:9697)
           <---<PIPE NODE:75492>----

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

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

Leave a Reply

Profile

Jazz/Fusion Musicを愛するIT技術者です。 現在、Oracle Database 関連の仕事をしています。

保有資格

  • Oracle Master 10g Platinum
  • Oracle Master 11g Gold
  • Oracle Master Expert 10g RAC
  • Oracle Master Expert Oracle on Linux
  • LPIC level2
  • 日商簿記3級

連絡先

ご連絡は、wrcsus4 _at_ gmail _dot_ com にお願いいたします。

 

November 2008
M T W T F S S
« Oct    
 12
3456789
10111213141516
17181920212223
24252627282930

Recent Posts

Recent Comments

Tags

Categories

Pages

Archives

Meta