一、是什么?
时间
Wall Time 真实时间
这是真实世界中的物理时间和日期,也就是说,是墙壁上挂钟的时间,
当和进程用户交互或对事件添加时间戳时,会使用墙钟时间.
进程时间(Process Time)
这是进程在处理器上消耗的时间,它包括用户空间代码本身消耗的时间。
单调时间
这种时间类型是严格线性递增的。单调时间类型的重要性并不是在于
当前值,而是确保时间是严格线性递增的,可以利用该特性计算两次
时间采样的差值.
相对时间
它是相对于某些基准时间的差值,例子,比如是5秒之后,10分钟之后,24小时核酸检测
,每秒刷新屏幕60次.
绝对时间
它表示不含任何基准的时间. 如1968年3月25号中午.
内核启动一个周期性计时器,称为system timer,为tick和jiffy,运行的tick
计数称为jiffies计数器.
在Linux,系统计时器的频率称为HZ.
系统计时器每秒100次,100HZ,jiffy为0.01秒.
1000HZ,0.001秒.
意外断电可以通过hwclock将时钟更新为其他时间.
时间管理的任务:
(1)设定和取得当前墙钟的时间
(2)计算消耗时间
(3)睡眠一段时间
(4)执行精确时间测量
(5)控制计数器
时间的数据结构
time.h
typedef long time_t;
微秒级精度:
#include<sys/time.h>
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
纳秒级精度
#include<time.h>
struct timespec
{
time_t tv_sec;
long tv_nsec;
};
对时间分解:
#include<time.h>
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_isdst;
};
POSIX时钟:
CLOCK_REALTIME:系统的真实时间
CLOCK_MONOTONIC:单调递增时间
CLOCK_PROCESS_CPUTIME_ID:处理器给每个进程的高精度时钟.
链接库:
-lrt
取得当前时间:
#include<sys/time.h>
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
int gettimeofday(struct timeval*tv,struct timezone*tz);
微秒级精度,后面的参数始终为NULL.
#include<time.h>
struct timespec
{
time_t tv_sec;
long tv_nsec;
};
int clock_gettime(clockid_t clock_id,struct timespec*ts);
睡眠和等待:
让进程睡眠指定的时间.
#include<unistd.h>
void usleep(unistd long usec);
struct timeval tv =
{
.tv_sec = 0,
.tv_usec = 757
};
select(0,NULL,NULL,NULL,&tv);
overrun超时:
假设系统只能在10毫秒精度下测量并响应时间相关的事件,但是进程
需要1毫秒的睡眠。 实际上需要9毫秒才能产生,不是1毫秒.
为了在驱动程序中打印出一次DMA传输所花费的时间,
在DMA传输开始前记录start_jiffies = jiffies;然后
进行DMA传输,在DMA传输结束后记录下end_jiffies = jiffies