多路轉接select1

高級IO

通常情況下所有的 IO 都可以分為兩步來完成, 第一步等待, 第二步數據搬遷, 為了提高 IO 效率通常所運用的方法就是減少等待的時間

舉個釣魚的例子

現在有五個人張三, 李四, 王五, 趙六, 錢七. 它們五個人來到湖邊來釣魚. 而它們五個人的釣魚方各不相同.
張三釣魚方法:
往魚鉤上掛上魚餌, 然后一動不動地盯著魚餌, 不管有任何人來叫張三, 張三誰都不理, 唯一關注的就是是否有魚上鉤, 于是就一直盯著魚漂, 只要魚漂有動靜, 就說明有魚上鉤, 于是將上鉤的魚拉上來.
李四釣魚方法:
將魚餌往魚鉤上一掛, 將魚鉤和魚餌全部扔到河里, 然后他一邊釣魚, 一邊玩手機, 然后問一下張三釣了多少魚, 但是張三一直關注的是自己的魚漂是否有動靜, 它根本就不理李四, 玩一會兒手機定期看一下是否有魚上鉤.
王五釣魚方法:
王五比較聰明, 他看到張三和李四兩個人一個在那里傻傻地盯著魚漂, 一個像話嘮一樣一直問著旁邊的人,于是他相處了一個辦法, 他往掛魚餌的那個地方掛一個鈴鐺, 只要鈴鐺一響, 他便將魚從水里拉出來. 如果鈴鐺沒有響, 自己該干什么就干什么.
趙六釣魚方法:
趙六相比前面的張三, 李四, 王五來說比較富裕, 他來的時候拿了好多個魚竿, 于是他將所有的魚竿往岸邊一插, 并且對這些魚竿進行編號, 然后不斷地對這些所有的魚竿進行便利檢測, 只要其中那個魚漂有動靜, 就將魚鉤拉上來.
錢七釣魚方法:
錢七是一個大土豪, 他來的時候是由自己的專門司機開著名車將自己帶過來的, 于是他將魚鉤交給自己的司機, 告訴他, 你幫我釣魚, 等你釣完魚, 下午的時候給我打電話, 我直接來拿魚就可以了. 于是去忙自己的事了.

總結

通過上面的這個例子, 我們可以看出來張三, 李四, 王五, 趙六他們都有一個特性, 那就是等待魚上鉤自己等待, 將魚拉上來也是自己干, 而錢七相比前面的四個人而言也就是等待魚兒上鉤是別人替自己等, 魚拉上來也是別人幫自己拉上來, 而自己唯一要做的就是將釣魚這件事發起, 然后交給某個人就可以了.
如果將上面的釣魚的例子對應到我們的IO模型中的話, 那么前四種就是對應的同步IO, 即等待和數據搬遷都由自己來完成, 而最后一種就是對應的異步 IO, 數據搬遷和等待都不需要自己來完成, 自己唯一干的就是發起某個事件.同時張三對應的IO模型就是阻塞方式, 李四就是非阻塞方式, 王五為驅動方式, 趙六為多路轉接模型, 錢七為異步方式

幾個概念

同步IO事件由自己發起, 就緒事件的等待由自己完成, 數據的搬遷也是由自己來完成.

異步IO事件由自己發起, 就緒事件的等待, 數據的搬遷都由別人幫自己完成

輪詢不斷的檢測就緒事件是否發生, 輪詢是基于非阻塞接口.

IO多路轉接一次可以監視多個文件描述符, 就好比趙六一次可以監視多個魚竿

阻塞和非阻塞的不同

阻塞和非阻塞的不同之處在于等待方式的不同, 阻塞方式就是只要就緒事件沒有發生, 則一直等待, 而非阻塞方式就是不斷檢測, 如果有就緒事件發生, 就處理就緒事件, 如果沒有就緒事件就返回, 然后過一段時間時間再進行檢測.

五種 IO 模型

阻塞方式在內核將數據準備好之間, 系統一直等待, 所有的套接字默認為阻塞方式.

非阻塞方式需要程序員不斷循環反復嘗試讀寫文件描述符.

信號驅動內核將數據準備好的時候, 于是便給當前應用程序發送一個SIGIO信號,當前應用進程收到這個信號的額時候, 于是便知道底層的就緒事件已經發生, 于是就進行 IO 操作

**IO多路轉接**IO多路轉接一次可以等待多個文件描述符的就緒事件

異步IO由內核在數據拷貝完成的時候通知應用進程(信號驅動對應的就是高速應用進程何時可以進行數據搬遷)

