I O模型之Web應用服務

2022-08-03 12:30:16 字數 3061 閱讀 3914

三、復用型io呼叫

四、linux中五種i/o模型

五、http中的i/o模型

六、nginx中的i/o模型

當前最為流行的web伺服器就屬httpd和nginx。web 伺服器到底幹了什麼事?簡單點說就是接受使用者請求,響應使用者請求。這個過程的實現就是完成了跨主機之間的通訊,而主機間的通訊我們使用的是bsd(套接字)建立的socket。

為了能夠受到客戶端的請求,客戶端使用乙個socket監聽在某個ip+port之上。接受到請求,將客戶端所要的資源準備好後,在響應給客戶端。如果此時受到的請求不是乙個,而是多個的話,伺服器端要如何完成響應?如果乙個乙個的響應,顯然太慢了。如何同時完成多個請求(併發響應)?接下來我們就是談談各種i/o模型,以及httpd和nginx中所使用的i/o模型。

我們都知道程式設計師編寫程式是一定會呼叫函式的,而一旦程式設計師呼叫了函式,也就意味著程式從主函式的上下文就入了函式的上下文。這時候有兩個問題,乙個是呼叫者(此情況下是主函式)要不要等被呼叫函式返回,另乙個是被呼叫函式(被呼叫者)如何告訴呼叫者自己此時的狀態。i/o模型的不同,實際上就是程式設計師呼叫的函式不同。呼叫的函式確定了也就意味著,呼叫者和被呼叫者採取那種行為方式也確定了。接下來我們從不同的角度看i/o模型的分類。

​ 阻塞:當程式進入被呼叫者上下文時呼叫者會等被呼叫返回,呼叫者被掛起。程式執行流程圖二左。

​ 非阻塞:當程式進入被呼叫者上下文時,呼叫者也不會繼續執行,呼叫者不會被掛起。而是不斷的詢問被呼叫者的狀態。不斷詢問是需要消耗資源,實際上還沒有阻塞性能高。程式執行流程下圖二右。

關注被呼叫函式如何將結果通知給呼叫者,看的是被呼叫者的訊息通知機制

要有比較深入的理解同步和非同步我們需要稍微詳細的看一看乙個完整的i/o過程,這有了解了i/o的整個過程,我們才知道從何處優化我們的i/o模型。

這整個i/o過程我們將其分為兩階段

在核心完成i/o時使用者空間的程序在幹嘛?如果使用者空間程序在整個i/o過程中等待呼叫者返回,則此i/o模型稱之為同步;如果使用者空間程序向核心發起系統呼叫後,不是原地等待而是又去接受其他的請求,我們稱之為非同步,這也是我們希望看到的。

這有乙個問題,使用者空間程序不在原地等待他怎麼知道核心完成了資源的獲取?就像我們去餐館點了乙份面,需要二十分鐘,我們就到隔壁網咖上網去了,麵好了我們怎麼知道?在非同步i/o模型中,被呼叫者(餐館老闆,核心)會通過狀態,通知或**機制告知呼叫者(吃麵的客戶,使用者程序)被呼叫者的執行狀態(面好了沒,程序所需資源好了沒)。

同步:等待對方返回訊息,即等到上面兩個i/o完成。

非同步:發起系統呼叫後,呼叫者馬上又去響應其他的請求(開闢新的執行緒去響應別的請求),而被呼叫者通過狀態、通知或**機制通知呼叫者被呼叫者的執行狀態。當得知資源準備好了,就構建響應報文響應客戶。

乙個執行緒註冊多個i/o事件,每個i/o事件完成後都會通知呼叫者。此時使用者空間程序沒有阻塞在任何乙個i/o上,而是阻塞在i/o復用器上,例如,select,poll函式。而這種io復用的機制原先核心中是沒有,bsd組織研發的庫呼叫,呼叫函式為select,而且預設每個執行緒呼叫最多只能監聽1024個i/o事件,這個值可在編譯核心時進行修改,但大於1024效能沒多大影響。csv組織研發庫呼叫,呼叫函式為poll,註冊的i/o事件不受1024限制但過了1024效能也沒變化。

1)阻塞i/o(blockingi/o)

2)非阻塞i/o (nonblocking i/o)

3) i/o復用(select 和poll) (i/o multiplexing)

4)訊號驅動i/o(epoll)(signal driven i/o (sigio))

5)非同步i/o (asynchronous i/o(the posix aio_functions))

前四種都是同步,只有最後一種才是真正的非同步io。

在這介紹一下上面沒有涉及的訊號驅動模型,套接字使用訊號驅動,它使用了乙個訊號處理函式,程序繼續執行並不阻塞,當核心將資料放入核心緩衝區後,程序就會收到乙個sigio訊號,並在訊號處理函式中呼叫i/o操作函式處理資料。他也是i/o復用中的一種,從上圖中可以看出它在i/o的第一階段實現了非同步,由於第二階段是阻塞的故依舊是阻塞的。

http支援多處理模組mpm(multipathprocessing modules)

乙個主程序只負責生成n個子程序,子程序才是真正的工作程序,每個程序響應乙個請求。在httpd服務啟動後他就會生成對個空閒程序,為隨時能夠到達的請求服務。profork模型中主程序使用的使用的i/o復用中的select機制,故子程序最多不超過1024個。我們知道管理乙個子程序包括建立,需要分配記憶體資源,程序進入僵死態後還需要等父程序銷毀。這對父程序來說是很大的開銷。

二級模型,父程序生成子程序,子程序生成執行緒,每個執行緒響應乙個請求。在linux中程序是輕量級執行緒,父程序在使用fork函式通過拷貝自身建立子程序,子程序除了一些id之類的標識資訊不同外,所有的資源與父程序共用,只有子程序在更改資源時才會複製到自身結構體中,也就是寫時複製(copy on write)。故profork模型和worker模型區別不大。

二級結構,主程序生成多個子程序,每個子程序基於事件驅動模型可相應多個請求。事件驅動模型在httpd-2.2版本中為測試模型,在httpd-2.4中才可用於生產。

nginx建立的初衷就是解決c10k問題(2005,2023年,現在是c10k,c100k問題),也就是併發達到一萬是http就難以承載,我們急需一種高併發,輕量級web伺服器。而nginx就是在這種情況下產生的。而它的高併發採用event模型,呼叫的函式是epoll。換句話說,基於epoll的事件驅動模型是nginx高併發的優勢所在,作為web伺服器的nginx一定會使用epoll模型,不然失去了nginx作為web伺服器使用的意義。

(注:參考 感謝博主的總結歸納和分享)

web應用服務開發

serverless 架構應該會是未來的乙個新趨勢。得益於我司十幾年前一幫大神資料庫表模型設計的優異,一開始剛進公司的時候,很是驚嘆。通過客戶端配配屬性,乙個查詢頁面和乙個資源實體的屬性控制項頁面就生成好了。每週花十五分鐘閱讀就可以了解最新的 swift 開發進度 okhttp 使用小記 快取和驗證...

web應用服務簡述

動態資源即通過程式 j a php python net 和資料庫 mysql oracle sqlserver 根據業務處理流程動態生成網頁的html,再將html響應給請求 客戶端 http 1.0 1.1 2.0 和html的關係 1.客戶端封裝http請求 httprequest 向服務端發...

ABP之應用服務 1

那麼問題來了 1.什麼是dto?2.dto的好處是什麼?一.dto dto data transfer object 資料轉換物件,也就是用來傳遞資料用的。dto的好處 1.在ef的codefirst的model中,我們經常會使用導航屬性,但是使用導航屬性,帶來方便的同時,經常會遇到將資料序列化的問...