Linux下服务器模型 【转载】
生活随笔
收集整理的這篇文章主要介紹了
Linux下服务器模型 【转载】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般來說有四種模式:
并發服務器:多路復用I/O? 如下:
?
select 方法 因此,雖然我們不希望在某一個用戶沒有反應時阻塞其他的用戶,但我們卻應該在沒有任何用戶有反應的情況之下停止程序的運行,讓出搶占的系統資源,進入阻塞狀態。有沒有這種方法呢?現在的UNIX系統中都提供了select方法,具體實現方式如下: select 方法中, 所有文件描述符都是阻塞的. 使用 select 判斷一組文件描述符中是否有一個可讀(寫), 如果沒有就阻塞, 直到有一個的時候就被喚醒. 我們先看比較簡單的 client 的實現: 由于 client 只需要處理兩個文件描述符, 因此, 需要判斷是否有可讀寫的文件描述符只需要加入兩項: FD_ZERO( sockset); // 將 sockset 清空 FD_SET( sockfd, sockset); // 把 sockfd 加入到 sockset 集合中 FD_SET( 0, sockset); // 把 0 (標準輸入) 加入到 sockset 集合中 然后 client 的處理如下: while ( 不想退出) { select( sockfd+1, &sockset, NULL, NULL, NULL); // 此時該函數將阻塞直到標準輸入或者 sockfd 中有一個可讀為止 // 第一個參數是 0 和 sockfd 中的最大值加一 // 第二個參數是 讀集, 也就是 sockset // 第三, 四個參數是寫集和異常集, 在本程序中都為空 // 第五個參數是超時時間, 即在指定時間內仍沒有可讀, 則出錯 // 并返回. 當這個參數為NULL 時, 超時時間被設置為無限長. // 當 select 因為可讀返回時, sockset 中包含的只是可讀的 // 那些文件描述符. if ( FD_ISSET( sockfd, &sockset)) { // FD_ISSET 這個宏判斷 sockfd 是否屬于可讀的文件描述符 從 sockfd 中讀入, 輸出到標準輸出上去. } if ( FD_ISSET( 0, &sockset)) { // FD_ISSET 這個宏判斷 sockfd 是否屬于可讀的文件描述符 從標準輸入讀入, 輸出到 sockfd 中去. } 重新設置 sockset. (即將 sockset 清空, 并將 sockfd 和 0 加入) } 下面看 server 的情況: 設置 sockset 如下: FD_ZERO( sockset); FD_SET( sockfd, sockset); for ( 所有有效連接) FD_SET( userfd, sockset); } maxfd = 最大的文件描述符號 + 1; server 處理如下: while ( 1) { select( maxfd, &sockset, NULL, NULL, NULL); if ( FD_ISSET( sockfd, &sockset)) { // 有新連接 建立新連接, 并將該連接描述符加入到 sockset 中去了. } for ( 所有有效連接) { if ( FD_ISSET ( userfd, &sockset)) { // 該連接中有字符可讀 從該連接中讀入字符, 并發送到其他有效連接中去. } } 重新設置 sockset; } 性能比較 由于采用 select 機制, 因此當沒有字符可讀時, 程序處于阻塞狀態,最小程度的占用CPU 資源, 在同一臺機器上執行一個 server 和若干個client 時, 系統負載只有 0.1 左右, 而采用原來的非阻塞通信方法, 只運行一個 server, 系統負載就可以達到 1.5 左右. 因此我們推薦使用 select.?
轉載于:https://www.cnblogs.com/cherip/archive/2009/05/26/1490477.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Linux下服务器模型 【转载】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 断奶
- 下一篇: 黄忠---忠心不二主