小議服務程式與會話(一)

realkid4發表於2011-01-12

Server Process是客戶端在資料庫伺服器端操作的代表。任何操作,從SQL語句的傳遞執行,到資料塊讀取修改,都是透過Server Process完成的。

 

Server ProcessSession之間的關係是什麼樣的呢?

 

基礎說明

 

筆者在之前的Blog裡,談到過客戶端應用透過Oracle Net Service連線到監聽器,之後在一個埠建立與Server Process的聯絡。下面就幾個方面重點重述一下:

 

首先,客戶端並不能夠直接同Oracle例項進行聯絡,即使客戶端與伺服器在同一臺機器上。客戶端對資料庫的操作,是透過Oracle例項管理下的服務程式Server Process來完成的。所有客戶端請求的操作,都是間接透過Server Process來實現資料塊的獲取和訪問修改;

 

其次,客戶端透過本地命名服務,並不是直接連線Server Process,是透過監聽器進行重定向的過程。本地命名服務包括的是伺服器主機名、連線服務名和埠號。客戶端根據本地命名服務對應的連線資訊,實際上首先連線到守候在埠的監聽程式。監聽器程式是一個獨立的程式,執行在資料庫伺服器所在的主機上,維護著一個服務註冊列表。

 

當監聽程式受到客戶端的請求之後,首先檢查請求的服務是否在自身的註冊(動靜態註冊)列表中。如果存在,則開始尋找一個對應例項的Server Process與請求匹配。

 

下面的過程,不同的Oracle連線方式存在一些區別。Oracle連線方式有專用dedicated和共享Shared兩種。

 

在專用方式的時候,監聽程式會讓作業系統fork出一個新的Oracle Server Process,並且將這個新的Server Process的資訊傳遞給客戶端,並且協商出一個新的埠用於兩者的通訊。客戶端在獲取到這些資訊之後,重建與Server Process在新埠建立聯絡。當會話完成,客戶端斷開連線之後,Server Process會自動被例項回收釋放。

 

在共享方式下,還存在一個Dispatcher的程式,監聽器是和Dispatcher請求一個Server Process,而Dispatcher會根據當前的情況,分發給一個Server Process與客戶端通訊。這種方式下,Server Process是為多個客戶端共享。連線斷開後,Server Process可能也不會被回收。

 

 

下面進行的實驗,是在LinuxCentOS系統下進行的實驗。在WindowsUnix/Linux下,Oracle實現的體系結構是完全不同的。最大的區別就是程式模式和執行緒模式。在Unix/Linux下,程式間通訊、共享記憶體的機制是非常成熟的,所以我們常常聽到的Server Process、各個後臺程式是可以以程式的方式加以實現。SGA也可以真正做成一個記憶體共享區域。

 

而在Windows平臺上,程式之前通訊和共享記憶體是比較困難的,而且如果實現起來效能上有一些問題。所以Oracle的設計者們在Windows平臺上做出了一些折中。將Linux下的各個程式和SGA,合併成Windows下的一個Oracle.exe程式,各個後臺程式實現為Oracle程式下的執行緒單元。

 

為了更清楚的看到結構資訊,我選擇Linux平臺進行演示。

 

 

專用dedicated模式

 

在專用模式下,一個客戶對應的Server應該是一個。

 

首先,當我們啟動了例項之後,發現Oracle例項的情況如下:

 

[oracle@oracle11g ~]$ ps -ef | grep ora | grep -v grep

root      5539  5507  0 08:25 pts/0    00:00:00 su oracle

oracle    5540  5539  0 08:25 pts/0    00:00:00 bash

oracle    5561     1  0 08:31 ?        00:00:00 /u01/oracle/bin/tnslsnr LISTENER -inherit

oracle    5612     1  0 08:33 ?        00:00:00 ora_pmon_wilson

oracle    5614     1  0 08:33 ?        00:00:00 ora_vktm_wilson

oracle    5618     1  0 08:33 ?        00:00:00 ora_gen0_wilson

oracle    5620     1  0 08:33 ?        00:00:00 ora_diag_wilson

oracle    5622     1  0 08:33 ?        00:00:00 ora_dbrm_wilson

oracle    5624     1  0 08:33 ?        00:00:00 ora_psp0_wilson

oracle    5626     1  0 08:33 ?        00:00:01 ora_dia0_wilson

oracle    5628     1  0 08:33 ?        00:00:00 ora_mman_wilson

oracle    5630     1  0 08:33 ?        00:00:00 ora_dbw0_wilson

oracle    5632     1  0 08:33 ?        00:00:00 ora_lgwr_wilson

oracle    5634     1  0 08:33 ?        00:00:01 ora_ckpt_wilson

oracle    5636     1  0 08:33 ?        00:00:01 ora_smon_wilson

oracle    5638     1  0 08:33 ?        00:00:00 ora_reco_wilson

oracle    5640     1  0 08:33 ?        00:00:02 ora_mmon_wilson

