事件驅動reactor的原理與實現

fdset 集合:(就是說)

  • fd_set是一個位圖(bitmap)結構
  • 每個位代表一個文件描述符
  • 0表示不在集合中,1表示在集合中

fd_set結構(簡化):
[0][1][2][3][4][5]...[1023]
?0 ?0 ?1 ?0 ?1 ?0 ? ? 0
? ?↑ ? ? ↑
? ?| ? ? |
sockfd ?clientfd

// select方式
fd_set rfds;
select(maxfd+1, &rfds, NULL, NULL, NULL);// epoll方式
struct epoll_event events[1024];
epoll_wait(epfd, events, 1024, -1);

?maxfd就是1023,rfds就是read fds 讀事件,

select的返回值是就緒事件操作如下:

int ret = select(nfds, &readfds, &writefds, &exceptfds, &timeout);
if (ret > 0) {// 有事件發生printf("有 %d 個文件描述符就緒\n", ret);// 檢查讀事件if (FD_ISSET(sockfd, &readfds)) {// 處理讀事件}// 檢查寫事件if (FD_ISSET(sockfd, &writefds)) {// 處理寫事件}// 檢查異常事件if (FD_ISSET(sockfd, &exceptfds)) {// 處理異常事件}
}

?fd操作如下:

// 清空集合
FD_ZERO(&rfds);
// 結果:[0][0][0][0][0]...[0]// 添加fd到集合
FD_SET(sockfd, &rfds);
// 例如sockfd=2:[0][0][1][0][0]...[0]// 從集合中刪除fd
FD_CLR(sockfd, &rfds);
// 例如sockfd=2:[0][0][0][0][0]...[0]// 檢查fd是否在集合中
FD_ISSET(sockfd, &rfds);
// 返回1表示在集合中,0表示不在

a) 一個連接一個線程:

優點:
- 實現簡單
- 邏輯清晰
- 適合并發量小的場景

缺點:
- 線程資源消耗大
- 線程切換開銷大
- 不適合高并發

select

優點:
- 單線程處理多連接
- 資源消耗小
- 適合中等并發

缺點:
- 效率較低
- 連接數有限
- 需要輪詢

epoll

優點:
- 高效的事件通知
- 適合高并發
- 資源消耗小

缺點:
- 實現較復雜
- 需要系統支持

