select 和epoll模型區別

1.select?epoll模型

1.1.IO模型概述

?????通常來,網IO可以抽象成用戶態和內核態之間的數據交換。一次網絡數據讀取操作(read),可以拆分成兩個步驟:1)網卡驅動等待數據準備好(內核態)2)將數據從內核空間拷貝到進程空間(用戶態)。根據這兩個步驟處理方式不一樣,我們通常把網絡IO劃分成阻塞IO和非阻塞IO。

? ? ? ·阻塞IO。用戶調用網IO相關的系統調(例如read),如果此內核網卡沒有取到網數據,那么本次系統調用將會一直阻塞,直到對端系統發送的數據到達為止。如果對端一直沒有發送數據,則本次調用將永遠不會返回。

? ? ? ·?非阻塞IO。當用戶調用網IO相關的系統調(例如read),如果此內核網絡還沒有收到網數據,那么本次系統調用將會立即返回,并返回一個EAGAIN錯誤碼

在沒有IO多路復用技之前,由于沒有一種好的方式來探IO是否可可寫。因此,了增加系的并發連接量,一般是借助多程或多程的方式來增加系的并發連接數。但是種方式有個問題就是系的并發連接數受限于操作系的最大程或程數,并且隨著操作系程或程數增加,將會引大量的上下文切致系的性能急下降。了解決問題,操作系引入了IO多路接技IO multiplexing)。

1.2.??IO多路技術

????IO多路轉接技術其實就是使用select、epoll等操作系統提供的系統調用來檢測IO事件的各種機制。通過select、epoll等機制,我們可以很輕松的同時管理大量的網絡IO連接,并且獲取到處于活躍狀態的連接。當其中一個或多個發生網絡IO事件時,select、epoll等系統調用就會返回相應的連接,我們就可以對這些連接進行讀取或寫入操作,從而完成網絡數據交互。

1.3.select?工作原理

? ? ? ?select函數原型:

????????int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

??????????select各個參數明:

? ? ? ? ? ? ? ?·??nfds

這個參數的值一般設置為讀集合(readfds)、寫集合(writefds)以及exceptfds(異常集合)中最大的描述符(fd)+1,當然也可以設置為FD_SETSIZE。FD_SETSIZE是操作系統定義的一個宏,一般是1024。也就是說讀寫以及異常集合大小的最大值是1024,所以使用select最多只能管理1024個連接。如果大于1024個連接,select將會產生不確定行為。

·?readfds

指向可讀描述符集的指針,如果我們關心連接的可讀事件,需要把連接的描述符設置到讀集合中。

·writefds

指向可寫描述符集的指,如果我關心接的可寫事件,需要把接的描述符置到可寫集合中。

·?exceptfds

指向異常描述符集的指,如果我關心接的是否生異常,需要把接的描述符置到異常描述符集合中。

·timeout

select愿意等待的時間

????????????? ??????? struct timeval {

?????????????????????????????????????????? longtv_sec;????? //秒數

?????????????????????????????????????????? longtv_usec;??? //微秒數

?????????????????????????????????? }

????????????????一般來,分三種情況:

·timeout空,select將會永等待。直到有接可讀、可寫或者被信號中斷時返回。

·timeout->tv_sec = 0?且 timeout->tv_usec = 0,完全不等待。檢測所有指定的描述符后立即返回。這是得到多個描述符的狀態而不阻塞select函數的輪詢方法。

·timeout->tv_sec !=?且 timeout->tv_usec != 0,等待指定的秒數和微秒數。當指定的描述符之一已經準備好,或者超過了指定的時間值,則立即返回。如果超時了,還沒有一個描述符準備好,則返回0。

? ? ?select的工作原理,select過輪詢來檢測各個集合中的描述符fd)的狀,如果描述符的狀態發生改變,則會在該集合中設置相應的標記位;如果指定描述符的狀態沒有發生改變,則將該描述符從對應集合中移除。因此,select的調用復雜度是線性的,即O(n)。舉個例子,一個保姆照看一群孩子,如果把孩子是否需要尿尿比作網絡IO事件,select的作用就好比這個保姆挨個詢問每個孩子:你要尿尿嗎?如果孩子回答是,保姆則把孩子拎出來放到另外一個地方。當所有孩子詢問完之后,保姆領著這些要尿尿的孩子去上廁所(處理網絡IO事件)。

? ? select的限制,前面提到FD_SETSIZE宏,這個宏是操作系統定義的。在linux下面通常是1024,也就是說select最多只能管理1024個描述符。如果大于1024的個描述,select將會產生不可預知的行為。那在沒有poll或epoll的情況下,怎樣使用select來處理連接數大于1024的情況呢?答案是使用多線程技術,每個線程單獨使用一個select進行檢測。這樣的話,你的系統能夠處理的并發連接數等于線程數*1024。早期的apache就是這種技術來支撐海量連接的。

1.4.epoll工作原理

? epoll函數原型:

? ? ? ??int epoll_create(int size);

??????? intepoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

?

