多路转接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.mzph.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的一组解…