并发服务器编程模型
在并發(fā)服務(wù)器編程模型中,最簡單的就是父進程監(jiān)聽外來連接請求,一旦請求到來,父進程fork()子進程處理連接,與外來客戶端進行交互。
此時通用的做法是:父進程copy自己的地址空間給子進程,此時子進程擁有與父進程相同的打開的文件描述符!即,父子進程都有一個監(jiān)聽套接字、一個連接套接字。連接建立后,父進程關(guān)閉連接套接字,子進程關(guān)閉監(jiān)聽套接字。
我們知道,調(diào)用close()關(guān)閉套接字會導(dǎo)致tcp發(fā)送FIN分節(jié)。
但是為什么父子進程關(guān)閉這兩個套接字沒有導(dǎo)致連接的斷開?
其實,在每個文件描述符或者套接字都有一個引用計數(shù)機制。只有當它的引用計數(shù)變?yōu)?的時候才會真正清理和釋放該套接字的資源。
還有一個問題就是,如果父進程從來都不關(guān)閉連接套接字那會怎么辦?
由于任何進程在任何時刻可擁有的打開著的描述符數(shù)量通常是有限制的。如果父進程不關(guān)閉連接套接字會導(dǎo)致套接字資源的耗盡,而且,沒有一個客戶連接會被終止。因為這些連接套接字的引用計數(shù)值永遠是1,不可能為0.
總結(jié)
- 上一篇: Nginx:安装+测试
- 下一篇: 41.简单说一下noexecpt关键字