Node.js的心脏-epoll

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js的心脏-epoll相关的知识,希望对你有一定的参考价值。

参考技术A     我们都知道Node.js是异步的,那么Node.js为什么会是异步的呢?这是因为Node.js使用了LIBUV做为它的跨平台抽象层。具体请看 nodejs运行机制

    select、poll、epoll是Linux平台下的IO多路复用机制,用来管理大量的文件描述符。但是select/poll相对于epoll来说效率是低下的。

      1、linux内核在select的每次返回前都要对所有的描述符 循环遍历 ,将有事件发生的文件描述符放在一个集合里返回。在描述符不多的时候对性能影响不大,但是当描述符达到数十万甚至更多的时候,这种处理方式造成大量的浪费和资源开销,select的效率会急剧下降。这是因为每次select的时候,会将所有的文件描述符从用户态拷贝的内核态,在内核态进行循环,查看是否有事件发生。2、select默认的管理的最大文件描述符是1024个,当然可以对linux内核从新编译来改变这个限制。

    原理和select相似也是使用循环遍历的方式管理文件描述符,不同的是管理的文件最大文件描述符的数量没有限制(根据系统限制来定)。

下文讲解epoll实现原理

    epoll改进了select的两个缺点,从而能够在管理大量的描述符的情况下,对系统资源的使用并没有急剧的增加,而只是对内存的使用有所增加(毕竟存储大量的描述符的数据结构会占用大量内存)。epoll在实现上的三个核心点是:1、mmap,2、红黑树,3、rdlist(就绪描述符链表)接下来一一解释这三个并且解释为什么会高效。

    mmap是共享内存,用户进程和内核有一段地址(虚拟存储器地址)映射到了同一块物理地址上,这样当内核要对描述符上的事件进行检查的时候就不用来回的拷贝了。   

    红黑树是用来存储这些描述符的。当内核初始化epoll的时候(当调用epoll_create的时候内核也是个epoll描述符创建了一个文件,毕竟在Linux中一切都是文件,而epoll面对的是一个特殊的文件,和普通文件不同),会开辟出一块内核缓冲区,这块区域用来存储我们要监管的所有的socket描述符,当然在这里面存储有一个数据结构,这就是红黑树,由于红黑树的接近平衡的查找,插入,删除能力,在这里显著的提高了对描述符的管理。

        rdlist就绪描述符链表这是一个双链表,epoll_wait()函数返回的也是这个就绪链表。当内核创建了红黑树之后,同时也会建立一个双向链表rdlist,用于存储准备就绪的描述符,当调用epoll_wait的时候在timeout时间内,只是简单的去管理这个rdlist中是否有数据,如果没有则睡眠至超时,如果有数据则立即返回并将链表中的数据赋值到events数组中。这样就能够高效的管理就绪的描述符,而不用去轮询所有的描述符。

        当执行epoll_ctl时除了把socket描述符放入到红黑树中之外,还会给内核中断处理程序注册一个回调函数,告诉内核,当这个描述符上有事件到达(或者说中断了)的时候就调用这个回调函数。这个回调函数的作用就是将描述符放入到rdlist中,所以当一个socket上的数据到达的时候内核就会把网卡上的数据复制到内核,然后把socket描述符插入就绪链表rdlist中。

Epoll的两种模式:

      1. 水平触发(LT):使用此种模式,当数据可读的时候,epoll_wait()将会一直返回就绪事件。如果你没有处理完全部数据,并且再次在该epoll实例上调用epoll_wait()才监听描述符的时候,它将会再次返回就绪事件,因为有数据可读。

      2. 边缘触发(ET):使用此种模式,只能获取一次就绪通知,如果没有处理完全部数据,并且再次调用epoll_wait()的时候,它将会阻塞,因为就绪事件已经释放出来了。

        ET的效能更高,但是对程序员的要求也更高。在ET模式下,我们必须一次干净而彻底地处理完所有事件。

epoll的linux实现

苹果警告iPhone12别靠近心脏起搏器,这是啥原因?如何看待?

苹果手机一直以来都受到果粉的热烈欢迎,此次iPhone12系列上市也不例外。然而在iPhone12系列出现了不和谐的声音,原因是在之前的一项测试中,医生发现iPhone12在靠近植入式除颤器时会让该设备进入 “暂停”状态。经过长时间的调查研究, 苹果最终更新了其《iPhone用户指南》,指南警告用户不要将iPhone12和MagSafe配件太靠近植入式心脏起搏器等医疗设备。原因如下: 

1、iPhone12靠近心脏起搏器可能使设备“暂停”。 

植入式心脏起搏器一种植入于体内的电子治疗仪器,它的工作原理是通过脉冲发生器定时发放一定频率的脉冲电流,通过导线和电极传输到电极所接触的心肌(心房或心室),使局部心肌细胞受到外来电刺激而产生兴奋,并通过细胞间的缝隙连接或闰盘连接向周围心肌传导,导致整个心房或心室兴奋并进而产生收缩活动。而 iPhone及所有的MagSafe配件中都包含磁铁组件,这些磁铁组件产生的磁场和无线电与这些传感器近距离接触时 可能会对部分医疗设备产生干扰。为了避免这些干扰行为,苹果公司建议用户将苹果设备与医疗设备保持6英寸(约15厘米)的安全距离,在无线充电式时,则需保持12英寸(约30厘米)的安全距离。

2、苹果公司应该事先检验设备是否会干扰心脏起搏器等医疗设备并告知消费者。

事实上我们生活的环境中,普通的家用电器基本上不会对心脏起搏器产生太大的影响,多数家用电器是安全的,只要没有漏电,一般不会影响起搏器,可以放心使用。但是患者在安装起搏器的时候医生会告知其远离手机等电子设备,原因就是如果心脏起搏器受到干扰,患者会有不同程度的不适感,严重依赖起搏器的患者还可能会重新出现眩晕等症状。所以作为供应商,iPhone12在研发或者销售之前就应该做好相关的检查和实验,提前测试出它对心脏起搏器的影响,并告知消费者,然后再由消费者选择是否购买,很显然,苹果公司在这方面做得不够,好在他事后补正了。

参考技术A 是因为iPhone12会发出一些电磁波,使起搏器停止。这是一种很危险的信号。说明iPhone在设计时还是有缺陷的。 参考技术B 植入式心脏起搏器和除颤器等医疗设备可能包含传感器,当密切接触时,传感器会对磁体和无线电装置作出反应。为避免与这些医疗设备产生任何潜在的相互作用, 参考技术C 可能就是苹果手机有一定的辐射,可能会干扰心脏起搏器。只能说苹果这样的技术是有非常多隐患的,应该全部召回吧。 参考技术D 因为心脏起搏器是不能靠近磁场的,容易导致其暂停工作,而iPhone12靠近心脏也会导致其暂停工作,严重可能会影响到用户的生命健康。我觉得这种问题也是十分严肃的,所以还是希望用户在平时的生活当中多注意。

以上是关于Node.js的心脏-epoll的主要内容,如果未能解决你的问题,请参考以下文章

老人突然发病导购员进行心脏复苏,正确的心脏复苏方法是怎样的?

心脏起搏器植入术的起搏模式

心脏年龄测试工具”活动由英国健康咨询NHS选择网站和英国心脏基金会

苹果警告iPhone12别靠近心脏起搏器,这是啥原因?如何看待?

心痛的时候心脏真的会疼么?

心脏滴血漏洞搭建与复现修复(CVE-2014-0160)OpenSSL Heartbleed漏洞