一、是什么?
时间
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
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
纳秒级精度
#include
struct timespec
{
time_t tv_sec;
long tv_nsec;
};
对时间分解:
#include
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
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
int gettimeofday(struct timeval*tv,struct timezone*tz);
微秒级精度,后面的参数始终为NULL.
#include
struct timespec
{
time_t tv_sec;
long tv_nsec;
};
int clock_gettime(clockid_t clock_id,struct timespec*ts);
睡眠和等待:
让进程睡眠指定的时间.
#include
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118