背景

在学习 Linux 信号 有关知识中,提到了 alarm函数。

进程时间

(原文地址:https://www.cnblogs.com/clover-toeic/p/3845210.html)

进程时间也称CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴嗒计算,通常使用三个进程时间值,即实际时间(Real)、用户CPU时间(User)和系统CPU时间(Sys)。

实际时间指实际流逝的时间;用户时间和系统时间指特定进程使用的CPU时间。

具体区别如下:

  • Real是从进程开始执行到完成所经历的挂钟(wall clock)时间,包括其他进程使用的时间片(time slice)和本进程耗费在阻塞(如等待I/O操作完成)上的时间。该时间对应秒表(stopwatch)直接测量。
  • User是进程执行用户态代码(内核外)耗费的CPU时间,仅统计该进程执行时实际使用的CPU时间,而不计入其他进程使用的时间片和本进程阻塞的时间。
  • Sys是该进程在内核态运行所耗费的CPU时间,即内核执行系统调用所使用的CPU时间。

CPU总时间(User+Sys)是CPU执行用户进程操作和内核(代表用户进程执行)系统调用所耗时间的总和,即该进程(包括其线程和子进程)所使用的实际CPU时间。

若程序循环遍历数组,则增加用户CPU时间;若程序执行exec或fork等系统调用,则增加系统CPU时间。

在多核处理器机器上,若进程含有多个线程或通过fork调用创建子进程,则实际时间可能小于CPU总时间——因为不同线程或进程可并行执行,但其时间会计入主进程的CPU总时间。若程序在某段时间处于等待状态而并未执行,则实际时间可能大于CPU总时间。其数值关系总结如下:

  • Real < CPU,表明进程为计算密集型(CPU bound),利用多核处理器的并行执行优势;
  • Real ≈ CPU,表明进程为计算密集型(CPU bound),未并行执行;
  • Real > CPU,表明进程为I/O密集型(I/O bound),多核并行执行优势并不明显。

在单核处理器上,Real时间和CPU时间之差,即Real- (User + Sys)是所有延迟程序执行的因素的总和。可估算程序运行期间的CPU利用率为CpuUsage = (User + Sys)/ Real * 100(%)。

在SMP(对称多处理系统)上,该差值近似为Real* ProcessorNum - (User + Sys)。这些因素包括:

  • 调入程序文本和数据的I/O操作;
  • 获取程序实际使用内存的I/O操作;
  • 由其它程序消耗的CPU用时;
  • 由操作系统消耗的CPU用时

有关函数

#include <sys/time.h>

int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);

setitimer

参数:

which:哪一个定时器,系统为每个进程提供了3个定时器:

  • ITIMER_REAL :以系统真实的时间来计算(自然时间),它送出SIGALRM信号。默认动作:终止
  • ITIMER_VIRTUAL :以该进程在用户态下花费的时间来计算(虚拟空间计时),它送出SIGVTALRM信号。默认动作:终止
  • ITIMER_PROF :以该进程在用户态下和内核态下所费的时间来计算(运行时计时)。它送出SIGPROF信号。默认动作:终止

new_value:设置定时时间和重复的时间间隔,it_interval和it_value的值为0表示禁止对应功能。

old_value:它是用来存储上一次setitimer调用时设置的new_value值,不使用它是可设置为NULL。

其中的结构体:

struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
}; struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};

在itimerval结构中,it_value指定该定时器产生第一个信号的剩余时间,即多久后产生相应的信号。如果为0,表示禁止该定时器,it_interval用来存储该定时器下一个信号到来的间隔时间。

工作机制是:

1)先对it_value倒计时,当it_value为零时触发信号。

2)然后重置为it_interval。继续对it_value倒计时。

3)一直这样循环下去。

假如it_value为0是不会触发信号的,所以要能触发信号,it_value得大于0;假设it_interval为零,仅仅会延时。不会定时(也就是说仅仅会触发一次信号)。基于此机制,setitimer既能够用来延时运行,也可定时运行。

getitimer()函数:

getitimer()用来获取3个定时器中的某个的相关信息,存储在第二个参数中,存储的是剩余时间,不是设置时的定时时间。

用setitimer()和getitimer()测试ITIMER_REAL定时器:

    #include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<signal.h> int main(void)
{
struct itimerval setvalue,value;
setvalue.it_interval.tv_sec=1;
setvalue.it_interval.tv_usec=0;
setvalue.it_value.tv_sec=3;
setvalue.it_value.tv_usec=0;
setitimer(ITIMER_REAL,&setvalue,NULL); while(1)
{
getitimer(ITIMER_REAL,&value);
printf("ITIMER_REAL:interval:%ds%dms,remain:%ds%dms\n",
value.it_interval.tv_sec,value.it_interval.tv_usec,
value.it_value.tv_sec,value.it_value.tv_usec); sleep(1);
}
}

运行输出:

