五种IO模型:阻塞IO,非阻塞IO,信号驱动IO,异步IO,IO多路转接
阻塞:为了完成功能,发起调用,若当前不具备完成条件,则等待完成后返回
非阻塞:为了完成功能,发起调用,若当前不具备完成条件,则立即报错返回
阻塞与非阻塞的最大区别:发起调用之后是否立即返回
同步:为了完成功能,发起调用若当前不具备完成条件,则
自己等待完成后返回
异步:为了完成功能,发起调用之后,有其他人完成操作
同步与异步的区别:任务是否由自己来完成
异步阻塞:等待别人完成操作
异步非阻塞:不等待别人完成操作
同步异步的优缺点:同步操作效率较低,但是流程简单,异步操作效率较高,流程控制较难
多路转接IO(多路复用):select、poll、epoll
IO时间监控
对大量描述符进行是否具备IO条件的事件进行监控
作用:处理描述符的高并发事件
多路转接模型:
就绪:
读事件就绪:缓冲区中由数据可读取
写时间就绪:缓存区中由空闲空间
Select:内核中通过遍历的描述符集合中的描述符,判断是否相应时间就绪;若就绪了,则从集合中剔除那些没有就绪的描述符;用户通过这个集合直到那些描述符就绪,直接针对就绪操作
Int select (iny nfds, fd_set* readfds, fd_set* writefds, fd_set* excerptfds, struct timeval* timrout)
Nfds : maxfd + 1 最大的文件描述符+1
Fd_set:描述符集合–是一个位图,位图大小取决于_FD_SETSIZE = 1024
Readfds:可读事件集合
Writefds:可写事件集合
Exceptfds:异常事件集合
Timeout:设置select超时等待事件时间
Select优缺点:
优点:
1.select遵循posix标准,可以跨平台,移植性好
2.Select的超时等待时间控制可以更加精细到微秒
缺点:
1.select能够监控的描述符由上限限制,取决于_FD_SETSIZE = 1024
2.Select监控描述符原理是在内核中进行轮询遍历,性能随着描述符的增多而下降
3.Select监控会修改描述符集合中的内容,因此监控时每次都需要重新添加描述符
4.Select无法告诉用户具有那些描述符就绪,需要用户进行遍历才能获取到就绪的描述符
Poll:
优点:
1.poll使用时间结构数组对描述符关心的时间进行监控,简化了多个集合
2.Poll没有描述符上限的限制
缺点:
1.poll使用事件结构数组对描述符关心的时间进行监控,简化了多个集合的监控
2.Poll也不会告诉用户具体那些就绪,需要用户轮询判断
3.Poll也需要每次都将时间结构拷贝到内核中进行监控
Epoll:
接口:
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);
struct epoll_event
{
uint32_t events;
epoll_data;
}
int epoll_wait(int epfd, struct epoll_event* evrnt, int maxevents, int timeout);
epoll的实现原理:
对内核中添加的事件描述符进行监控,并且为这个描述符的时间设置射箭回调函数;若描述符就绪,则回调函数将这个时间结构放置到eventpoll结构体中的双向链表中