linux平台获取系统时间的方法有很多,比如time函数,gettimeofday函数和localtime函数等。大部分函数本质上都是通过系统调用来获取时间的。但是使用系统调用时,开销会比较大。
程序执行一次系统调用,将至少经过以下几个步骤:
-
应用程序调用库函数api
-
api将系统调用号存入寄存器EAX,然后通过中断调用使得系统进入内核态
-
内核中的中断处理函数根据寄存器中的系统调用号,调用对应的内核函数
-
系统调用完成相应功能,将返回值存入寄存器EAX,返回到中断处理函数
-
中断处理函数返回到API中。
-
api将寄存器EAX返回给应用程序
以上6个不在设计内核空间和用户空间的切换,系统中断处理等过程,这些无疑增加系统开销。
nginx获取时间也是通过gettimeofday函数获取的,但是nginx采用了缓存时间的办法来减少系统调用,并且每个worker进程自行维护缓存。但是采用缓存时间必然会带来一个时间精度的问题。在nginx配置中,有一条配置指令可以配置精度: timer_resolution 100ms;(设置更新时间间隔为100ms)。这个配置值越大,对系统调用gettimeofday的使用频率就越低,但是缓存的时间精度也越低。
网友评论