• linux时间的应用之计算消耗时间


    一、是什么?

    时间
    Wall Time  真实时间
    这是真实世界中的物理时间和日期,也就是说,是墙壁上挂钟的时间,
    当和进程用户交互或对事件添加时间戳时,会使用墙钟时间.
    进程时间(Process Time)
    这是进程在处理器上消耗的时间,它包括用户空间代码本身消耗的时间。
    单调时间
    这种时间类型是严格线性递增的。单调时间类型的重要性并不是在于
    当前值,而是确保时间是严格线性递增的,可以利用该特性计算两次
    时间采样的差值.
    
    
    相对时间
    它是相对于某些基准时间的差值,例子,比如是5秒之后,10分钟之后,24小时核酸检测
    ,每秒刷新屏幕60.
    绝对时间
    它表示不含任何基准的时间.1968325号中午.
    
    内核启动一个周期性计时器,称为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;  //32 在2038千年虫   64位 
    微秒级精度:
    #include
    struct timeval
    {
       
      time_t tv_sec;         //seconds 
      suseconds_t tv_usec;   //ms 
    };
    纳秒级精度
    #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;     /* seconds */
    	suseconds_t tv_usec;    /* microseconds */
    };
    
    int gettimeofday(struct timeval*tv,struct timezone*tz);
    微秒级精度,后面的参数始终为NULL.
    
    #include
    struct timespec
    {
       
       time_t tv_sec;//seconds 
       long tv_nsec; //nanseconds 
    };
    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
  • 相关阅读:
    复杂微纳结构制造需求旺盛 微纳3D打印市场发展前景广阔
    Java的<? super T>和<? extends R>理解与应用
    Say0l的安全开发-弱口令扫描工具-My-crack【红队工具】
    【云原生 · Kubernetes】部署高可用kube-scheduler集群
    企业固定资产盘点方案
    Codeforces Round 908 (Div. 2)视频详解
    代码随想录二刷Day 51
    「聊设计模式」之桥接模式(Bridge)
    基于grpc从零开始搭建一个准生产分布式应用(6) - 05 - MapStruct特殊实现
    Windows 和 Linux 系统下,如何区分相同PID VID 的USB-HID设备
  • 原文地址:https://blog.csdn.net/M_1308347688/article/details/126795274