一、io模型
1、阻塞IO
2、非阻塞IO(忙等待)
3、信号驱动IO
4、并行模型(线程,进程)
5、IO多路复用
阻塞转为非阻塞:使用fcntl函数
(1)int flag = fcntl(fd,F_GETEL);
(2) fcntl(fd,F_SETEL,flag|追加标志位);
信号驱动:客户端发送数据时,会发送一个信号,在服务端中捕捉该信号(SIGIN)
(1)int flag = fcntl(fd,F_GETEL);
(2) fcntl(fd,F_SETEL,flag|追加标志位);
(3)fcntl(fd,F_SETOWN,getpid()); //设置信号接收者
二、IO多路复用的定义和作用以及使用的原因
1、定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力
2、作用:处理多条事件流中的事件
3、原因:CPU单核同一时刻只能做同一件事
COU的时分复用(线程和进程):创建成本、切换不同线程进程的成本、资源竞争
IO的多路复用:单线程、单进程处理多个事件流
三、select函数
1、FD_ZERO 将指定set集合中的文件描述符删除
2、FD_SET 将指定描述符加入到指定的set集合中
3、select 对指定set集中的有效描述符进行动态检测
4、FD_ISSET 判断指定描述符是否在set集合中被置位
5、FD_CTL 将指定描述符从set集合中删除
四、epoll函数
1、epoll_create(size) 创建epoll文件描述符,参数是可检测的描述符的个数
2、epoll_ctl 对指定epoll描述符进行添加,删除或者修改
注:每一个宏都有一个回调函数,将指定描述符从epoll描述符中添加、删除、修改
EPOLL_CTL_ADD :添加事件
EPOLL_CTL_DEL: 删除事件
EPOLL_CTL_MOD: 修改事件
epoll_wait 查看epoll文件描述符中的链表中是否有就绪的描述符
其中最后一个参数是阻塞时间上限:
1、小于0 阻塞
2、等于0 不阻塞
3、大于0 等待超时时间
五、select函数和epoll函数的对比
1、select函数只知道事件的发生,但无法定位是哪一个事件,因此需要对所有事件流进行轮询(事件复杂度 O(n)),epoll知道哪个描述符发生了什么事件,并通知我们,将就绪的描述符加入到readylist中,事件复杂度为(O(1))
2、select最大连接数为1024 或者 2048,epoll没有最大上限