go语言架构师面试 go语言面试题

面试必问的epoll技术,从内核源码出发彻底搞懂epollepoll是linux中IO多路复用的一种机制 , I/O多路复用就是通过一种机制,一个进程可以监视多个描述符 , 一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 。当然linux中IO多路复用不仅仅是epoll,其他多路复用机制还有select、poll,但是接下来介绍epoll的内核实现 。
events可以是以下几个宏的集合:
epoll相比select/poll的优势:
epoll相关的内核代码在fs/eventpoll.c文件中 , 下面分别分析epoll_create、epoll_ctl和epoll_wait三个函数在内核中的实现,分析所用linux内核源码为4.1.2版本 。
epoll_create用于创建一个epoll的句柄,其在内核的系统实现如下:
sys_epoll_create:
可见,我们在调用epoll_create时,传入的size参数,仅仅是用来判断是否小于等于0,之后再也没有其他用处 。
整个函数就3行代码,真正的工作还是放在sys_epoll_create1函数中 。
sys_epoll_create - sys_epoll_create1:
sys_epoll_create1 函数流程如下:
sys_epoll_create - sys_epoll_create1 - ep_alloc:
sys_epoll_create - sys_epoll_create1 - ep_alloc - get_unused_fd_flags:
linux内核中,current是个宏,返回的是一个task_struct结构(我们称之为进程描述符)的变量,表示的是当前进程,进程打开的文件资源保存在进程描述符的files成员里面,所以current-files返回的当前进程打开的文件资源 。rlimit(RLIMIT_NOFILE) 函数获取的是当前进程可以打开的最大文件描述符数 , 这个值可以设置,默认是1024 。
相关视频推荐:
支撑亿级io的底层基石 epoll实战揭秘
网络原理tcp/udp,网络编程epoll/reactor , 面试中正经“八股文”
学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
需要更多C/C++ Linux服务器架构师学习资料加群812855908获?。ㄗ柿习–/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体 , CDN , P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享
__alloc_fd的工作是为进程在[start,end)之间(备注:这里start为0,end为进程可以打开的最大文件描述符数)分配一个可用的文件描述符,这里就不继续深入下去了,代码如下:
sys_epoll_create - sys_epoll_create1 - ep_alloc - get_unused_fd_flags - __alloc_fd:
然后,epoll_create1会调用anon_inode_getfile,创建一个file结构 , 如下:
sys_epoll_create - sys_epoll_create1 - anon_inode_getfile:
anon_inode_getfile函数中首先会alloc一个file结构和一个dentry结构,然后将该file结构与一个匿名inode节点anon_inode_inode挂钩在一起 , 这里要注意的是,在调用anon_inode_getfile函数申请file结构时,传入了前面申请的eventpoll结构的ep变量,申请的file-private_data会指向这个ep变量,同时 , 在anon_inode_getfile函数返回来后,ep-file会指向该函数申请的file结构变量 。
简要说一下file/dentry/inode,当进程打开一个文件时 , 内核就会为该进程分配一个file结构,表示打开的文件在进程的上下文,然后应用程序会通过一个int类型的文件描述符来访问这个结构 , 实际上内核的进程里面维护一个file结构的数组,而文件描述符就是相应的file结构在数组中的下标 。
dentry结构(称之为“目录项”)记录着文件的各种属性,比如文件名、访问权限等,每个文件都只有一个dentry结构,然后一个进程可以多次打开一个文件 , 多个进程也可以打开同一个文件,这些情况 , 内核都会申请多个file结构,建立多个文件上下文 。但是,对同一个文件来说,无论打开多少次,内核只会为该文件分配一个dentry 。所以,file结构与dentry结构的关系是多对一的 。

推荐阅读