高性能服務器程序框架知識梳理

服務器編程框架

服務器程序種類有很多,但是基本框架都一樣,核心不同點在于邏輯處理單元。基本框架包含:I/O處理單元、邏輯單元、網絡存儲單元以及請求隊列

  • I/O處理單元(主線程):服務器用來管理客戶連接的模塊。通常需要等待并接受客戶連接,接受客戶數據,將服務器響應返回給客戶端。但是,數據的收發也可能在邏輯單元(工作線程)中完成。(數據收發在I/O單元上一個典型的事件處理模式就是模擬Proactor)
  • 邏輯單元:分析處理客戶數據,將結果給I/O或者給客戶端,服務器通常擁有多個邏輯單元實現對多個客戶任務的并行處理
  • 網絡存儲單元可以是數據庫、緩存或者文件,甚至是一臺獨立的服務器,也不是必須的比如ssh
  • 請求隊列是各服務器之間預先建立的、靜態的、永久的TCP連接,通常被設計為池的一部分,負責以上個單元的通信

I/O模型

  • 同步I/O模型:比如阻塞I/O、I/O復用,即I/O的讀寫操作都是由應用程序來完成的,也就是說同步IO模型要求用戶代碼自動執行IO操作(即將數據從內核緩沖區讀入或者寫入用戶緩沖區)
  • 異步I/O模型:用戶可以之間對IO執行讀寫操作,看起來是這樣但是實際上用戶只是處理了客戶端的請求,沒有真正執行IO操作,它實際上只告訴內核用戶緩沖區的位置以及IO操作完成后如何通知應用程序進行剩下的邏輯處理,然后內核開始執行IO操作
  • 綜上,對于應用程序來說,同步IO模型告訴他的是事件是否就緒的信息,異步IO則是告訴他事件被完成的消息

高效的事件處理模式

Reactor模式(同步IO模型):

?????????要求主線程(I/O處理單元)只負責監聽fd上是否有事件發生,有的話立即將事件通知給工作線程(邏輯單元),邏輯單元進行讀寫數據(用戶代碼執行IO操作),接受新的連接以及處理客戶請求,并將結果寫入到socket上返回給客戶。工作流程如下(以一次請求為例):

  1. 主線程往epoll注冊socket上的讀就緒事件
  2. 主線程調用epoll_wait監聽,等待socket上有數據可讀
  3. 當socket上有數據可讀,epoll_wait通知主線程,主線程將事件放入請求隊列喚醒工作線程處理
  4. 某個工作線程從socket讀取數據,然后處理客戶請求(協議解析 、處理業務邏輯比如數據庫查詢),并往epoll上注冊socket上的寫就緒事件
  5. 主線程調用epoll_wait監聽寫就緒事件
  6. epoll_wait通知主線程寫就緒,主線程將寫事件放入請求隊列
  7. 請求隊列上某個線程被喚醒,往socket寫入客戶請求的結果
Proactor(異步I/O模型):

? ? ? ? 所有的I/O操作交給內核處理,工作線程負責處理業務邏輯,工作流程如下(以aio_read/aio_read為例):

  1. 主線程調用aio_read向內核注冊讀完成事件,并且告訴內核用戶緩沖區的位置以及讀操作完成后如何通知應用程序
  2. 主線程繼續處理其他邏輯
  3. 當socket上的數據被讀入用戶緩沖區(這里說明一下,從socket的上讀數據,本質上是通過系統調用從內核緩沖區讀取到用戶緩沖區)后,內核通知應用程序告訴他可用
  4. 應用程序選擇一個工作線程進行業務處理比如協議解析、查詢數據庫、業務判斷等,處理完之后調用aio_read向內核注冊一個寫完成事件,并告訴內核用戶緩沖區的位置,以及寫操作完成后如何通知應用成
  5. 主線程繼續執行其他邏輯
  6. 當用戶緩沖區被寫入socket后,內核通知應用程序,結果已經發送完畢,應用程序選擇一個工作線程進行善后,決定是否關閉socket

????????綜上,連接socket上的事件是由系統調用aio_read/aio_rea注冊到內核的,主線程只調用epoll_wait只用來檢測和監聽socket上的連接請求事件

模擬Proator:

? ? ? ? 這就是使用同步I/O模擬出Proator的方法,主線程“充當”內核,工作線程依舊只處理業務邏輯。主線程往socket上注冊事件,主線程調用epoll_wait()檢測和監聽事件,主線程處理讀寫事件。

兩種高效的并發模式(針對I/O密集型,比如經常讀寫數據或訪問數據庫)

? ? ? ?首先I/O模型中的同步和異步用來區分:

? ? ? ? 第一,內核向應用程序通知的是何種IO事件,是就緒事件還是完成事件

? ? ? ? 第二,由誰來完成IO讀寫操作,內核還是用戶代碼(應用程序)。

