1. 程式人生 > >網路程式設計中select模型和poll模型學習(linux)

網路程式設計中select模型和poll模型學習(linux)

一、概述

併發的網路程式設計中不管是阻塞式IO還是非阻塞式IO,都不能很好的解決同時處理多個socket的問題。作業系統提供了複用IO模型:select和poll,幫助我們解決了這個問題。這兩個函式都能夠允許程序指示核心等待多個事件中的任何一個發生,並只在有一個或多個事件發生或者經歷一段指定的時間後才喚醒它。

二、select模型

1、函式定義

#include <sys/select.h>
#include <sys/time.h>

int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout);
2、函式解析

(1)maxfd1引數指定待測試的描述符的個數,它的值是所有待測試描述符中最大者加1,描述符0,1,2,...一直到maxfd1-1均被測試。(windows中該引數沒有意義)

通過以下四個巨集可以管理描述符


select模型中能夠管理的描述符數量是有限制的,最多不能超過FD_SETSIZE,這個巨集定義定義在<sys/select.h>標頭檔案中。這個值雖然可以通過修改核心修改,但是會影響通訊的效率。所以針對這個限制,作業系統提供了poll模型。

readset、writeset和exceptset分別設定我們對讀、寫和異常檢測的描述符。不需要檢測的條件可以將對應的描述符集置為空。這三個引數是值-結果引數,呼叫時,我們指定所關心的描述符的值,函式返回時,結果將指示哪些描述符已就緒(就緒的話描述符集對應二進位制位為1)。

(3)timeout可以設定三個值:置為空,表示僅在有一個描述符準備好IO才返回,否則永遠等下去;置為指定的秒數和微秒數,在有一個描述符準備好或者超時後,select返回;置為0,則select會檢查完描述符後立即返回,相當於輪巡。

(4)返回值

該函式的返回值表示描述符集中滿足條件的描述符個數。如果在任何描述符就緒前定時器到時,那麼返回0。返回-1表示錯誤。

3、描述符就緒的條件

(1)滿足下列四個條件中的任何一個,一個套接字準備好讀

a)該套接字接收緩衝區中的資料位元組數大於等於套接字接收緩衝區低水位標記

b)該連線的讀半部關閉(也就是接受了FIN的TCP連線)

c)該套接字是一個監聽套接字並且已完成的連線數不為0。接下來可以通過accept接收連線客戶端套接字

d)有一個套接字錯誤待處理

(2)滿足下列四個條件中的任何一個,一個套接字準備好寫

a)該套接字傳送緩衝區中的資料位元組數大於等於套接字傳送緩衝區低水位標記

b)該連線的寫半部關閉

c)使用非阻塞式connect的套接字已建立連線,或者connect已經以失敗告終

d)有一個套接字錯誤待處理

(3)如果一個套接字存在帶外資料或者仍處於帶外標記,那麼它有異常條件待處理。

三、poll模型

1、函式定義

#include <poll.h>

int poll(struct pollfd* fdarray,unsigned long nfds,int timeout);
2、函式解析

(1)第一個引數是一個pollfd型別的陣列,用於指定測試某個給定描述符fd的條件。

struct pollfd
{
	int fd;			//descriptor to check
	short events;		//events of interest on fd
	short revents;		//events that occurred on fd
};
fd為要測試的描述符,events為要測試的條件,revents存放函式返回後該描述符的狀態。和select函式中間的三個值-結果引數不同,poll將值和結果分開。events和revents由下列值按位或構成。


(2)nfds為第一個引數陣列的個數。

(3)timeout引數指定poll函式返回前等待多長時間。為INFTIM(-1)表示永遠等待,直到描述符滿足相應的條件;為0表示立即返回,不阻塞;大於0表示等待指定的毫秒數或者描述符滿足相應的條件。

(4)返回值

當發生錯誤時,poll函式返回-1;若定時器到時之前沒有任何描述符滿足條件,返回0;否則返回就緒描述符的個數,即revents成員值非0的描述符個數。

(5)如果我們不再關心某個描述符,那麼可以把與它對應的pollfd陣列的fd成員設定成一個負值。poll函式將忽略這樣的pollfd結構的events成員,返回時將它的revents成員的值置為0。

相關推薦

網路程式設計select模型poll模型學習(linux)

一、概述 併發的網路程式設計中不管是阻塞式IO還是非阻塞式IO,都不能很好的解決同時處理多個socket的問題。作業系統提供了複用IO模型:select和poll,幫助我們解決了這個問題。這兩個函式都能夠允許程序指示核心等待多個事件中的任何一個發生,並只在有一個或多個事件發

在java網路程式設計實現伺服器客戶端一對一的聊天

如果有多個客戶端接入,都可以傳送訊息給伺服器,但伺服器只和最後一個客戶聊天。,如果要實現群聊的話,只要把所有的socket儲存到集合中,有客戶輸入時遍歷socket得到輸出流並把訊息廣播給各個客戶端就行了。 四個讀寫的執行緒類都是一樣的,可以進行封裝,這裡就不封裝了。 Se

網路程式設計4-select模型

4.3伺服器端IO模型 雙十一時,淘寶同時線上使用者可達上億。想處理上億使用者的連線請求,必須要求阿里伺服器的效能非常高。而以前12306處理過多使用者的需求時,經常出現宕機的情況,這說明伺服器效能不足,在設計時技術有限而導致優化不足。 因此,在伺服器端程式設計需要構造高效能的IO模型,wi

