listener為何要fork兩次子程式
http://www.itpub.net/thread-1799332-1-1.html
以下是根據網路資料個人總結的listener監聽流程(如果有誤煩請指正)
大致分為6個階段
1
客戶端向資料庫發起連線請求,listener負責響應接受;
2
Listener程式fork子程式1;
如果子程式1執行時間過長,則會導致listener長時間等待(期間不接受其他資料庫連線);如果子程式1異常則listener會hang;--這句話質疑著很多,我也只是從相關資料摘抄的,沒有試驗根據
Ps –ef | grep tnslsnr顯示的ppid!=1的程式便是
3
子程式1fork子程式2,然後前者退出;
此時listener等待接受子程式2的資料
4
子程式2執行系統呼叫exec oracle,變為oracle server process,其向listener傳送自身後設資料(比如pid)
5
Listener向server procees傳送客戶端資料,然後寫入listener.log;
直到此刻listener任務完成,可以接著處理下一個連線
6
Server process與客戶端互動,完成後續工作
問題:
為何listener要建立fork兩次子程式,直接採用第一個子程式呼叫exec oracle不可以麼?
以下是回覆,個人受教很多
本帖最後由 Yong Huang 於 2013-6-28 08:48 編輯
It's always a good habit to give reference, unless you find all this out completely from your own test.
I've done such test a long time ago. What you described is basically correct. But this
“如果子程式1執行時間過長,則會導致listener長時間等待(期間不接受其他資料庫連線);如果子程式1異常則listener會hang”
is new to me. I'd like to know the source.
The reason why listener needs to fork twice is related to the requirement of a UNIX daemon. The best answer is here:
Basically, if it forked only once, the server (shadow) process would still have a parent i.e. the tnslsnr process instead of init (pid 1). Forking twice, after the first child exits, the second child will definitely become an orphan and then init becomes its parent.
You may ask why bother to make sure the server process is a daemon. I think the answer is just that Oracle wants to make sure the server process is independent of the listener, so if the listener dies, existing server processes continue to function because they're immune from signals that will be sent to the listener.
發表於 2013-6-29 00:57:21 |只看該作者
Yong
> Oracle為什麼會這麼想,也就無從得知了
Didn't you already answer this question? "Oracle的想法比較悲觀,覺得父程式(listener)一定會異常". In case the listener crashes, the server process must be protected from crashing. Although I think it's possible to program the child to not receive any signal delivered to the parent (tnslsnr), it's safer to just fork one more time and let the first child exit.
I haven't checked 12c. But I think somebody says beginning with 12c, Oracle on UNIX/Linux adopts the thread model as on Windows. Hope somebody can check.
1、Oracle採用doule fork主要你是為了預防子程式退出時,listener已經crash了,子程式成為僵死程式沒有解決策略。至於"in case the listener crashes, the server process must be protected from crashing",父程式crash,子程式仍然可以正常執行,只是子程式呼叫exit之後,會成為僵死程式。
2、“> Oracle為什麼會這麼想,也就無從得知了
Didn't you already answer this question? "Oracle的想法比較悲觀,覺得父程式(listener)一定會異常". ”我只是從技術層面猜測一下,而且,在上面的猜測裡,double fork的方法作為一個server的網路處理方式,在2013年7月27日看來,弊大於利。
3、我個人覺得這種double fork的方式更多的是從DBA的管理上來設計的。因為Oracle提供listener的start/stop/restart介面。如果沒有采用double fork方式,一旦listener stop了,所有的server process必然成為孤兒程式(此時,server process可能正在執行復雜的transaction,風險太大),而server process顯然不應該在“正式幹活”的時候受到listener的執行狀態的影響,所以直接在一開始就把這個有風險的操作主動做了,掌握控制權(哎,這種說法太意淫了)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2148915/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 何為程式語言?為什麼要學C語言?C語言
- 為何要再封裝 AJAX?封裝
- 為何要學習心理學
- 幾行程式碼就能實現為何要多此一舉行程
- 【譯】為何我們要寫super(props)?
- fork、父程式和子程式
- 有Hive之後,為何還要學mapreduceHive
- 學PHP 為何要加入技術交流群PHP
- 為何要大力發展教學直播系統?
- 1.5.1 Python程式使用 -- forkPython
- Linux fork程式的用法Linux
- fork和殭屍程式
- 區塊鏈為何要註冊新加坡基金會區塊鏈
- Linux中fork和exec是什麼?有何區別?Linux
- 我做過淘寶、京東和微商,為何要再做一個小程式商城?
- 賣相不俗的二遊為何口碑兩極分化!?
- 企業資料為何要選擇企業雲盤
- 企業為何要將ERP系統遷移至雲端?
- 低程式碼“蛋糕”為何格外香甜?
- Listener
- CORS跨域時,為何會傳送兩次請求?CORS跨域
- 為什麼Oracle要搞出兩個髒連結串列Oracle
- 對《JavaScript高階程式設計(第4版)》一書中為何要翻譯promise的回覆JavaScript程式設計Promise
- 程式中fork和vfork的區別
- git 同步fork的倉庫程式碼Git
- Sping系列第一講 請問各位大佬為何要學spring?Spring
- 阿里雲不做的Saas,微軟云為何要押重注?阿里微軟
- 專案為何要開展第三方測試
- 程式猿生存指南-50 何為商機
- 【LiteApp系列】何為愛奇藝小程式?APP
- 為何程式設計師工資高?程式設計師
- 程式猿生存指南-49 何為渣男
- 小程式直播與抖音直播兩者有何區別?
- 【多程式】Linux中fork()函式詳解|多程式Linux函式
- 何為程式碼質量?——用腦子寫程式碼
- 主力已完全控盤,為何還要打壓股價吸籌?
- PostgreSQL server端接收連線後fork程式SQLServer
- 無程式碼開發為何會受到追捧?
- 兩年了,蘋果付費榜為何還是個廢榜?蘋果