- 阻塞IO模型
- 非阻塞IO模型
- 信号驱动IO模型
- 异步IO模型
- 多路转接IO模型
- 高级IO重要概念
- 阻塞IO模型
在内核将数据准备好,系统调用会一直等待,所有的套接字默认都是阻塞IO方式
阻塞IO是最常见的IO模型
- 非阻塞IO模型
非阻塞IO往往需要程序员循环的方式反复尝试读取文件描述符,这个过程称为轮询,这对于cpu来说的话是较大的浪费,一般只有特定的场景下才能使用
- 信号驱动IO模型
内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作
- 异步IO
由内核在数据拷贝完成的时候,通知应用程序(而信号驱动是高数应用程序什么时候进行数据拷贝)
- IO多路转接
IO多路转接看起来和阻塞IO类似,实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态
- 高级IO概念
1)同步与异步
将一个文件描述符设置成非阻塞IO
一个文件描述符默认都是阻塞IO,可以使用fcntl()函数设置成阻塞IO。
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
根据我们传递的cmd的值不同,后面的参数也不相同
fcntl函数有五种功能
- 赋值一个现有的文件描述符(cmd=F_DUPFD)
- 获得/设置文件描述符标记(cmd=F_GETFD或者F_SETFD)
- 获得/设置一个文件状态标记(cmd=F_GETFL或者F_SETFL)
- 获得/设置异步IO所有权(cmd=F_GETOWN或者F_SETOWN)
- 或者/设置记录锁(cmd=F_GETLK或者F_SETLKW)
将一个文件描述符设置成非阻塞只需要三行代码
int f1 = fcntl(fd,F_GETFL);
f1 = f1 | O_NONBLOCK;
fcntl(fd,F_SETFL,f1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)