oracle    5642     1  0 08:33 ?        00:00:01 ora_mmnl_wilson

oracle    5644     1  0 08:33 ?        00:00:00 ora_d000_wilson

oracle    5646     1  0 08:33 ?        00:00:00 ora_s000_wilson

oracle    5675     1  0 08:33 ?        00:00:00 ora_qmnc_wilson

oracle    5689     1  0 08:33 ?        00:00:01 ora_cjq0_wilson

oracle    5703     1  0 08:34 ?        00:00:00 ora_q000_wilson

oracle    5707     1  0 08:34 ?        00:00:00 ora_q001_wilson

oracle    5727     1  0 08:38 ?        00:00:00 ora_smco_wilson

oracle    5782     1  0 08:48 ?        00:00:00 ora_w000_wilson

oracle    5866  5540  0 09:04 pts/0    00:00:00 ps –ef

 

 

ps –ef命令,用於顯示當前系統執行緒情況。Grep ora用於獲取與oracle相關的程式列表。

額外解釋一下各個列的含義:第一列為owner,表示該程式的所有者和執行者。第二列表是程式編號PID,是系統中對程式的唯一標誌。第三列為PPID表示啟動該程式的父程式PID編號,如果為1,表示是透過init程式加以啟動的程式。最後一列表示啟動程式的命令列以及程式名稱。

 

透過上面的情況,我們可以關注兩個部分:

 

其一為標註藍色的部分:PID=5561,表示監聽器程式程式;其二為紅色部分,表示資料庫例項的各個後臺程式。如ora_pmon_wilson為例項的PMON程式,維護例項正常工作。

 

此外,可以觀察SGA共享記憶體情況。

 

 

[oracle@oracle11g ~]$ ipcs

 

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status     

0xd4d89218 32768      oracle    660        4096       0    //共享區資訊

 

------ Semaphore Arrays --------

key        semid      owner      perms      nsems    

0x89c98dc4 98304      oracle    660        154      

 

------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages   

 

 

當我們發起一個連線,使用一個sqlplus客戶端連線。

//建立個一個連線

SQL> conn sys/sys@wilson as sysdba;

已連線。

SQL> select sid from v$mystat where rownum<2;

 

       SID

----------

        29

 

此時,程式情況。

 

[oracle@oracle11g ~]$ ps -ef | grep ora

oracle    5612     1  0 08:33 ?        00:00:00 ora_pmon_wilson

oracle    5614     1  0 08:33 ?        00:00:00 ora_vktm_wilson

。。。。。。(篇幅原因,省略)

oracle    5782     1  0 08:48 ?        00:00:00 ora_w000_wilson

oracle    5910     1  0 09:12 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5912     1  0 09:13 ?        00:00:00 ora_j000_wilson

 

 

發現,程式列表中多出了一個名為oraclewilson的程式,SID編號為5910

 

同時,檢視資料庫檢視,可以發現。

//會話中,發現對應的會話記錄;

SQL> select sid, paddr, username, machine, action from v$session where username='SYS';

 

       SID PADDR    USERNAME  MACHINE    ACTION

---------- -------- ---------------------------------------------------------------

        29 38BC6C94  SYS        WORKGROUP\WWW-0E6111DFF74

//SID=29,與登入會話相同;

 

PADDR=38BC6C94,為程式的實體地址。根據這個地址,我們查詢v$process檢視。

 

//根據程式的地址,搜尋對應記錄;

SQL> select addr, spid, program from v$process where addr='38BC6C94';

 

ADDR     SPID    PROGRAM

-------- ------------------------------------------------

38BC6C94  5910   oracle@oracle11g

 

發現對應的地址的SPID5910,恰恰為多出來的oraclewilson程式的SID。說明,登入SYS的會話(SID=29)對應唯一的一個Server ProcessPID=5910

 

當關閉該視窗,退出登入後。Server Process消失。

 

[oracle@oracle11g ~]$ ps -ef | grep ora

root      5539  5507  0 08:25 pts/0    00:00:00 su oracle

oracle    5540  5539  0 08:25 pts/0    00:00:00 bash

oracle    5561     1  0 08:31 ?        00:00:00 /u01/oracle/bin/tnslsnr LISTENER -inherit

oracle    5612     1  0 08:33 ?        00:00:00 ora_pmon_wilson

。。。。。。(篇幅原因,省略)

oracle    6466     1  0 09:24 ?        00:00:00 ora_j001_wilson

oracle    6467  5540  0 09:24 pts/0    00:00:00 ps -ef

oracle    6468  5540  0 09:24 pts/0    00:00:00 grep ora

 

 

結論:在專用模式下,一個Server Process是與客戶端連線、會話一一對應的。同時建立,同時消亡。

 

 下面我們分析一下PLSQL Developer的連線特點和過程。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-683639/,如需轉載,請註明出處,否則將追究法律責任。

相關文章