日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下服务器模型 【转载】

發(fā)布時間:2025/4/14 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下服务器模型 【转载】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一般來說有四種模式:

并發(fā)服務(wù)器:多路復(fù)用I/O? 如下:

1. 非阻塞通信方法 對一個文件描述符指定的文件或設(shè)備, 有兩種工作方式: 阻塞與非阻塞。所謂阻塞方式的意思是指, 當(dāng)試圖對該文件描述符進行讀寫時, 如果當(dāng)時沒有東西可讀,或者暫時不可寫, 程序就進入等待狀態(tài), 直到有東西可讀或者可寫為止。而對于非阻塞狀態(tài), 如果沒有東西可讀, 或者不可寫, 讀寫函數(shù)馬上返回, 而不會等待。缺省情況下, 文件描述符處于阻塞狀態(tài)。在實現(xiàn)聊天室時, server 需要輪流查詢與各client 建立的 socket, 一旦可讀就將該 socket 中的字符讀出來并向所有其他client 發(fā)送。并且, server 還要隨時查看是否有新的 client 試圖建立連接,這樣, 如果 server 在任何一個地方阻塞了, 其他 client 發(fā)送的內(nèi)容就會受到影響,得不到服務(wù)器的及時響應(yīng)。新 client 試圖建立連接也會受到影響。所以我們在這里不能使用缺省的阻塞的文件工作方式,而需要將文件的工作方式變成非阻塞方式。在UNIX下,函數(shù)fcntl() 可以用來改變文件I/O操作的工作方式,函數(shù)描述如下: fcntl( sockfd, F_SETFL, O_NONBLOCK); // sockfd 是要改變狀態(tài)的文件描述符. // F_SETFL 表明要改變文件描述符的狀態(tài) // O_NONBLOCK 表示將文件描述符變?yōu)榉亲枞? 為了節(jié)省篇幅我們使用自然語言描述聊天室 server : while ( 1) { if 有新連接 then 建立并記錄該新連接; for ( 所有的有效連接) begin if 該連接中有字符可讀 then begin 讀入字符串; for ( 所有其他的有效連接) begin 將該字符串發(fā)送給該連接; end; end; end; end. 由于判斷是否有新連接, 是否可讀都是非阻塞的, 因此每次判斷,不管有還是沒有, 都會馬上返回. 這樣,任何一個 client 向 server 發(fā)送字符或者試圖建立新連接, 都不會對其他 client 的活動造成影響。 對 client 而言, 建立連接之后, 只需要處理兩個文件描述符, 一個是建立了連接的 socket 描述符, 另一個是標(biāo)準(zhǔn)輸入. 和 server 一樣, 如果使用阻塞方式的話, 很容易因為其中一個暫時沒有輸入而影響另外一個的讀入.. 因此將它們都變成非阻塞的, 然后client 進行如下動作: while ( 不想退出) begin if ( 與 server 的連接有字符可讀) begin 從該連接讀入, 并輸出到標(biāo)準(zhǔn)輸出上去. End; if ( 標(biāo)準(zhǔn)輸入可讀) Begin 從標(biāo)準(zhǔn)輸入讀入, 并輸出到與 server 的連接中去. End; End. 上面的讀寫分別調(diào)用這樣兩個函數(shù): read( userfd, line, MAX_LINE); // userfd 是指第 i 個 client 連接的文件描述符. // line 是指讀出的字符存放的位置. // MAX_LINE 是一次最多讀出的字符數(shù). // 返回值是實際讀出的字符數(shù). write( userfd[j], line, strlen( line)); // userfd[j] 是第 j 個 client 的文件描述符. // line 是要發(fā)送的字符串. // strlen( line) 是要發(fā)送的字符串長度. 分析上面的程序可以知道, 不管是 server 還是 client, 它們都不停的輪流查詢各個文件描述符, 一旦可讀就讀入并進行處理. 這樣的程序, 不停的在執(zhí)行, 只要有CPU 資源, 就不會放過。因此對系統(tǒng)資源的消耗非常大。server 或者 client 單獨執(zhí)行時, CPU 資源的 98% 左右都被其占用。極大的消耗了系統(tǒng)資源。

?

select 方法 因此,雖然我們不希望在某一個用戶沒有反應(yīng)時阻塞其他的用戶,但我們卻應(yīng)該在沒有任何用戶有反應(yīng)的情況之下停止程序的運行,讓出搶占的系統(tǒng)資源,進入阻塞狀態(tài)。有沒有這種方法呢?現(xiàn)在的UNIX系統(tǒng)中都提供了select方法,具體實現(xiàn)方式如下: select 方法中, 所有文件描述符都是阻塞的. 使用 select 判斷一組文件描述符中是否有一個可讀(寫), 如果沒有就阻塞, 直到有一個的時候就被喚醒. 我們先看比較簡單的 client 的實現(xiàn): 由于 client 只需要處理兩個文件描述符, 因此, 需要判斷是否有可讀寫的文件描述符只需要加入兩項: FD_ZERO( sockset); // 將 sockset 清空 FD_SET( sockfd, sockset); // 把 sockfd 加入到 sockset 集合中 FD_SET( 0, sockset); // 把 0 (標(biāo)準(zhǔn)輸入) 加入到 sockset 集合中 然后 client 的處理如下: while ( 不想退出) { select( sockfd+1, &sockset, NULL, NULL, NULL); // 此時該函數(shù)將阻塞直到標(biāo)準(zhǔn)輸入或者 sockfd 中有一個可讀為止 // 第一個參數(shù)是 0 和 sockfd 中的最大值加一 // 第二個參數(shù)是 讀集, 也就是 sockset // 第三, 四個參數(shù)是寫集和異常集, 在本程序中都為空 // 第五個參數(shù)是超時時間, 即在指定時間內(nèi)仍沒有可讀, 則出錯 // 并返回. 當(dāng)這個參數(shù)為NULL 時, 超時時間被設(shè)置為無限長. // 當(dāng) select 因為可讀返回時, sockset 中包含的只是可讀的 // 那些文件描述符. if ( FD_ISSET( sockfd, &sockset)) { // FD_ISSET 這個宏判斷 sockfd 是否屬于可讀的文件描述符 從 sockfd 中讀入, 輸出到標(biāo)準(zhǔn)輸出上去. } if ( FD_ISSET( 0, &sockset)) { // FD_ISSET 這個宏判斷 sockfd 是否屬于可讀的文件描述符 從標(biāo)準(zhǔn)輸入讀入, 輸出到 sockfd 中去. } 重新設(shè)置 sockset. (即將 sockset 清空, 并將 sockfd 和 0 加入) } 下面看 server 的情況: 設(shè)置 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)) { // 該連接中有字符可讀 從該連接中讀入字符, 并發(fā)送到其他有效連接中去. } } 重新設(shè)置 sockset; } 性能比較 由于采用 select 機制, 因此當(dāng)沒有字符可讀時, 程序處于阻塞狀態(tài),最小程度的占用CPU 資源, 在同一臺機器上執(zhí)行一個 server 和若干個client 時, 系統(tǒng)負(fù)載只有 0.1 左右, 而采用原來的非阻塞通信方法, 只運行一個 server, 系統(tǒng)負(fù)載就可以達到 1.5 左右. 因此我們推薦使用 select.

?

轉(zhuǎn)載于:https://www.cnblogs.com/cherip/archive/2009/05/26/1490477.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Linux下服务器模型 【转载】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。