在看 Node http 模块文档的时候, 才留意到 server.timeout 这个属性, 本想简单介绍一下, 但是在梳理过后发现关于 timeout 有庞大的内容支撑: server.timout -> node core timers -> uv timers -> linux msleep/hrtimer -> clocksource -> tsc -> cmos rtc -> clock cycle, 所以拆分成几部分大致做下介绍, 期望定时器系列结束之后, noder 能够大致明白: clock cycle 是如何驱动 linux 的 msleep/hrtimer;linux 的 timers 与 uv timers 的关系;node timers 与 uv timers的关系。

前面叙述了计算机中timer实现原理,libuv层如何借助epoll_wait实现timer的机制,现在讲下Nodejs应用层相关的timers。

数据结构与调用关系

从上至下各层的数据结构有:

  1. Nodejs - 链表,最小堆(实现的优先队列)
  2. Libuv - 最小堆
  3. Linux - 分桶-链表,红黑树

考虑一下场景,三者之间的数据模型是怎样的

setTimout(fn1(){}, 1000);setTimout(fn2(){}, 1000);setTimout(fn3(){}, 2000);setTimout(fn4(){}, 2000);setTimout(fn5(){}, 3000);setTimout(fn6(){}, 3000);
一图胜千言(点击放大)

关键函数:

  1. scheduleTimer- node 调用此函数构建了libuv的数据
  2. processTimers - node 定时器的回调函数libuv 到时会触发次回调,由此可见具体的fn[x]并没有传递而libuv,而是在node端执行的
  3. epoll_wait - libuv 调用linux系统函数构建了高精度定时器的红黑树

关键点:

  1. 三个层面的数据并不一样

    1. Node端时间+函数,三个时间点,6个函数
    2. Libuv端时间,三个时间点
    3. Linux端最小时间,一个时间点
  2. 调用关系
    1. Nodejs 把固定定时回调函数processTimers传递给libuv并通过scheduleTimer调用libuv,等待回调
    2. Libuv 读取最小时间同步阻塞调用Linux的epoll_wait,进程进入可中断睡眠等待中断
    3. Linux 高精度定时器设置APIC的cycles,继续执行其他任务,APIC到时触发中断

Nodejs 的 timers们

Nodejs 提供的timers们,除了给用户使用,其实自身也在大量使用。对于Node来说,timer应该算是一种保护机制,先看下Node自身哪里在用吧。

  1. TCP 相关模块 - http[s],net

    1. server.timeout
    2. server.keepAliveTimeout
  2. child_process 模块
    1. child_process.exec(..., {timeout})
  3. dns 模块
    1. Resolver({ timeout })
  4. readline 模块
    1. readline.createInterface({..., escapeCodeTimeout})
  5. vm 模块
    1. script.runInContext(..., { timeout})

以上模块或模块中的方法都是系统资源的重度消耗者,而nodejs 作为server端的编程语言,需要特别留意资源的开销,所以在有资源开销地方一般都会Timer守护者,以便及时的释放资源

server.timeout

本次关于定时器的主题,来自网上关于socket hang upconnect ECONNREFUSED的讨论,至此还没有涉及这方面内容。此内容将会涉及到timer以外的,socket, tcp等层面的内容,该内容相对独立,所以会作为定时器最后一节,放到下次讨论。

