中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

listener為何要進行fork兩次子進程

發布時間:2021-11-08 17:08:36 來源:億速云 閱讀:159 作者:柒染 欄目:建站服務器

listener為何要進行fork兩次子進程,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

大致分為6個階段

1

客戶端向數據庫發起連接請求,listener負責響應接受;

2

Listener進程fork子進程1

如果子進程1運行時間過長,則會導致listener長時間等待(期間不接受其他數據庫連接);如果子進程1異常則listenerhang--這句話質疑著很多,我也只是從相關資料摘抄的,沒有試驗根據

Ps ef | grep tnslsnr顯示的ppid!=1的進程便是

3

子進程1fork子進程2,然后前者退出;

此時listener等待接受子進程2的數據

4

子進程2執行系統調用exec oracle,變為oracle server process,其向listener發送自身元數據(比如pid)

5

Listenerserver 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異常則listenerhang”

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:

http://stackoverflow.com/questio ... n-creating-a-daemon

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.

 

freas

發表于 2013-6-29 00:57:21 |只看該作者

Yong Huang 發表于 2013-6-28 22:46
It's always a good habit to give reference, unless you find all this out completely from your own te ...


有哪些原因會導致僵死進程?
一般認為父進程fork之后,會調用wait()函數等待子進程結束,父進程獲取到子進程結束(子進程自己調用exit())的信息后,操作系統內核才徹底釋放一個進程的所有信息。
這里分兩種異常情況。1、父進程沒有調用wait,從而產生僵死進程。2、父進程由于某些原因,先于子進程退出,子進程成為孤兒進程被init收養,當子進程調用exit退出后,成為僵死進程,被init處理掉。
Oracle采用的double fork策略和第二點比較類似,不過,Oracle的想法比較悲觀,覺得父進程(listener)一定會異常,所以它直接把第一次fork出的子進程手工殺死(fork之后就exit),強制把fork2變成孤兒進程。
至于Oracle為什么會這么想,也就無從得知了或許在Oracle的源代碼里有注釋。但是,這種想法是否是科學的,或者是否是最先進的,保留疑問。
個人猜測,在1020年前,操作系統內核可能還不如現在的穩定健壯,僵尸進程的情況必須考慮在內,所以做出double fork的策略。
但是,double fork是由其副作用的。
首先,一個進程是內核里非常復雜(消耗資源)的組成。
一個進程要生成,至少需要4個元素:
1task_struct結構體對象。
2、進程私有地址空間。
3、內核態堆棧。
4、可執行代碼。
在調用fork一個進程的時候,這些資源是需要生成好了,才能生成進程的,exit的時候(準確的說是父進程wait返回或者是僵死進程的數據結構被回收之后),這些資源都是要釋放的,這些過程都涉及到大量數據結構的遍歷以及加鎖(smp下的spinlock)。
Oracle采取了悲觀的暴力策略,不管三七二十一,一來就forkexit,而事實上,這個fork1的進程是啥實事兒都沒做的。假設是oltp系統,假設它的并發量大一點,比如每秒鐘來個上千次連接的,操作系統僅為Oracle就要fork 2k次,exit至少1k次,這個資源消耗就大了。

 

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.

freas

1Oracle采用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的網絡處理方式,在2013727日看來,弊大于利。
3、我個人覺得這種double fork的方式更多的是從DBA的管理上來設計的。因為Oracle提供listenerstart/stop/restart接口。如果沒有采用double fork方式,一旦listener stop了,所有的server process必然成為孤兒進程(此時,server process可能正在執行復雜的transaction,風險太大),而server process顯然不應該在正式干活的時候受到listener的運行狀態的影響,所以直接在一開始就把這個有風險的操作主動做了,掌握控制權。

關于listener為何要進行fork兩次子進程問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会理县| 萍乡市| 千阳县| 合阳县| 福海县| 绍兴市| 阳曲县| 桐乡市| 台山市| 台东市| 武城县| 锡林浩特市| 富锦市| 高雄市| 陈巴尔虎旗| 蒙自县| 兰溪市| 耒阳市| 台南市| 湘西| 鹤庆县| 德化县| 都昌县| 米林县| 西和县| 县级市| 铜山县| 新源县| 突泉县| 太白县| 阜新市| 轮台县| 邮箱| 酉阳| 汉川市| 政和县| 富平县| 钟山县| 马山县| 宁南县| 北川|