go语言架构师面试 go语言面试题( 二 )


同时,每个文件除了有一个dentry目录项结构外,还有一个索引节点inode结构,里面记录文件在存储介质上的位置和分布等信息,每个文件在内核中只分配一个inode 。dentry与inode描述的目标是不同的 , 一个文件可能会有好几个文件名(比如链接文件),通过不同文件名访问同一个文件的权限也可能不同 。dentry文件所代表的是逻辑意义上的文件,记录的是其逻辑上的属性,而inode结构所代表的是其物理意义上的文件,记录的是其物理上的属性 。dentry与inode结构的关系是多对一的关系 。
sys_epoll_create - sys_epoll_create1 - fd_install:
总结epoll_create函数所做的事:调用epoll_create后,在内核中分配一个eventpoll结构和代表epoll文件的file结构 , 并且将这两个结构关联在一块,同时,返回一个也与file结构相关联的epoll文件描述符fd 。当应用程序操作epoll时 , 需要传入一个epoll文件描述符fd,内核根据这个fd , 找到epoll的file结构,然后通过file , 获取之前epoll_create申请eventpoll结构变量,epoll相关的重要信息都存储在这个结构里面 。接下来,所有epoll接口函数的操作,都是在eventpoll结构变量上进行的 。
所以,epoll_create的作用就是为进程在内核中建立一个从epoll文件描述符到eventpoll结构变量的通道 。
epoll_ctl接口的作用是添加/修改/删除文件的监听事件,内核代码如下:
sys_epoll_ctl:
根据前面对epoll_ctl接口的介绍,op是对epoll操作的动作(添加/修改/删除事件),ep_op_has_event(op)判断是否不是删除操作,如果op != EPOLL_CTL_DEL为true,则需要调用copy_from_user函数将用户空间传过来的event事件拷贝到内核的epds变量中 。因为,只有删除操作,内核不需要使用进程传入的event事件 。
接着连续调用两次fdget分别获取epoll文件和被监听文件(以下称为目标文件)的file结构变量(备注:该函数返回fd结构变量 , fd结构包含file结构) 。
接下来就是对参数的一些检查 , 出现如下情况,就可以认为传入的参数有问题,直接返回出错:
当然下面还有一些关于操作动作如果是添加操作的判断,这里不做解释,比较简单,自行阅读 。
在ep里面 , 维护着一个红黑树,每次添加注册事件时,都会申请一个epitem结构的变量表示事件的监听项,然后插入ep的红黑树里面 。在epoll_ctl里面,会调用ep_find函数从ep的红黑树里面查找目标文件表示的监听项 , 返回的监听项可能为空 。
接下来switch这块区域的代码就是整个epoll_ctl函数的核心,对op进行switch出来的有添加(EPOLL_CTL_ADD)、删除(EPOLL_CTL_DEL)和修改(EPOLL_CTL_MOD)三种情况,这里我以添加为例讲解,其他两种情况类似,知道了如何添加监听事件,其他删除和修改监听事件都可以举一反三 。
为目标文件添加监控事件时,首先要保证当前ep里面还没有对该目标文件进行监听 , 如果存在(epi不为空),就返回-EEXIST错误 。否则说明参数正常,然后先默认设置对目标文件的POLLERR和POLLHUP监听事件,然后调用ep_insert函数,将对目标文件的监听事件插入到ep维护的红黑树里面:
sys_epoll_ctl - ep_insert:
前面说过,对目标文件的监听是由一个epitem结构的监听项变量维护的,所以在ep_insert函数里面,首先调用kmem_cache_alloc函数,从slab分配器里面分配一个epitem结构监听项,然后对该结构进行初始化,这里也没有什么好说的 。我们接下来看ep_item_poll这个函数调用:
sys_epoll_ctl - ep_insert - ep_item_poll:
ep_item_poll函数里面 , 调用目标文件的poll函数,这个函数针对不同的目标文件而指向不同的函数,如果目标文件为套接字的话 , 这个poll就指向sock_poll,而如果目标文件为tcp套接字来说 , 这个poll就是tcp_poll函数 。虽然poll指向的函数可能会不同,但是其作用都是一样的,就是获取目标文件当前产生的事件位 , 并且将监听项绑定到目标文件的poll钩子里面(最重要的是注册ep_ptable_queue_proc这个poll callback回调函数),这步操作完成后,以后目标文件产生事件就会调用ep_ptable_queue_proc回调函数 。

推荐阅读