linux如何處理多鏈接請求?

1.TCP迭代服務器程序服務器

這種方式就是服務器同一時間只處理一個客戶端的請求,這個請求處理完之後才轉向下一個客戶請求。固然這樣的服務器程序比較少見,這就像一個公司只能一次處理一個客戶,後面的客戶只能等待,這樣的話確定是不行的,效率過低 了,可是要是從進程控制角度來看這種方式是最快的,由於它沒有執行進程控制,這是相對於後面講的方式多進程而言的,啥意思呢,就是說一個公司裏面當你只有一個銷售員接待客戶的時候,我對銷售員的管理成本就沒有了,當你是多個銷售員對應多個客戶的時候,雖然這個時候能夠同時接待多個客戶,可是老闆對多個銷售員的管理成本也要算進去,上面說的進程控制就是老闆對多個銷售員的管理。數據結構

2.TCP併發服務器程序,每一個客戶一個子進程併發

這種方式呢,就是多個進程處理多個鏈接,每來一個新的鏈接,就當即建立(fork)一個新的子進程來處理這個鏈接,這種方式的問題是爲每一個新鏈接現場fork一個子進程比較耗費cpu時間,操做系統在fork子進程時要作的事情不少的,首先須要複製父進程的相關數據結構,而後在初始化權限,調度器,文件系統,內存這一系列操做,因此建立一個子進程的開銷是很大的,尤爲是如今這個時代,繁忙的服務器天天的鏈接數能夠達到數以百萬計。socket

舉例來講這種方式就像你做爲老闆,每接一個項目就建立一個新的子公司,這個子公司的人員,桌椅板凳,各類工具都是新的,項目完成之後該子公司解散。tcp

3.TCP預先派生子進程服務器程序函數

這種方式就是在啓動階段預先建立多個子進程,當各個客戶鏈接到來時,子進程就能夠立刻爲他們服務,而不是說當客戶來的時候在建立好子進程爲他們服務,這種方式優勢就是沒有了父進程fork的開銷,缺點就是父進程必須在服務器啓動階段猜想須要預先建立多少子進程,並且父進程還要實時監控進程池中的進程數,當這個數字高於某個閾值時,須要終止多餘的進程,當這個數字低於某個閾值時,須要建立新進程。工具

舉例來講:這就像老闆預先建立了多個子公司,當來項目時,讓建立好的子公司接項目就能夠 了,而不是像第二種方式那樣,來客戶了,你再去建立子公司,可是做爲老闆你要全局把控,當你發現子公司的數量太多,已經遠大於項目的數量,這時候你就要註銷掉一部分公司,以節省開銷,一樣反過來,當你發現接的項目數不少,增加的速度不少,那麼你就須要立刻在建立幾個子公司來處理項目,要否則你的項目就接不到了,就掙不了錢,沒法迎娶白富美,走上人生巔峯了。性能

而後咱們再說關於這種方式會發生的一個問題,這個問題就叫作"驚羣",啥意思呢,就是說當來了一個新請求時,全部的進程都會被喚醒,可是最後只有一個進程能接到這個請求,這樣就會致使性能受損。操作系統

舉例來講:當沒有項目來的時候,全部的子公司都處於放假狀態,全部人員都休息了,而後來了一個新的項目,全部的公司都得恢復到上班狀態,可是其實到最後只有一個公司能接到這個項目,這樣對於其餘子公司員工來講是否是有點煩,老子正在放假休息呢,而後你把我召回到了公司還沒事情作,讓我白跑一趟,交通費食宿費這些都屬於浪費掉了,對應到操做系統來講就是性能受損。線程

4.TCP併發服務器程序,每一個客戶一個線程

這種方式就是每來一個客戶請求,就建立一個線程,建立線程的開銷要比建立進程的開銷小多了,建立線程就是將各個結構的引用計數加一,建立棧等操做,相對比建立進程來講開銷要小不少了,這其實就像公司接項目的時候不是建立子公司,而是建立多個項目組,項目組能夠共用公司的各類資源。

這裏說一下accept的概念,accept是套接字(socket)中的一個函數,他是用來接收服務器中已完成鏈接隊列裏面的鏈接,也就是服務器會有一個隊列專門用來存放已經三次握手完成的tcp鏈接,當這個隊列有數據的時候,調用這個accept函數就會從隊列頭部拿出一個鏈接給應用程序處理。

5.TCP預先建立線程服務器程序,每一個線程各自accept

這種其實就是服務器啓動階段預先建立線程池,也就是多個線程以取代爲每一個客戶鏈接現場建立一個線程有性能加速效果,這種作法就像來了一個新項目,只有一個項目組接這個項目,其餘項目組仍是作原來作的事情。

6.TCP預先建立線程服務器程序,主線程統一accept

這種方式就是在程序啓動階段建立一個線程池以後只讓主線程調用accept並把每一個客戶鏈接傳遞給池中某個可用線程,這就像有個全部項目組的總管,他負責接項目,來了項目之後,他去把這個項目分配給能夠開發的項目組。

 

瞭解更多:https://www.toutiao.com/c/user/83293539887/#mid=1633933053814798

相關文章
相關標籤/搜索