網路程式設計阻塞與非阻塞、同步與非同步、I/O模型的理解

1. 概念理解      在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unblock)四種呼叫方式:同步:所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。 例如

C++網路程式設計伺服器select模型(參考)

#include<iostream> #include<vector> #include<WinSock2.h> using namespace std; #pragma comment(lib,"Ws2_32.lib") const i

python網路程式設計--程序的方法通訊,鎖, 佇列,生產者消費者模型

1.程序的其他方法   程序:正在進行的一個過程或者說一個任務.負責執行任務的是cpu,程序之間的空間是相互隔離的   使用multiprocess模組來開啟程序 Process([group [, target[, name [, args [,kwargs]]]]])由該類例項化的物件,可用來開啟

linux c/c++網路程式設計之—select模型

1.select 模型是一個比較傳統的非同步IO模型,我們知道的著名的apache就是基於select模型,而我之前工作過的搜狐暢遊的天龍八部,還有幾款遊戲都是基於select模型。 對於select模型,大多都是說他的缺點,實際上我的觀點有點不一樣,select模型的跨平

網路程式設計-多路轉接之poll與epoll模型

首先,還是需要理解io過程:io過程總體來看分兩步,第一步就是等,第二步才是資料搬遷。而如果要想提高io的效能與效率,就要減少等的比重。 可以假想一個場景: 你去釣魚,但是你只有一個魚竿。你的同伴也和你一起去釣魚,但是他帶了100個魚竿。假設每條魚上

NLP的CNNRNN模型對比

這篇部落格主要是拜讀IBM Research發表的論文“Comparative Study of CNN and RNN for Natural Language Processing”,結合自己的體會做一個閱讀筆記。       &n

網路程式設計time_wait的作用套接字選項SO_REUSEADDR

這兩天看APUE為一個簡單的問題特別惱火,該問題起源於兩個套接字選項就是SO_REUSEADDR和SO_REUSEPORT其實在看的過程中問學長了,學長解釋的也比較清楚,就是自己悟性不好,一時半會沒理解。自己在網上找了幾篇優秀的部落格看了,受益頗多! 先從套接字選項SO_REUSEADD

網路程式設計】TCP網路程式設計connect()、listen()accept()三者之間的關係

舉個簡單的例子(以下程式碼只是示範性的,用於說明不同套接字的作用,實際的函式會需要更多的引數): /* 建立用於監聽和接受客戶端連線請求的套接字 */ server_sock = socket(); /* 繫結監聽的IP地址和埠 */ bind(server_sock); /* 開始監聽 */ li

CNN模型RNN模型在分類問題的應用(Tensorflow實現)

在這篇文章中,我們將實現一個卷積神經網路和一個迴圈神經網路語句分類模型。 本文提到的模型(rnn和cnn)在一系列文字分類任務(如情緒分析)中實現了良好的分類效能,並且由於模型簡單,方便實現,成為了競賽和實戰中常用的baseline。 cnn-text-classifica

Linux 網路程式設計】TCP網路程式設計connect()、listen()accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下: connect()函式:對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次握手,而這個連接的過程是由核心完成,不是這個函式完成的,這個函式的作用僅僅是通知 Linux 核心

網路程式設計I/O複用select的用法

網路程式設計select的用法 select使用流程圖 在網路程式設計中需要新增的程式碼行以及意義 例程 參考文獻及部落格 注:本文對select函式、相關引數及結構體不做解釋 select使用流程

網路程式設計,同步傳輸非同步傳輸有什麼區別

在網路通訊過程中,通訊雙方要交換資料,需要高度的協同工作。為了正確的解釋訊號,接收方必須確切地知道訊號應當何時接收和處理,因此定時是至關重要的。 在計算機網路中,定時的因素稱為位同步。同步是要接收方按照發送方傳送的每個位的起止時刻和速率來接收資料,否則會產生誤差。 通常可以

Python機器學習筆記:深入理解Keras序貫模型函式模型

  先從sklearn說起吧,如果學習了sklearn的話,那麼學習Keras相對來說比較容易。為什麼這樣說呢?   我們首先比較一下sklearn的機器學習大致使用流程和Keras的大致使用流程: sklearn的機器學習使用流程: 1 2 3 4

監督學習的“生成模型“判別模型

ref: http://blog.csdn.net/zouxy09/article/details/8195017  講的非常清晰了。該內容部分來自於維基百科。兩者都是概率統計模型,從維基上的解釋來看生成模型(Generative Model):定義了在觀測{X}和結果{Y}

TCP網路程式設計connect()、listen()accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下:connect()函式對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次

網路程式設計的序列化反序列化

原創:美圖技術團隊 http://tech.meituan.com/serialization_vs_deserialization.html 個人總結: protobuf,1)序列化後的資料量更小,是xml的1/3~1/10; 2)效能更好,解析速度是xml的20~10

判別模型生成模型

使用 sin cow ria regress gauss 生成 == 給定 【摘要】 - 生成模型:無窮樣本==》概率密度模型 = 產生模型==》預測 - 判別模型:有限樣本==》判別函數 = 預測模型==》預測 【簡介】 簡單的說,假設o是觀察值,