IO模型多路转接
输入:外面数据交给进程的数据叫做输入。软件层面上,硬件交给系统叫做输入;
输出:从进程里出去的数据。软件层面上,系统交给硬件叫做输出。
IO=等+拷贝
高效的io本质就是单位时间内减少等的比重。
五种IO模型:
阻塞IO和非阻塞IO:两者等的方式不同,但是拷贝的数据是一样的!
信号驱动
多路复用/多路转接IO:IO多 路转接能够同时等待多个文件描述符的就绪状态
上述4中叫做同步IO(参与IO,继续进行等+拷贝);
异步IO(没有参与IO,IO=等+拷贝 ):
阻塞IO是最常见的IO模型.
非阻塞IO:
一个文件描述符,默认都是阻塞IO.变成非阻塞需要fcntl函数。
此处只是用第三种功能,获取/设置文件状态标记,就可以将一个文件描述符设置为 非阻塞。
void SetNoBlock(int fd) {//非阻塞函数使用int fl = fcntl(fd, F_GETFL);//F_GETFL将当前的文件描述符的属性取出来(这是一个位图).if (fl < 0) {perror("fcntl");return;}fcntl(fd, F_SETFL, fl | O_NONBLOCK);//用F_SETFL将文件描述符设置回去.设置回去的同时,加上一个
O_NONBLOCK参数.}
多路转接---Select:
select定位:只负责等,不负责拷贝。
作用:程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变(等待fd上面的数据就绪)通知进程可以进行IO拷贝。
多路转接---epoll:
poll作用:为了等待多个fd,等待fd上面的事件就绪,通知程序员,时间已就绪,可以进行IO拷贝了。
poll只负责等。
poll 的优点:
不同于select使用三个位图来表示三个fdset的方式,poll使用一个pollfd的指针实现。
pollfd结构包含了要监视的event和发生的event,不再使用select“参数-值”传递的方式.接口使用比select更方便。
poll并没有最大数量限制(但是数量过大后性能也是会下降)。
多路转接---epoll:
epoll:为了等待多个fd,等待fd上面的事件就绪,通知程序员,时间已就绪,可以进行IO拷贝了。
epoll接口函数:
epoll原理:
当某一进程调用epoll_create方法时,Linux内核会创建一个eventpoll结构 体,这个结构体中有两个成员与epoll的使用方式密切相关.
调用epoll_create创建一个epoll句柄;
调用epoll_ctl,将要监控的文件描述符进行注册;
调用epoll_wait, 等待文件描述符就绪