book@book-desktop:~/workspace/zongde/chapter10$ ./a.out
ITIMER_REAL:interval:3s0ms,remain:2s999998ms
ITIMER_REAL:interval:3s0ms,remain:1s997688ms
ITIMER_REAL:interval:3s0ms,remain:0s991571ms
Alarm clock

Linux 时间 与 定时器的更多相关文章

  1. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

  2. Linux时间子系统之五:低分辨率定时器的原理和实现

    专题文档汇总目录 Notes:低精度timer在内核中的数据结构以及API接口:低精度timer精巧高效的分组,使用cascade进行定时器移位,组内Timer FIFO:低精度Timer的初始化流程 ...

  3. Linux下的定时器:alarm()与setitimer()

    Linux下的定时器有两种,以下分别介绍: 1.alarm 如果不要求很精确的话,用alarm()和signal()就够了 unsigned int alarm(unsigned int second ...

  4. linux c语言定时器

    原文来自于:http://hi.baidu.com/opetrhsxszbckzd/item/126966cae5f9524aa9ba94f5 我只是把其重新排版标注一下. linux c语言定时器 ...

  5. Linux时间子系统专题汇总

    关于Linux时间子系统有两个系列文章讲的非常好,分别是WowoTech和DroidPhone. 还有两本书分别是介绍: Linux用户空间时间子系统<Linux/UNIX系统编程手册>的 ...

  6. Linux时间子系统之(三):用户空间接口函数

    专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...

  7. Linux时间子系统之(五):POSIX Clock

    专题文档汇总目录 Notes: 本章主要介绍了若干种类的静态时钟,这些时钟都可以通过k_clock表示,注册到posix_clocks中.这些都是静态时钟,可以分为三大类:各种REALTIME时钟.带 ...

  8. Linux时间子系统之(六):POSIX timer

    专题文档汇总目录 Notes:首先讲解了POSIX timer的标识(唯一识别).POSIX Timer的组织(管理POSIX Timer).内核中如何抽象POSIX Timer:然后分析了POSIX ...

  9. Linux时间子系统之(十七):ARM generic timer驱动代码分析

    专题文档汇总目录 Notes:ARM平台Clock/Timer架构:System counter.Timer以及两者之间关系:Per cpu timer通过CP15访问,System counter通 ...

  10. Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)

    在前面章节的讨论中,我们一直基于一个假设:Linux中的时钟事件都是由一个周期时钟提供,不管系统中的clock_event_device是工作于周期触发模式,还是工作于单触发模式,也不管定时器系统是工 ...

随机推荐

  1. ITIL一定要去认证吗?哪个版本合适

    关于ITIL的演进 ITIL是在演进发展中的,v1并不成功,v2 v3讲究流程与控制,其实都是偏向务虚,理论东西较多,能落地的少或许OGC的专家们自己也发现 光靠口头忽悠并不能说服最终用户接受ITIL ...

  2. 安装conda搭建python环境(保姆级教程)

    参考文档: 安装conda搭建python环境(保姆级教程)

  3. JS基础--JavaScript实例集锦(初学)

    1.子节点childNodes: <!DOCTYPE html> <html> <head> <title>childNodes</title&g ...

  4. PageOffice 在线编辑 office文件,回调父页面

    一.子页面调用父页面的方法 var value=window.external.CallParentFunc("ParentFunName(Arguments);");//父页面的 ...

  5. opensips开启lua支持

    操作系统 :CentOS 7.6_x64 opensips版本 :2.4.9 lua版本:5.1 今天整理下CentOS7环境下opensips2.4.9的lua模块笔记及使用示例,并提供运行效果截图 ...

  6. vue2.0,把vform666、workFlow开源组件集成到vue-admin-template框架上心得体会

    以上三个都是vue2版本的开源项目,有的已经有vue3版本了,我把他们集成到一起,是出于练习的目的,也是消磨时间. vue-admin-template是一个很基础简洁的后台管理系统框架:vform6 ...

  7. 对比使用IConfigurationSectionHandler和ConfigurationSection自定义节点和自定义处理程序

    使用自定义处理程序处理节点的好处我认为是,可以在业务代码中,不必再写一些读取配置文件的非业务代码了,只管取值.如果多处使用该配置节点,其优势更能体现出来.然后突然要增删配置,也只管改节点处理程序的代码 ...

  8. K-D Tree 总结

    Luogu题单 前置芝士 \(K-D\;Tree\) 例题略解 P2479 [SDOI2010]捉迷藏 大概就是 K-D Tree 的板子题了吧,网上的打法都不太友好,参考了 fengwu 的打法. ...

  9. MySQL学习笔记-多表查询(上)

    多表查询(上) 一. 多表关系 在实际应用中,根据需求,设计的表结构之间存在联系,联系一般分为以下三种 一对多(多对一) 多对多 一对一 1. 一对多(多对一) 案例:部门与员工的关系,一个部门对应多 ...

  10. idea 使用 mvn clean package 报错 Could not create local repository at

    使用 mac 版本的 idea 打包使用打包命令 mvn clean package 总是报错: [ERROR] Could not create local repository at /Repos ...