IO多路复用的Linux内核原理

IO多路复用

IO 多路复用是一种同步IO模型,一个线程可以监视多个文件句柄,一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作,没有文件句柄就绪就会阻塞应用程序交出CPU

无需为每个IO操作创建一个线程或进程,没有线程切换的开销

Select

传入需要监听的文件描述符集合,每次select都需要重新初始化一下,因为fd_set会被置位,然后调用select的时候用户态切换到内核态,集合会被拷贝一次,内核会遍历所有的文件描述符看看有没有状态改变的,没有的话会陷入睡眠等待超时时间再次遍历,找到的话会将集合拷贝回用户

fd_set是1024bit组成的位图,由16个long  int数组模拟的

内核需要遍历文件描述符

每次初始化fd_set

多次拷贝文件集合

Poll

需要根据监听的文件和事件构造poll数组,然后调用poll拷贝数组传到内核构造poll链表,内核也是遍历链表看看有没有就绪的socket,没有的话就等待事件唤醒或者超时返回,有的话就将链表节点拷贝回用户数组

监听的socket数量没有数据结构的限制

不需要每次构造数组,但每次都需要传入数组

多次拷贝

Epoll

内核通过红黑树来管理监听的文件描述符,不需要每次都拷贝,只用添加一次就行,当监听的socket有事件发生时会被添加到就绪链表中,将就绪链表里面的事件拷贝回用户态数组,没有的话就睡眠等待事件唤醒或者超时退出

减少了用户态到内核态的数据拷贝

用户进程不需要遍历所有的socket

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值