linux 定时器_定时器: Nodejs 中的 timers
在看 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。
数据结构与调用关系
从上至下各层的数据结构有:
- Nodejs - 链表,最小堆(实现的优先队列)
- Libuv - 最小堆
- Linux - 分桶-链表,红黑树
考虑一下场景,三者之间的数据模型是怎样的
setTimout(fn1(){}, 1000);setTimout(fn2(){}, 1000);setTimout(fn3(){}, 2000);setTimout(fn4(){}, 2000);setTimout(fn5(){}, 3000);setTimout(fn6(){}, 3000);
关键函数:
scheduleTimer
- node 调用此函数构建了libuv的数据processTimers
- node 定时器的回调函数
,libuv 到时会触发次回调
,由此可见具体的fn[x]并没有传递而libuv
,而是在node端执行的- epoll_wait - libuv 调用linux系统函数构建了高精度定时器的红黑树
关键点:
- 三个层面的数据并不一样
- Node端
时间+函数
,三个时间点,6个函数 - Libuv端
时间
,三个时间点 - Linux端
最小时间
,一个时间点
- Node端
- 调用关系
- Nodejs 把
固定
的定时回调函数processTimers
传递给libuv并通过scheduleTimer调用libuv,等待回调
- Libuv 读取最小时间
同步阻塞
调用Linux的epoll_wait,进程进入可中断睡眠
,等待中断
- Linux 高精度定时器设置APIC的cycles,
继续执行
其他任务,APIC到时触发中断
- Nodejs 把
Nodejs 的 timers们
Nodejs 提供的timers们,除了给用户使用,其实自身也在大量使用。对于Node来说,timer应该算是一种保护机制
,先看下Node自身哪里在用吧。
TCP 相关模块
- http[s],net- server.timeout
- server.keepAliveTimeout
child_process 模块
- child_process.exec(..., {timeout})
dns 模块
- Resolver({ timeout })
readline 模块
- readline.createInterface({..., escapeCodeTimeout})
vm 模块
- script.runInContext(..., { timeout})
以上模块或模块中的方法都是系统资源的重度消耗者
,而nodejs 作为server端
的编程语言,需要特别留意资源的开销
,所以在有资源开销地方一般都会Timer守护者
,以便及时的释放资源
。
server.timeout
本次关于定时器的主题,来自网上关于socket hang up
与connect ECONNREFUSED
的讨论,至此还没有涉及这方面内容。此内容将会涉及到timer以外的,socket, tcp等层面的内容,该内容相对独立,所以会作为定时器最后一节,放到下次讨论。
linux 定时器_定时器: Nodejs 中的 timers相关推荐
- nodejs命令行执行程序_在NodeJS中编写命令行应用程序
nodejs命令行执行程序 by Peter Benjamin 彼得·本杰明(Peter Benjamin) 在NodeJS中编写命令行应用程序 (Writing Command-Line Appli ...
- scl语言用plc脉冲做定时器_西门子PLC中使用SCL语言编程的技巧
中使用 SCL 语言编程的技巧 前言:两年半前我就在工控网上发表了有关 SCL 编程的知识 << 在 S7300400 型 PLC 中使用高级语言编程 >>, 但发表完 后,即 ...
- python中执行linux命令(调用linux命令)_常见Python中调用Linux命令
有时候我们需要从Python中执行Linux命令,下面就介绍几种方法? 1. os 模块: 1.1 os.system 函数: system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果. ...
- linux 定时器_通过linux源码分析nodejs的keep-alive
之前已经分析过了keep-alive,最近在使用nodejs的keep-alive的时候发现了遗漏了一个内容.本文进行一个补充说明.我们先看一下nodejs中keep-alive的使用. enable ...
- 西门子断开延时定时器_在PLC编程中定时器的一些针对现场不同情况的一些妙用...
相信大家在PLC编程中常会用到定时器,定时器指令也是比较常用的指令,一般分为接通延时定时器.断开延时定时器.脉冲定时器等,相信大家对于指令也已经很熟悉,在本文中就不具体介绍定时器指令了. 本文重点介绍 ...
- SpringBoot 中实现配置和使用定时器_张童瑶的博客
简单两步,实现在spring boot中配置和使用定时器: 1.在入口类中加入@EnableScheduling注解(即springboot启动类添加注解@EnableScheduling): @Sp ...
- Linux应用层的定时器Timer使用详解【转】
转自:http://blog.csdn.net/wwwtovvv/article/details/8601528 版权声明:本文为博主原创文章,未经博主允许不得转载. linux下定时器的使用 -- ...
- Linux timer调用流程图,Linux应用层的定时器Timer使用详解【转】
linux下定时器的使用-- alarm() & setitimer(): 1.alarm ------------------------------------------- 如果不要求很 ...
- Linux C: 定时器及时钟服务
一.定时器种类 对于 Intel x86 有多个定时器: 1) 实时时钟 (RTC): RTC 由一个独立的小型备用电池供电.通常用于提供计算机的时间和日历信息.即使在计算机断电的情况下,RTC 还是 ...
最新文章
- 大火的Apache Spark也有诸多不完美
- 火爆抖音!各路神仙齐唱《蚂蚁呀嘿》,带你探索背后的原理!
- CTreeCtrl标签的编辑
- plsq卸载 删除注册表、_win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结...
- 低学历者为何能骗取30万年薪职位
- WordPress暗黑极客主题Lotus1.1
- ubuntu18.04设置开机自启动的脚本
- ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
- 使用CALayer设置图像边框
- 地产行业信息化建设思考
- python博弈论代码_博弈论(示例代码)
- 驱动miniPCIE网络模块EC20硬件电路详解
- android 中拦截home键
- Driverjs-前端引导页组件
- 基于nose、使用django实现的自动化测试执行平台实现Rerun Failed功能。
- 关于物联网卡,您想了解的都在这里
- 【自用】ESP32-S3新板子 从零配置micropython环境(安装CH343驱动等)
- 学校计算机教室张贴些,计算机教室墙面布置方法是什么?
- 图像变形算法:实现Photoshop液化工具箱中向前变形工具
- 【墨者学院writeup】浏览器信息伪造之User-Agent及NetType微信网络检测破解
热门文章
- what does packaging mean in pom.xml
- SAP CRM Product workflow debug
- How is JerryMaster.view.xml being loaded in WebIDE local test environment
- Embedded web server initialization - jar file default-mimetypes.properties
- Marketing Cloud Launchpad动态tile显示数字刷新的触发逻辑
- 什么是CRM中间件的1250事件
- 如何处理Partner function occurs less than specified in customizing error message
- tcode search_sap_menu 根据关键字搜索SAP menu
- Java源码研究之object to json string debug
- TCP请求发送和接收,如果接收端终止,发送端继续发送会出什么错