// 多線程方式
void *client_thread(void *arg) {int clientfd = *(int *)arg;while (1) {recv(clientfd, buffer, 1024, 0);// 處理數據}
}// epoll方式
while (1) {epoll_wait(epfd, events, 1024, -1);for (i = 0; i < nready; i++) {if (events[i].data.fd == sockfd) {// 處理新連接} else {// 處理數據}}
}
// 方式1:一個連接一個線程
while (1) {int clientfd = accept(sockfd, ...);pthread_t thid;pthread_create(&thid, NULL, client_thread, &clientfd);
}// 方式2:單線程處理多個連接(select)
while (1) {select(maxfd+1, &rset, NULL, NULL, NULL);// 處理多個連接
}// 方式3:單線程處理多個連接(epoll)
while (1) {epoll_wait(epfd, events, 1024, -1);// 處理多個連接
}

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

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

相關文章

一分鐘在Cherry Studio和VSCode集成火山引擎veimagex-mcp

MCP的出現打通了AI模型和外部數據庫、網頁API等資源&#xff0c;成倍提升工作效率。近期火山引擎團隊推出了 MCP Server SDK&#xff1a; veimagex-mcp。本文介紹如何在Cherry Studio 和VSCode平臺集成 veimagex-mcp。 什么是MCP MCP&#xff08;Model Context Protocol&…

掌控隨心 - 服務網格的流量管理藝術 (Istio 實例)

掌控隨心 - 服務網格的流量管理藝術 (Istio 實例) 想象一下,沒有服務網格的時候,我們要實現像“將 1% 的用戶流量導入到新版本應用”、“根據用戶設備類型訪問不同后端”、“模擬下游服務故障”這類高級流量策略,通常需要在代碼、負載均衡器、API 網關等多個地方進行復雜且分…

[ARM][匯編] 01.基礎概念

目錄 1.全局標號 1.1.使用方法 1.1.1.聲明全局標號 1.1.2.定義全局標號 1.1.3.引用全局標號 1.2.全局標號與局部標號的區別 1.3.注意事項 2.局部標號 2.1.使用方法 2.1.1.定義局部標號 2.1.2.跳轉引用 2.2.局部標號與全局標號的對比 2.3.注意事項 3.符號定義偽指…

如何使用遠程桌面控制電腦

目的&#xff1a; 通過路由器使用pc控制臺式機&#xff0c;實現了有線/無線pc與臺式機的雙向遠程桌面控制 最核心就兩條&#xff1a;get ip地址與被控制機器的賬戶與密碼。 現象挺神奇&#xff1a;被控制電腦的電腦桌面處于休眠模式&#xff0c;此時強行喚醒被控電腦會導致中斷…

Hive表JOIN性能問

在處理100TB的Hive表JOIN性能問題時&#xff0c;需采用分層優化策略&#xff0c;結合數據分布特征、存儲格式和計算引擎特性。以下是系統性優化方案&#xff1a; 1. 數據傾斜優化&#xff08;Skew Join&#xff09; 1.1 識別傾斜鍵 方法&#xff1a;統計JOIN鍵的分布頻率&…

MongoDB 的核心概念(文檔、集合、數據庫、BSON)是什么?

MongoDB 是一個面向文檔的數據庫&#xff0c;它的核心概念與傳統的關系型數據庫&#xff08;RDBMS&#xff09;有所不同。以下是它的四個主要核心概念&#xff1a; 文檔 (Document) 定義&#xff1a; 文檔是 MongoDB 中的基本數據單元。它類似于關系型數據庫中的一行記錄&#…

AI智慧公園管理方案:用科技重塑市民的“夜游體驗”

AI智慧公園管理方案&#xff1a;多場景智能巡檢與安全防控 一、背景與痛點分析 夏季夜間&#xff0c;公園成為市民休閑娛樂的核心場所&#xff0c;但管理難度隨之激增&#xff1a; 寵物管理失控&#xff1a;未牽繩寵物進入園區&#xff0c;隨地排泄、驚擾游客&#xff0c;甚…

Spring Cloud Gateway 聚合 Swagger 文檔:一站式API管理解決方案

前言 在微服務架構中&#xff0c;隨著服務數量的增加&#xff0c;API文檔管理變得越來越復雜。每個微服務都有自己的Swagger文檔&#xff0c;開發人員需要記住每個服務的文檔地址&#xff0c;這無疑增加了開發難度。本文將介紹如何使用Spring Cloud Gateway聚合所有微服務的Sw…

尼康VR鏡頭防抖模式NORMAL和ACTIVE的區別(私人筆記)

1. NORMAL 模式&#xff08;常規模式&#xff09; 適用場景&#xff1a;一般手持拍攝&#xff0c;比如人像、靜物、風景或緩慢平移鏡頭&#xff08;如水平追拍&#xff09;等。工作特性&#xff1a; 補償手抖引起的小幅度震動&#xff08;比如手持時自然的不穩&#xff09;&am…

Babylon.js學習之路《四、Babylon.js 中的相機(Camera)與視角控制》

文章目錄 1. 引言&#xff1a;為什么相機是 3D 場景的“眼睛”&#xff1f;1.1 相機的核心作用1.2 常見相機類型概覽 2. 相機基礎參數解析2.1 通用屬性2.2 相機坐標系 3. 詳解常用相機類型3.1 自由相機&#xff08;FreeCamera&#xff09;3.2 弧形旋轉相機&#xff08;ArcRotat…

【Python】普通方法、類方法和靜態方法的區分

Python 中普通方法、類方法和靜態方法的區分 下面我將從多個維度對這三種方法進行詳細對比&#xff0c;并通過示例說明它們的使用場景和區別。 1. 核心區別總結 特性普通方法(實例方法)類方法(classmethod)靜態方法(staticmethod)定義裝飾器無classmethodstaticmethod第一個…

geoserver發布arcgis瓦片地圖服務(最新版本)

第一步&#xff1a;下載geoserver服務&#xff0c;進入bin目錄啟動 需要提前安裝好JDK環境&#xff0c;1.8及以上版本 安裝完成&#xff0c;頁面訪問端口&#xff0c;進入控制臺界面,默認用戶名密碼admin/geoserver 第二步&#xff1a;下載地圖 破解版全能電子地圖下載器&…

Linux服務之lvs集群與dr模式部署

目錄 一.lvs相關概述 1.lvs集群的工作模式 2.lvs調度算法 3.ipvsadm工具 二.DR模式部署 一.lvs相關概述 1.lvs集群的工作模式 lvs-nat&#xff1a;修改請求報文的目標IP,多目標IP的DNAT lvs-dr&#xff1a;操縱封裝新的MAC地址&#xff08;直接路由&#xff09;lvs-tu…

OFCMS代碼審計-freemaker注入sql注入xxexss文件上傳

環境搭建 下載地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入&#xff08;freemaker) FreeMarker模板注入實現遠程命令執行 - Eleven_Liu - 博客園 在admin中找到這個 發現請求的是這個 找到他 <#assign value"f…

一鍵部署NSFW檢測模型:快速識別并過濾敏感圖片內容

以下是對nsfw_detector的簡單介紹&#xff1a; nsfw_detector是一個 NSFW 內容檢測器&#xff0c;支持快速docker私有部署&#xff0c;提供API服務低資源消耗&#xff0c;2GB內存即可運行該模型&#xff0c;多核CPU自動調度加速推理 - 可以識別多種文件類型&#xff1a;圖片、…

【Redis】緩存穿透、緩存雪崩、緩存擊穿

1.緩存穿透 是指客戶端請求的數據在緩存中和數據庫中都不存在&#xff0c;這樣緩存永遠不會生效&#xff0c;導致請求直接穿透緩存到達數據庫&#xff0c;給數據庫帶來壓力的情況。 常見的解決方案有兩種&#xff1a; 緩存空對象&#xff1a;實現簡單&#xff0c;維護方便&am…

【C】初階數據結構15 -- 計數排序與穩定性分析

本文主要講解七大排序算法之外的另一種排序算法 -- 計數排序 目錄 1 計數排序 1&#xff09; 算法思想 2&#xff09; 代碼 3&#xff09; 時間復雜度與空間復雜度分析 &#xff08;1&#xff09; 時間復雜度 &#xff08;2&#xff09; 空間復雜度 4&#xff09; 計…

mysql的一個缺點

最近再移植一個從oracle轉mysql的項目&#xff0c;喜提一個報錯&#xff1a; You cant specify target table A016 for update in FROM clause 對應的程序代碼&#xff1a; public void setCurrent(String setId, String pk, String userId) throws SysException {String[]…

Ubuntu 上安裝 FTP 服務、開放指定端口并創建用戶

一、安裝 FTP 服務&#xff08;vsftpd&#xff09; sudo apt update sudo apt install vsftpd -y二、修改 vsftpd 配置&#xff0c;使用 21000 端口 編輯配置文件&#xff1a; sudo nano /etc/vsftpd.conf修改或添加以下配置&#xff1a; 使用以下配置文件需要修改的地方:l…

用自寫的jQuery庫+Ajax實現了省市聯動

1. 省市聯動&#xff1a;在網頁上&#xff0c;選擇對應的省份之后&#xff0c;動態的關聯出該省份對應的市。選擇對應的市之后&#xff0c;動態地關聯出城市對應的區。 2. 設計數據庫表 t_area &#xff08;區域表&#xff09; id(PK-自增) code name pcode ------------…