linux 定时器_定时器: Nodejs 中的 timers相关推荐

  1. nodejs命令行执行程序_在NodeJS中编写命令行应用程序

    nodejs命令行执行程序 by Peter Benjamin 彼得·本杰明(Peter Benjamin) 在NodeJS中编写命令行应用程序 (Writing Command-Line Appli ...

  2. scl语言用plc脉冲做定时器_西门子PLC中使用SCL语言编程的技巧

    中使用 SCL 语言编程的技巧 前言:两年半前我就在工控网上发表了有关 SCL 编程的知识 << 在 S7300400 型 PLC 中使用高级语言编程 >>, 但发表完 后,即 ...

  3. python中执行linux命令(调用linux命令)_常见Python中调用Linux命令

    有时候我们需要从Python中执行Linux命令,下面就介绍几种方法? 1. os 模块: 1.1 os.system 函数: system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果. ...

  4. linux 定时器_通过linux源码分析nodejs的keep-alive

    之前已经分析过了keep-alive,最近在使用nodejs的keep-alive的时候发现了遗漏了一个内容.本文进行一个补充说明.我们先看一下nodejs中keep-alive的使用. enable ...

  5. 西门子断开延时定时器_在PLC编程中定时器的一些针对现场不同情况的一些妙用...

    相信大家在PLC编程中常会用到定时器,定时器指令也是比较常用的指令,一般分为接通延时定时器.断开延时定时器.脉冲定时器等,相信大家对于指令也已经很熟悉,在本文中就不具体介绍定时器指令了. 本文重点介绍 ...

  6. SpringBoot 中实现配置和使用定时器_张童瑶的博客

    简单两步,实现在spring boot中配置和使用定时器: 1.在入口类中加入@EnableScheduling注解(即springboot启动类添加注解@EnableScheduling): @Sp ...

  7. Linux应用层的定时器Timer使用详解【转】

    转自:http://blog.csdn.net/wwwtovvv/article/details/8601528 版权声明:本文为博主原创文章,未经博主允许不得转载. linux下定时器的使用 -- ...

  8. Linux timer调用流程图,Linux应用层的定时器Timer使用详解【转】

    linux下定时器的使用-- alarm() & setitimer(): 1.alarm ------------------------------------------- 如果不要求很 ...

  9. Linux C: 定时器及时钟服务

    一.定时器种类 对于 Intel x86 有多个定时器: 1) 实时时钟 (RTC): RTC 由一个独立的小型备用电池供电.通常用于提供计算机的时间和日历信息.即使在计算机断电的情况下,RTC 还是 ...

最新文章

  1. 大火的Apache Spark也有诸多不完美
  2. 火爆抖音!各路神仙齐唱《蚂蚁呀嘿》,带你探索背后的原理!
  3. CTreeCtrl标签的编辑
  4. plsq卸载 删除注册表、_win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结...
  5. 低学历者为何能骗取30万年薪职位
  6. WordPress暗黑极客主题Lotus1.1
  7. ubuntu18.04设置开机自启动的脚本
  8. ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
  9. 使用CALayer设置图像边框
  10. 地产行业信息化建设思考
  11. python博弈论代码_博弈论(示例代码)
  12. 驱动miniPCIE网络模块EC20硬件电路详解
  13. android 中拦截home键
  14. Driverjs-前端引导页组件
  15. 基于nose、使用django实现的自动化测试执行平台实现Rerun Failed功能。
  16. 关于物联网卡,您想了解的都在这里
  17. 【自用】ESP32-S3新板子 从零配置micropython环境(安装CH343驱动等)
  18. 学校计算机教室张贴些,计算机教室墙面布置方法是什么?
  19. 图像变形算法:实现Photoshop液化工具箱中向前变形工具
  20. 【墨者学院writeup】浏览器信息伪造之User-Agent及NetType微信网络检测破解

热门文章

  1. what does packaging mean in pom.xml
  2. SAP CRM Product workflow debug
  3. How is JerryMaster.view.xml being loaded in WebIDE local test environment
  4. Embedded web server initialization - jar file default-mimetypes.properties
  5. Marketing Cloud Launchpad动态tile显示数字刷新的触发逻辑
  6. 什么是CRM中间件的1250事件
  7. 如何处理Partner function occurs less than specified in customizing error message
  8. tcode search_sap_menu 根据关键字搜索SAP menu
  9. Java源码研究之object to json string debug
  10. TCP请求发送和接收,如果接收端终止,发送端继续发送会出什么错