? ? ? ? 在并發模式中,同步指的是程序完全按照代碼的順序去執行;“異步”只程序的執行由系統事件驅動。

半同步/半異步:?

????????同步線程用于處理客戶邏輯,異步線程用于處理I/O事件。異步線程監聽到客戶請求后,將其封裝插入請求隊列,請求隊列通知某個工作在同步模式的線程讀取并處理該請求對象。

? ? ? ? 同屬于該模式的還有:

  • 半同步/半反應堆(結合了Reactor模式):工作過程見Reacor模式。 當然了也可以結合模擬proactor,主線程完成IO操作
  • 主線程只負責管理監聽socket,連接socket由工作線程來管理,并且該socket上的任何IO操作都由該工作線程負責,直到客戶端關閉連接。簡單來說,主線程監聽到一個客戶端的連接,就把一個客戶端交給一個工作線程,就好像發任務一樣,每個人對接一個客戶,處理該客戶的所有請求。所以,工作線程也是會維持自己的事件循環。
領導者/追隨者

? ? ? ? 多個工作線程輪流獲得事件源,輪流監聽,分發并處理事件。在任意時間點,程序都有一個線程成為領導者,負責監聽I/O事件。當前的領導者如果監聽到I/O事件,首先從線程池中推選新的領導者,然后自己處理事件。此時,新的領導者在監聽,舊領導者在執行實現了并發

? ? ? ? 當然了,領導者在監聽到事件時指定一個追隨者來處理事件,此時領導者不變,繼續監聽。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84779.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AI】從0開始玩轉混元3D?模型,如何讓一張靜態實物圖片一鍵轉為3D實物圖,大模型都表示服了,超級簡單易上手,快來試試!

HAI 與 NVIDIA ,為開發者提供一鍵部署及生圖的能力,讓開發者體驗3D 模型的同時,也了解云的便利性。 混元3D 2.0是騰訊推出的尖端3D?成模型,能夠創建帶有?分辨率紋理貼圖的?保真3D資產 參賽報名:https://marketing.c…

電路圖識圖基礎知識-電動機的保護電路保護方式(二十六)

電動機保護電路是確保電動機安全、可靠運行的關鍵技術之一。在工業和日常生活中,電動機被廣泛應用于各種設備中,其安全運行對于保障生產效率和人身安全至關重要。本文將詳細介紹電動機保護電路的重要性、保護方式以及具體的電路分析,以期為電…

【Pandas】pandas DataFrame droplevel

Pandas2.2 DataFrame Reshaping sorting transposing 方法描述DataFrame.droplevel(level[, axis])用于**從 DataFrame 的索引(行或列)中刪除指定層級(level)**的方法 pandas.DataFrame.droplevel() pandas.DataFrame.droplev…

Delivering Arbitrary-Modal Semantic Segmentation(CVPR2023)任意模態語義分割論文閱讀

文章目錄 文章研究思路創建了DeLiVER任意模態分割基準數據集統計信息4種模態25個語義類 提出了任意跨模態分割模型CMNeXt自查詢中心(Self-Query Hub,SQ-Hub)并行池化混合器(Parallel Pooling Mixer,PPX) 實…

進程控制

一. 進程創建 1.fork的概念與使用 在 Linux 中 fork 可以在一個進程中創建一個新的進程。這個新進程稱為子進程&#xff0c;原進程為父進程。使用前需要包含頭文件 #include <unistd.h> 。在調用 fork 函數時&#xff0c;子進程與父進程會共享數據和代碼&#xff0c;此…

造輪子系列:從0到1打造生產級HTTP客戶端,優雅封裝OkHttp/HttpClient,支持異步、重試與文件操作

TechZhi HTTP Client Starter 源碼特性快速開始1. 添加依賴2. 配置3. 使用 主要功能支持的HTTP方法文件操作功能高級功能配置示例 API使用示例基本請求自定義請求異步請求文件操作示例錯誤處理 構建和測試依賴說明 本文將介紹一款本人開發的高性能Spring Boot HTTP客戶端Starte…

Java過濾器的基本概念

概述 Java 過濾器是 Java EE (Jakarta EE) 中的一種組件&#xff0c;用于在請求到達 Servlet 或 JSP 之前對其進行預處理&#xff0c;或者在響應返回客戶端之前對其進行后處理。過濾器主要應用于以下場景&#xff1a; 請求參數過濾和轉換字符編碼處理身份驗證和授權日志記錄壓…

gbase8s數據庫獲取jdbc/odbc協議的幾種方式

PROTOCOLTRACEFILED:\sqltrace1.log;PROTOCOLTRACE5 jdbc 參數 &#xff0c;明文協議&#xff0c;并發時 會錯亂&#xff0c;適合單線程調試 SQLIDEBUGC:\Users\lenovo\Desktop\sqlidebug.log1 jdbc參數&#xff0c;密文協議&#xff0c;需使用解密工具解析&#xff0c;解析…

