阿里面试官用HashMap把我问倒了 (2)

select(阻塞函数)其实就是将对FD(标志位)数据的集合判断从原来的用户态到交给内核态管理(将Rset从用户态拷贝到了内核态),内核态会快很多,如果判断有数据

将FD置位,表示此时有数据来了

将select返回,不再阻塞

之后判断那一个FD被置位了,于是就行取数据处理

select使用的1024的bitmap存数据

缺点:

fd_size有限制1024bitmap

FDset不可重用

用户态到内核态的拷贝开销

O(n)再次遍历

poll

poll(阻塞函数),工作原理与select很相似, 但是poll没有采用bitmap,采用的pollfd存储(基于结构体存储fd)

struct pollfd { int fd; short events; short revents; }

有数据:

pollfd.revents置位

poll返回,不再阻塞

执行之后的操作,执行之后再将pollfd.revents设置为0

缺点:

用户态到内核态的拷贝开销

O(n)再次遍历

epoll

epoll,最新的一种IO多路复用的函数,用户态和内核态共享epfd数组,内核用于判断哪个fd有数据到来,不需要用户态到内核态的拷贝,不需要轮询,时间负责度O(1)

有数据:

置位,通过重排置位,将数组中有数据的fd放在前面的位置

返回,有返回值,返回一共有多少个fd触发了事件,这样可以实现遍历复杂度为O(1)

Redis、Ngnix都是使用的epoll,JavaNIO在Linux系统下也是采用的epool实现的

其实到这里我已经答不出来了,因为我操作系统学的其实并不好,上面有些东西也是我之后总结出来补上去的

上面都是我个人的真实经历,其实有很多点都可以深究去挖掘,我这篇文章的问法可能只是一个岑天大树的一个小分支,录制这个视频的意义就是想跟大家分享分享面经,也是为了告诉大家,知识网络体系的建立很重要,尤其是对于想要面试大厂的小伙伴本。B站地址:https://space.bilibili.com/476743659

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggyfd.html