一、IO多路复用:一个线程监测多个IO操作
基本思想:先构造一张有关描述符的表,然后调用一个函数,当这些文件描述符中的一个或多个已经准备好进行I/O函数时才返回。函数返回时告诉进程哪个描述符已经就绪,可以进行I/O操作。
用户进行IO操作依赖于Linux内核read()、write()函数。
二、epoll模型:
Linux操作系统独有的,是select和poll的改良升级版。不同于select、poll的轮询机制,epoll采用的是事件驱动机制。,每个epoll对象都有一个独立的eventpoll结构体(红黑树)
优点:
1.监听的fd没有上限;
2.不用遍历,epoll是事件触发;
3.监听的fd可以复用,只需要用户调用epoll_wait就行,其他事情由内核帮助我们完成;
4.可以动态修改监听的fd,开启另一个线程对epollfd所标识的内核事件表进行epoll_ctl,会立即生效。
缺点:
1.在连接比较少时,epoll的通知机制会需要很多函数回调。这时效率不如select和poll。
2.只支持Linux操作系统,移植性不如select模型。
epoll服务器端实现需要3个函数:
- epoll_create:创建保存epoll文件描述符的空间(红黑树根节点,返回一个文件句柄)
- epoll_ctl:向空间注册、注销文件描述符
- epoll_wait:与select函数类似,有事件发生变化会解除阻塞。
1.epoll_create
int epoll_create(int size);
成功:返回一个操作epoll文件描述符表的句柄(文件描述符)
失败:返回-1
Linux 2.6.8之后的内核将完全忽略传入epoll_create函数的size参数,因为内核会根据情况调整epoll例程的大小。
2.epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
struct epoll_event
{
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
epfd:操作文件描述符表的相关句柄
op:
EPOLL_CTL_ADD:添加事件
EPOLL_CTL_DEL:删除事件fd:需要注册的监视对象的文件描述符
event:操作事件的首地址(文件描述符中某个操作元素的首地址)
3.epoll_wait
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
epfd:操作文件描述符相关句柄
events:文件描述符表的首地址
maxevents:监测事件的总项数
timeout:用于超时检测
epoll是Linux操作系统特有的IO多路复用机制,它是select和poll的升级版,主要优点包括不限制文件描述符数量、事件触发模式、可复用的fd以及动态修改监听fd的能力。epoll服务器端实现涉及epoll_create、epoll_ctl和epoll_wait三个关键函数,分别用于创建epoll实例、管理文件描述符和等待事件发生。
589

被折叠的 条评论
为什么被折叠?