【android bluetooth 框架分析 04】【bt-framework 層詳解 7】【AdapterProperties介紹】

前面我們提到了 藍牙協議棧中的 Properties &#xff0c; 這篇文章是 他的補充。 【android bluetooth 框架分析 04】【bt-framework 層詳解 6】【Properties介紹】 在 AOSP&#xff08;Android Open Source Project&#xff09;中&#xff0c;AdapterProperties 是一個 Java…

C盤瘦身?

突然發現回收站底部有橫幅辣眼睛&#xff01; 點擊深度清理跳轉C盤瘦身 點擊一鍵瘦身跳轉支付 回收站右鍵還有菜單 回收站右鍵可以通過設置關閉 回收站底部橫幅關不了&#xff01; 流氓沒人管了嗎&#xff1f;

用戶通知服務,輕松實現應用與用戶的多場景交互

用戶在使用應用時&#xff0c;經常想要了解應用程序在執行的操作&#xff0c;如下載完成、新郵件到達、發布即時的客服支付通知等&#xff0c;這些通知除了攜帶基本的文本圖片信息外&#xff0c;最好還可以支持文件上傳下載進度場景下的進度條通知&#xff0c;以及點擊通知欄可…

蘋果獲智能錢包專利,Find My生態版圖或再擴張:錢包會“說話”還能防丟

蘋果公司近日成功獲批一項突破性專利&#xff0c;揭示了一種支持Find My網絡的全新智能錢包設計方案。該錢包不僅能智能管理用戶的信用卡、身份證等實體卡片&#xff0c;更具備了追蹤定位和通過揚聲器發聲提醒的能力&#xff0c;有望成為蘋果“查找”&#xff08;Find My&#…

當機床開始“思考”,傳統“制造”到“智造”升級路上的法律暗礁

——首席數據官高鵬律師團隊創作&#xff0c;AI輔助 一、被時代推著走的工廠&#xff1a;從“鐵疙瘩”到“智能體”的陣痛 某汽車零部件廠的李廠長至今記得三年前的凌晨。為了趕上新能源車企的訂單&#xff0c;廠里咬牙引進了兩條智能生產線&#xff0c;可調試第三天&#xff…

概率基礎——不確定性的數學

第05篇&#xff1a;概率基礎——不確定性的數學 寫在前面&#xff1a;大家好&#xff0c;我是藍皮怪&#xff01;前幾篇我們聊了統計學的基本概念、數據類型、描述性統計和數據可視化&#xff0c;今天我們要進入統計學的另一個重要基礎——概率論。你有沒有想過&#xff0c;為什…

爬蟲遇到base64編碼(非常規版)

一.特征 從 Base64 的核心特性入手&#xff0c;比如它的編碼原理&#xff08;將二進制數據轉換為 ASCII 字符集&#xff09;和字符集的組成&#xff08;A-Z、a-z、0-9、、/ 和 &#xff09;。這是 Base64 最基礎的特點&#xff0c;幾乎每個回答都應該包括這些內容。基于 64 個…

節拍定時器是什么?

節拍定時器是什么&#xff1f; 節拍定時器&#xff08;SysTick Timer&#xff09;是嵌入式系統中用于提供精確時間基準的核心硬件組件&#xff0c;尤其在ARM Cortex-M系列處理器中廣泛應用。以下是其關鍵特性和應用的綜合說明&#xff1a; ?? 一、核心概念與工作原理 硬件基…

SDPA(Scaled Dot-Product Attention)詳解

SDPA&#xff08;Scaled Dot-Product Attention&#xff09;詳解 SDPA&#xff08;Scaled Dot-Product Attention&#xff0c;縮放點積注意力&#xff09;是 Transformer 模型的核心計算單元&#xff0c;最早由 Vaswani 等人在 2017 年的論文《Attention Is All You Need》提出…

java通過hutool工具生成二維碼實現掃碼跳轉功能

實現&#xff1a; 首先引入zxing和hutool工具依賴 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.2</version></dependency><dependency><groupId>com.google.zxi…

數據庫數據導出到Excel表格

1.后端代碼 第一步&#xff1a;UserMapper定義根據ID列表批量查詢用戶方法 // 批量查詢用戶信息List<User> selectUserByIds(List<Integer> ids); 第二步&#xff1a;UserMapper.xml寫動態SQL&#xff0c;實現批量查詢用戶 <!--根據Ids批量查詢用戶-->&l…

Altera系列FPGA基于ADV7180解碼PAL視頻,純verilog去隔行,提供2套Quartus工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目Altera系列FPGA相關方案推薦我這里已有的PAL視頻解碼方案 3、設計思路框架工程設計原理框圖輸入PAL相機ADV7180芯片解讀BT656視頻解碼模塊圖像緩存架構輸出視頻格式轉…