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