? ? ? ? ? ? ? ??int epoll_wait(intepfd, ?struct epoll_event *events, intmaxevents, ?int timeout);

?????????epoll上述三個函數,既可以完成成千上萬的并發連接管理。epoll使用方式,1)通epoll_create建立epoll句柄。2)將描述符所感趣的事件通epoll_ctl添加到epoll句柄中。3調epoll_wait返回所有可寫的描述符。

? epollLinux內核為處理大批量文件描述符而作了改epoll,是Linux下多路復用IO接口select/poll的增版本,它能著提高程序在大量發連中只有少量活的情況下的系CPU利用率。另一點原因就是取事件的候,它無整個被聽的描述符集,只要遍那些被內核IO事件異步醒而加入Ready列的描述符集合就行了。epoll除了提供select/poll那種IO事件的水平觸Level Triggered)外,提供了邊緣Edge Triggered),就使得用程序有可能IO,減少epoll_wait/epoll_pwait調用,提高用程序效率。

??????還是以保姆照看一群孩子為例,在epoll機制下,保姆不再需要挨個的詢問每個孩子是否需要尿尿。取而代之的是,每個孩子如果自己需要尿尿的時候,自己主動的站到事先約定好的地方,而保姆的職責就是查看事先約定好的地方是否有孩子。如果有小孩,則領著孩子去上廁所(網絡事件處理)。因此,epoll的這種機制,能夠高效的處理成千上萬的并發連接,而且性能不會隨著連接數增加而下降。

1.5.selectepoll

上所述,selectepoll比如下表所示


select

epoll

性能

隨著接數增加,急下降。理成千上萬并發連接數,性能很差。

隨著接數增加,性能基本上沒有下降。理成千上萬并發連,性能很好。

接數

連接數有限制,處理的最大連接數不超過1024。如果要處理超過1024個連接數,則需要修改FD_SETSIZE宏,并重新編譯 。

接數無限制。

內在處理機制

線性輪詢

回調callback

開發復雜性

?

老男孩教育:selectepoll簡單區別比喻

select的調用復雜度是線性的,即O(n)。舉個例子,一個保姆照看一群孩子,如果把孩子是否需要尿尿比作網絡IO事件,select的作用就好比這個保姆挨個詢問每個孩子:你要尿尿嗎?如果孩子回答是,保姆則把孩子拎出來放到另外一個地方。當所有孩子詢問完之后,保姆領著這些要尿尿的孩子去上廁所(處理網絡IO事件)。

還是以保姆照看一群孩子為例,在epoll機制下,保姆不再需要挨個的詢問每個孩子是否需要尿尿。取而代之的是,每個孩子如果自己需要尿尿的時候,自己主動的站到事先約定好的地方,而保姆的職責就是查看事先約定好的地方是否有孩子。如果有小孩,則領著孩子去上廁所(網絡事件處理)。因此,epoll的這種機制,能夠高效的處理成千上萬的并發連接,而且性能不會隨著連接數增加而下降。











本文轉自 藍葉子Sheep 51CTO博客,原文鏈接:http://blog.51cto.com/dellinger/1952776,如需轉載請自行聯系原作者

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

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

相關文章

python數據結構與算法第六講_Python 學習 -- 數據結構與算法 (六)

棧 是一種 “操作受限”的線性表,只允許在一端插入和刪除數據。從功能是上來說,數組和鏈表確實可以替代棧,但是特定的數據結構是對特定場景的抽象,而且,數組或鏈表暴露了太多的操作接口,操作上的確靈活自由…

spring-springmvc code-based

idea設置maven在下載依賴的同時把對應的源碼下載過來。圖0:1主要實現零配置來完成springMVC環境搭建,當然現在有了springBoot也是零配置,但是很多同仁都是從spring3.x中的springMVC直接過渡到springBoot的,spring3.x的MVC大部分都…

powershell 入門_使用PowerShell入門的5個Cmdlet

powershell 入門PowerShell is quickly becoming the preferred scripting language and CLI of Power Users as well as IT Pros. It’s well worth learning a few commands to get you started, so we’ve got 5 useful cmdlets for you to learn today. PowerShellSwift成為…

Part 3: Services

介紹 在第3部分中,我們將擴展應用程序并啟用負載平衡。為此,我們必須在分布式應用程序的層次結構中提升一個級別:服務。 StackServices (你在這里)Container (涵蓋在第2部分中)關于服務 在分布式應用程序中,應用程序的不同部分被稱為“服務”…

mysql ldf文件太大_Linux_數據庫清除日志文件(LDF文件過大),清除日志: 復制代碼 代碼如 - phpStudy...

數據庫清除日志文件(LDF文件過大)清除日志:復制代碼 代碼如下:DECLARE LogicalFileName sysname,MaxMinutes INT,NewSize INTUSE szwzcheck -- 要操作的數據庫名SELECT LogicalFileName szwzcheck_Log, -- 日志文件名MaxMinutes 10, -- Limit on time allowed to …

emwin之錯誤使用控件函數導致死機現象

