小議服務程式與會話(一)
Server Process是客戶端在資料庫伺服器端操作的代表。任何操作,從SQL語句的傳遞執行,到資料塊讀取修改,都是透過Server Process完成的。
Server Process與Session之間的關係是什麼樣的呢?
基礎說明
筆者在之前的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可能也不會被回收。
下面進行的實驗,是在Linux的CentOS系統下進行的實驗。在Windows和Unix/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
發現對應的地址的SPID為5910,恰恰為多出來的oraclewilson程式的SID。說明,登入SYS的會話(SID=29)對應唯一的一個Server Process,PID=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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微信小程式服務推送微信小程式
- 搭建微信小程式服務微信小程式
- 哪裡有開會議服務費發票_開票服務大廳
- 哪裡有開服務會議費發票_開票服務大廳
- php 小程式服務商支付模式PHP模式
- 小組第一次會議
- 特靈空調售後服務電話(全國24小時客服服務熱線)
- 如何開發同城生活服務小程式?
- Node服務下的微信小程式微信小程式
- WebSocket實現服務端推送訊息和聊天會話Web服務端會話
- 如何實現在服務端錄製視訊會議?服務端
- [服務端與網路]http協議與http狀態碼服務端HTTP協議
- 來~打包實現小程式動態分享圖一條龍服務( ¨̮ )
- 服務啟動一個程式
- mysql鎖與會話MySql會話
- 給服務端小白的一些建議服務端
- 關於北京開會議費發票-開票服務大廳一北京本地寶
- 關於深圳開會議費發票-開票服務大廳一深圳本地寶
- 關於杭州開會議費發票-開票服務大廳一杭州本地寶
- 關於南京開會議費發票-開票服務大廳一南京本地寶
- 關於昆明開會議費發票-開票服務大廳一昆明本地寶
- 阿里巴巴:1Q21財報電話會議實錄 停止UC web和其他創新業務在印度的服務阿里Web
- PMP常見會議小結
- 關於上海開會議費發票-開票服務大廳一上海本地寶
- 從零搭建一個IdentityServer——會話管理與登出IDEServer會話
- 融雲漫話:沒有一個人躲得過“視訊會議”
- Cobaltstrike與MSF會話派生會話
- 前端【小程式】14-小程式基礎篇【地理位置】【騰訊定位服務】前端
- 阿里雲智慧對話分析服務阿里
- 小程式開發家政公司、家政服務平臺。
- 小程式成為本地生活服務的“功守道”
- 使用微信小程式連線到 MQTT 雲服務微信小程式MQQT
- 微信小程式新增外部地圖服務資料微信小程式地圖
- “文章助手”小程式已服務十萬次 URL 訪問
- 關於廣州開會議費發票-開票服務大廳一廣州本地寶
- 關於武漢開會議費發票-開票服務大廳一武漢本地寶
- 關於長沙開會議費發票-開票服務大廳一長沙本地寶
- 關於鄭州開會議費發票-開票服務大廳一鄭州本地寶
- 關於東莞開會議費發票-開票服務大廳一東莞本地寶