高級IO重要概念

同步IO VS 異步IO

同步IO在發出一個調用的時候, 在沒有得到結果之前, 該調用不會返回, 但是一旦調用返回, 就得到返回值, 即由調用者主動等待調用結果.

異步IO調用在發出之后, 這個調用就會返回, 沒有返回結果. 換言之就是當一個異步調用發出之后, 調用者不會立即等到結果, 而是在調用之后, 由被調用者通過狀態通知調用者, 或者通過回調函數來處理這個函數.

非阻塞相關接口

fcntl

我們都知道文件描述符默認都是阻塞 IO

#include<unistd.h>
#include<fcntl.h>int fcntl(int fd, int cmd, .../*arg*/);

其中 fd 為文件描述符, 表示要對哪一個文件描述符進行設置, cmd取值不同時代表了不同的方式

cmd = F_DUPFD 時代表復制一個文件描述符

cmd = FGETFD 或者 FSETFD 時代表獲得文件描述符標記

實現一個非阻塞文件描述符

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>void SetNoBlock(int fd)
{int f1 = fcntl(fd, F_GETFL);if(fd < 0){perror("fd");exit(1);}fcntl(fd, F_SETFL, f1 | O_NONBLOCK);
}
int main()
{SetNoBlock(0);while(1){char buf[1024] = {0};ssize_t s = read(0, buf, sizeof(buf));if(s < 0){perror("read");//底層未將數據準備好sleep(1);continue;}printf("input %s\n", buf);}return 0;
}

重定向

曾近我們學習過將數據重定向即就是將某個文件符關閉, 然后打開文件描述符,此時對關閉的那個文件描述符進行操作便會成為對文件的操作.

dup/dup2

#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);

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

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

相關文章

UVa11181

題目要求條件概率,用貝葉斯公式我們很容易得到我們需要求r個人買東西的概率和每個人買東西的條件下其他r-1個人買東西的概率.我們遞歸枚舉,每當枚舉到r個人買東西的時候,我們加入到r個人買東西的概率中(全概率公式),然后對于這r個人,除去自己買東西的概率就是其他r-1個人買東西…

Linux epoll模型

http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html 定義&#xff1a; epoll是Linux內核為處理大批句柄而作改進的poll&#xff0c;是Linux下多路復用IO接口select/poll的增強版本&#xff0c;它能顯著的減少程序在大量并發連接中只有少量活躍的情況下的系統CPU利…

UVa11572

書上把這種問題叫做滑動窗口問題. 我的想法是先進行離散化,然后用一個數組記錄元素出現的位置,如果判斷某個元素已經出現,就將左端點移到上次出現的位置的后面.每次出現重復元素的時候判斷一下答案.我覺得這樣的復雜度是最低的. #include<cstdio> #include<cstring&…

Linux IO模式及 select、poll、epoll詳解

https://segmentfault.com/a/1190000003063859 同步IO和異步IO&#xff0c;阻塞IO和非阻塞IO分別是什么&#xff0c;到底有什么區別&#xff1f;不同的人在不同的上下文下給出的答案是不同的。所以先限定一下本文的上下文。 本文討論的背景是Linux環境下的network IO。一 概念…

mysql思維導圖

后期會不斷進行更新

CF Gym 101630 B Box

題目的意思大概就是給一個長方體的長寬高,問他能不能用一個w*h的紙剪出來,就是說展開圖的長寬能不能比給定的小. 題目給了11中展開圖的拓撲結構,我覺得這個很關鍵,要是題目沒有給這個我可能想不到那么全面,不過題目已經給了我就分析那11個圖形,發現展開圖的長寬大概分為三類 …

C++第一節課

C數據類型 幾個概念 命名空間是C標準庫引入的,其中命名空間可以解決變量沖突問題,當出現局部變量和全局變量同名的時候, 局部變量優先被訪問.同時命名空間的格式如同一下代碼 namespace name1 { int a 0; }namespace name2 { int a 2; } 注意C中的所有組件都是在一個叫做s…

【C/C++】關鍵字static

http://blog.csdn.net/woxiaohahaa/article/details/51014224 參考自&#xff1a;http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html &#xff08;華山大師兄&#xff09; 這里我們只討論了C語言的static 首先我們回顧一下各種變量在內存中的位置&#xff1…

HDU5391威爾遜定理

威爾遜定理 當且僅當p為素數,p | (p-1)!1 若p為合數,則pa*b;如果a!b,那么p|(p-1)!, 如果ab,如果p為4,那么p|(p-1)!2,如果p大于4,那么sqrt和sqrt(2q)肯定屬于(p-1)!中,可以整除 #include<cstdio> #include<cstring> #include<algorithm> #include<climit…

C++的基本認識

簡單介紹C 語言特點 支持數據封裝和數據隱藏 在C中&#xff0c;類是支持數據封裝的工具&#xff0c;對象則是數據封裝的實現。C通過建立用戶定義類支持數據封裝和數據隱藏。 在面向對象的程序設計中&#xff0c;將數據和對該數據進行合法操作的函數封裝在一起作為一個類的定…

OD 投籃大賽

/*** 題目描述* 你現在是一場采用特殊賽制投籃大賽的記錄員。這場比賽由若干回合組成&#xff0c;過去幾回合的得分可能會影響以后幾回合的得分。* 比賽開始時&#xff0c;記錄時空白的。你會得到一個記錄操作的字符串列表aops&#xff0c;其中ops[i]是你需要記錄的第i項操作&a…

IO多路復用之epoll總結

http://www.cnblogs.com/Anker/p/3263780.html 1、基本知識 epoll是在2.6內核中提出的&#xff0c;是之前的select和poll的增強版本。相對于select和poll來說&#xff0c;epoll更加靈活&#xff0c;沒有描述符限制。epoll使用一個文件描述符管理多個描述符&#xff0c;將用戶關…

2018南京區域賽 J-Prime Game

完全沒有頭緒 聽完隊友講的我還是楞了好半天菜慢慢理解.我好菜啊 首先要弄懂題目的意思,轉換一下題意就是求每個素因子出現區間的次數.區間長度最短為1.我們分析,第一個數的因子會影響1* n個區間(暫時不考慮重復),第二個數的因子會影響2 * (n-1)個區間,以此類推.因此我們只需要…

3_V1-類和對象 -- 默認成員函數

定義一個日期類 #include <iostream> #include <assert.h> using namespace std;class Date { public:void Display(); private:int _year;int _month;int _day; }; 注意: 在定義一個類的時候往往會將其成員變量定義為私有,成員函數定義為公有.這是為了達到軟件…

C++ 類模板二(類模版與友元函數)

http://www.cnblogs.com/zhanggaofeng/p/5661829.html //類模版與友元函數 #include<iostream> using namespace std;template<typename T> class Complex{ public:Complex(T a,T b);void Print() const//const修飾的是this指針{cout << this->Real <&…

HDU - 2973威爾遜定理

核心問題就是那個等式 我們觀察到等式可以寫成(n-1)!-1/n-[(n-1)!/n]的形式&#xff0c;這樣就應該聯想到威爾遜定理了。 回顧一下威爾遜定理的內容&#xff1a;當且僅當n為素數的時候n|(n-1)!-1&#xff0c;n為合數且大于4的時候n|(n-1)!【參見威爾遜定理的證明】 對于這個…

linux網絡編程之posix 線程(四):posix 條件變量與互斥鎖 示例生產者--消費者問題

http://blog.csdn.net/jnu_simba/article/details/9129939 一、posix 條件變量 一種線程間同步的情形&#xff1a;線程A需要等某個條件成立才能繼續往下執行&#xff0c;現在這個條件不成立&#xff0c;線程A就阻塞等待&#xff0c;而線程B在執行過程中使這個條件成立了&#x…

3-V2-類和對象 -- const內聯 靜態成員 友元

const修飾成員函數 在成員函數后面加一個const, const修飾this指針指向的對象, 保證調用這個const成員函數的對象在函數內不會被改變 注意:成員函數如果不修改成員變量,則加上const,成員函數如果要修改成員變量,此時就不能給其加上const修飾了 1.const對象不能調用非const…

C語言 二級指針內存模型混合實戰

http://www.cnblogs.com/zhanggaofeng/p/5485833.html //二級指針內存模型混合實戰 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>//將內存模型①和內存模型②的數據拷貝到內存模型③ char ** threemodel(ch…

擴展歐幾里得算法

對于a?xb?yca*xb*yca?xb?yc,這樣一個二元一次方程組&#xff0c;我們想要得到他的一組解可以用擴展歐幾里得算法&#xff0c;參數列表的a,b,x,y就是方程中的a,b,x,y&#xff0c;d計算出來是gcd(a,b)。 算法求出來的是a?xb?ygcd(a,ba*xb*ygcd(a,ba?xb?ygcd(a,b的一組解…