2018-10-15 導致死機的代碼示例如下 1 /**2 * brief widget ID define3 * {4 */5 6 #define ID_WINDOW_0 (GUI_ID_USER 0x00)7 #define ID_TEXT_0 (GUI_ID_USER 0x01)8 #define ID_TEXT_1 (GUI_ID_USER …

diy感應usb攝像頭拍照_DIY無線感應充電器

diy感應usb攝像頭拍照Courtesy of Instructables user Inducktion shares a very detailed tutorial on how to build a wireless power charger. He explains the impetus behind the project: 由Instructables用戶提供Inducktion分享了有關如何構建無線電源充電器的非常詳細…

ubuntu7.10安裝到3D開啟

累了好幾天,重裝了十幾遍終于把ubuntu7.10搞定到了我自認為完美的狀態了。現在總結一下安裝過程(按操作順序記錄):1.在xp下不管用pqmajac還是其他硬盤分區工具分出10G的空余分區來(實驗階段10G嘗試下)&…

初學者對python的認識_Python初學者列表,python,初識

1.認識列表列表可以放入所有我們目前學習過的數據類型,甚至包括列表2.有關列表的方法、內置函數(設列表的名稱為list)向列表中添加元素:append():list.append(要添加的元素),注意每次只能添加一個元素,被添加的元素自動…

常用模塊之 time,datetime,random,os,sys

time與datetime模塊 先認識幾個python中關于時間的名詞: 時間戳(timestamp):通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。1970年之前的日期無法以此表…

使用aSpotCat控制您的Android應用權限

Viewing the permissions of each installed Android app requires digging through the Manage Applications screen and examining each app one by one — or does it? aSpotCat takes an inventory of the apps on your system and the permissions they require. 要查看每…

xtrabackup備份mysql“ib_logfile0 is of different”錯誤分析

今天用xtrabackup工具完整備份mysql數據庫的時候出現“./ib_logfile0 is of different”錯誤,具體的日志信息如下: 我第一時間查詢了百度和谷歌都沒有找見相對應的答案。決定從錯誤日志入手,上面的日志提示說:mysql數據庫inondb的日志文件的大…

java socket 報文解析_java socket解析和發送二進制報文工具(附java和C++轉化問題)

解析:首先是讀取字節:/*** 讀取輸入流中指定字節的長度* * 輸入流**paramlength 指定長度*return指定長度的字節數組*/public static byte[] readBytesFromTo(byte[] buffer, int from, intlength) {byte[] sub new byte[length];int cur 0;for (int i from; i < length …

Ubuntu防火墻:ufw

原始linux的防火墻是iptables&#xff0c;以為過于繁瑣&#xff0c;各個發行版幾乎都有自己的方案; ubuntu下的防火墻是ufw[ubuntu fireward的縮寫]&#xff0c;centos的防火墻是fireward ubuntu下&#xff1a; 啟用或者關閉防火墻 sudo ufw enable|disable sudo ufw default d…

如何使自己的不和諧機器人

Discord has an excellent API for writing custom bots, and a very active bot community. Today we’ll take a look at how to get started making your own. Discord具有出色的用于編寫自定義機器人的API&#xff0c;以及非常活躍的機器人社區。 今天&#xff0c;我們將探…

?css3屬性選擇器總結

css3屬性選擇器總結 &#xff08;1&#xff09;E[attr]只使用屬性名&#xff0c;但沒有確定任何屬性值 <p miaov"a1">111111</p> <p miaov"a2">111111</p> p[miaov]{background: red;} /*所有屬性為miaov的元素都會被背景變紅&a…

java復合賦值運算符_Java 之復合賦值運算符

1.引入問題切入正題&#xff0c;看下面代碼&#xff0c;結果應該是怎么樣的public class App{public static void main( String[] args ){byte a1 ;int b 10;a ab;System.out.println(a);ab;System.out.println(a);}}這段代碼的執行結果是什么&#xff1f;&#xff1f;2. 執行…

程序代碼初學者_初學者:如何使用熱鍵在Windows中啟動任何程序

程序代碼初學者Assigning shortcut keys to launch programs in Windows is probably one of the oldest geek tricks in the book, but in true geek fashion we are going to show you how to do it in Windows 8. 分配快捷鍵以在Windows中啟動程序可能是本書中最古老的怪胎技…

stevedore——啟用方式

2019獨角獸企業重金招聘Python工程師標準>>> setuptools維護的入口點注冊表列出了可用的插件&#xff0c;但是并沒有為最終用戶提供使用或啟用的方法。 下面將描述用于管理要使用的擴展集的公共模式。 通過安裝方式啟用 對于許多應用程序&#xff0c;僅僅安裝一個擴…

java 重置定時器_可重置Java定時器

我想有一個java.utils.Timer與一個可重置時間在java.I需要設置一次off事件發生在X秒。如果在創建定時器的時間和X秒之間沒有發生任何事情&#xff0c;則事件會正常發生。然而&#xff0c;如果在X秒之前&#xff0c;我決定該事件應該發生在Y秒后&#xff0c;然后我想要能夠告訴定…