llinux获取系统时间
linux中获取当前时间、统计程序运行时间,可以使用gettimeofday()得到毫秒级的时间统计,利用rdtsc指令获取纳秒级时间统计。
gettimeofday()
它是一个linux C库函数,封装了系统调用sys_gettimeofday(),在X86_64系统中,该函数是调用vsyscall()来访问内核数据,而在X386系统上是系统调用syscall。
syscall与vsyscall的区别,只有gettimeofday、time、getcpu这几个linux C库函数的系统调用时vsyscall,其余都是syscall。
该函数的时间开销分析:
syscall系统调用实现:用户态在syscall中通过软中断陷入内核,cpu要做的工作有,用户态切换到内核态、处理软中断、保存寄存器值、复制用户态参数到内核态、执行、内核态切换回用户态,这些处理过程是超过1ms的。
vsyscall系统调用实现:在内核态创建一个共享内存,用户态也可以访问,并不用发送中断,优点:速度快,成本低;
rdtsc指令
rdtsc指令是X86平台的读取时间戳寄存器TSC(64位)的指令,TSC寄存器统计了CPU自启动以来的运行时间,每个时钟信号到来时,TSC递增1。
目前CPU的主频>1GHZ,故时钟周期是纳秒级别的。
64位寄存器的溢出时间计算:若CPU主频是3GHZ,1s内TSC增加了3000000000,64bit寄存器溢出需要的时间:2^64/3*10^9=6148914691.2s=194年,故一般不会溢出的。
利用rdtsc获取系统纳秒级时间统计的示例代码如下(i386系统):
1 void getCurrTime(uint64_t& now) 2 { 3 uint32_t lval, hval; 4 asm volatile ("rdtsc" : "=a" (lval), "=d" (hval)); 5 now = hval; 6 now = (now << 32) | lval; 7 }