欢迎访问小站,阅读此文http://www.yandong.org/archives/501

简介

墙上时间,也就是距离1970年1月1日的时间,在linux kernel内部没多大用处,对其的应用多在用户空间。

本文的目的在于在kernel里面计算得到 进程创建的墙上时间

计算公式

xtime.tv_sec-(jiffies/HZ)+300+p->real_start_time.tv_sec

意思就是,当前的墙上时间(xtime) 减去系统启动后的节拍(jiffies)/频率(HZ)   这样得到的是系统启动的墙上时间,即距离1970.1.1的秒数,然后再加上进程结构体中 保存的距离系统启动时间的秒数(p->real_start_time.tv_sec)。

下面分别解释:

task_struct中的时间

p->real_start_time.tv_sec

其中的p是task_struct指针,指向的是进程创建距离系统启动的时间.

task_struct中有两个时间:start_time 和 real_start_time,其中后者包含睡眠时间。

下面是进程创建的部分源码

do_posix_clock_monotonic_gettime(&p->start_time);p->real_start_time=p->start_time;monotonic_to_bootbased(&p->real_start_time);//真实启动时间还须要加上总的睡眠时间

xtime介绍

摘自《深入理解linux内核》

所有的PC都包含一个叫实时时钟(Renl Time Clock RTC)的时钟,它是独立于CPU和所有其他芯片的。

即使当PC呗切断电源,RTC还继续工作,因为它靠一个小电池或蓄电池供电。CMOS RAM和RTC被集成在一个芯片上。

Linux只用RTC来获取时间和日期。不过对/dev/rtc设备文件操作,也允许对RTC编程。

内核利用 get_cmos_time函数从实时时钟上读取字1970.1.1(UTC)午夜以来经过的秒数。

xtime_lock顺序所(seqlock)消除了对xtime变量同时访问而可能发生的竞争条件,

对于2.6内核,其定义为(/include/linux/time.h)

externstructtimespec xtime;

对于3.5内核,其定义为(kernel/time/timekeeping.c)

structtimekeeper{...structtimespec xtime;...};staticstructtimekeeper timekeeper;

xtime的获取

因为很难原子的访问结构体中的两个变量,所以kernel并不鼓励直接访问xtime变量,可以使用相关函数

//include/linux/time.hstructtimespec current_kernel_time(void);externvoiddo_gettimeofday(structtimeval*tv);

所以如果在module里面直接使用 xtime,是不行的。但是可以通过硬编码的方式获取

比如:

long*xtime_ptr=&xtime;或者long*xtimr_ptr=0xc0803980

其中的 0xc0803980这个值,是从System.map中获得的,xtime是个全局符号,所有从sytem.map中可以获得它的地址

root@hyd:/home/l# cat /boot/System.map-2.6 | grep xtimec0156230 T update_xtime_cache

c06e3c00 D xtime_lock

c072f654 D inet_peer_gc_maxtime

c0803980 B xtime

c08039a0 b xtime_cache

jiffies介绍

简介

全局变量jiffies用来记录自系统启动以来产生的节拍的总数。

它被用来记录系统自开机以来,已经过了多少tick。每发生一次timer interrupt,Jiffies变数会被加一。

启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。

因为一秒内时钟中断的次数等于Hz,所以jiffes一秒内增加的值也就为Hz,系统运行时间以秒为单位计算,就等于jiffes/Hz。

定义

externu64 __jiffy_data jiffies_64;externunsignedlongvolatile__jiffy_data jiffies;

其中,jiffies_64 和 jiffies 的低32位是重合的,因为32为的jiffies 最多50天就溢出了,而jiffies_64则不用关注溢出问题。

初始化

#define INITIAL_JIFFIES((unsignedlong)(unsignedint)(-300*HZ))jiffies=INITIAL_JIFFIES

可以看出 jiffies 被初始化为5分钟后溢出的一个值,这是为了方便内核调试,以便故障早点出来。

获取

由于jiffies_64 是一个符合变量,不能直接获取,需要下面的使用辅助函数

#if(BITS_PER_LONG<64)u64 get_jiffies_64(void);#elsestaticinline u64 get_jiffies_64(void){return(u64)jiffies;}#endif

当然也可以使用硬编码的方式使用  jiffies

root@hy:/home/#cat/boot/System.map|grep"D jiffies"c06e3b00 D jiffies

c06e3b00 D jiffies_64

从中也可以看到 jiffies 与 jiffies_64的地址是相同的

使用

由于jiffies在五分钟之后,便溢出,所以使用jiffies的原则如下

//如果jiffies变量类型是32位无符号intmax_count=0xffffffffor

max_count=0xffffffffffffffff(64-bit)//如果没有溢出,系统启动后运行的节拍数:jiffies-ITIAL_JIFFIES//系统启动来5分钟的节拍数就是(到jiffies溢出的前一拍):max_count-INITIAL_JIFFIES

在我的代码中,我是这样使用的

unsigendlongjiffies_test=jiffies+HZ;if(time_after(jiffies,jiffies_test)){jiffies=MAX_JIFFIES-jiffies;}else{jiffies=jiffies-INITIAL_JIFFIES;}

其中的 time_after 是内核提供的四个比较函数之一

#definetime_after(a,b)\(typecheck(unsignedlong,a)&&\

typecheck(unsignedlong,b)&&\((long)(b)-(long)(a)<0))#definetime_before(a,b)time_after(b,a)#definetime_after_eq(a,b)\(typecheck(unsignedlong,a)&&\

typecheck(unsignedlong,b)&&\((long)(a)-(long)(b)>=0))#definetime_before_eq(a,b)time_after_eq(b,a)

为什么time_after能判断溢出呢?

待续,或者 参考下面链接

链接

http://book.51cto.com/art/200810/93773.htm

http://blog.csdn.net/michaelcao1980/article/details/7826326

http://lxr.oss.org.cn/source/include/linux/jiffies.h?v=2.6.30#L167

http://blog.csdn.net/chchchdx123/article/details/6270022

http://linux.gongxiang8.com/456430/

如果您喜欢这篇文章,欢迎分享订阅。本文内容遵CC版权协议 转载请注明出处www.yandong.org

linux进程创建时间,linux进程创建时间计算相关推荐

  1. 【Linux 内核】进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 )

    文章目录 一.Linux 中进程的 CPU 资源调度 二.进程生命周期 三.进程生命周期之间的转换 一.Linux 中进程的 CPU 资源调度 Linux 操作系统 是 多任务系统 , 可以 同时运行 ...

  2. Linux下C语言编程-进程的创建

    Linux下C语言编程-进程的创建 作者:hoyt 1.进程的概念 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢?在现代的操作 ...

  3. Linux系统编程之--守护进程的创建和详解【转】

    本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...

  4. linux 创建精灵进程,linux 进程通信之 守护进程

    守护进程(Daemon) Daemon(精灵)进程,是linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的时间.一般采用以d结尾的名字.从下面的进程信息可以看出, ...

  5. 总结-linux初识进程(包括cpu调度、进程创建、僵尸进程(重点)、环境变量)

    冯诺依曼体系结构--现代计算机的硬件体系结构 输入设备.输出设备(数据输出).存储器(数据缓冲).运算器(数据运算).控制器. 所有设备都是围绕存储器工作---CPU是从存储器中获取数据处理---控制 ...

  6. Linux内核分析——进程的描述和进程的创建

    进程的描述和进程的创建 一. 进程的描述 (一)进程控制块PCB--task_struct 1.操作系统的三大管理功能包括: (1)进程管理 (2)内存管理 (3)文件系统 2.PCB task_st ...

  7. linux ps查看完整时间,Linux ps 命令查看进程启动及运行时间

    引言 同事问我怎样看一个进程的启动时间和运行时间,我第一反应当然是说用 ps 命令啦. ps aux或ps -ef不就可以看时间吗? ps aux选项及输出说明 我们来重新复习下ps aux的选项,这 ...

  8. 【Linux编程】守护进程(daemon)详解与创建

    本文主要参考自:linux系统编程之进程(八):守护进程详解及创建,daemon()使用 一.概述 Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处 ...

  9. linux进程时钟时间,Linux的时钟

    Linux的时钟 作者:linuxer 发布于:2017-5-17 18:55 分类:时间子系统 一.前言 时钟或者钟表(clock)是一种计时工具,每个人都至少有一块,可能在你的手机里,也可能佩戴在 ...

  10. linux进程通信核心态时间,Linux进程管理简谈

    Linux系统进程管理简谈 进程是什么? 进程是对处理器.主存和I/O设备的抽象表示. 进程是操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件 ...

最新文章

  1. CImg库的一个简单例子
  2. shell命令之---Linux文件权限
  3. R语言可视化分面图、假设检验分组t检验、可视化单变量分组分面箱图(faceting bar plot)、添加误差条(error bar)、添加p值、添加抖动数据点(jitter points)
  4. 深度 | 周明:自然语言处理的未来之路 | CCF-GAIR 2019
  5. SpringCloud采坑之Feign服务间调用默认返回xml
  6. 用Java编写第一个区块链(二)
  7. Purchase Order Text
  8. 23种设计模式C++源码与UML实现--建造者模式
  9. java 简单事件的使用,如何正确的使用Java事件通知(1)
  10. Hadoop入门进阶步步高(六-Hadoop1.x与Hadoop2的区别
  11. 转载:洛克菲勒家族参与投资土豆网
  12. [裴礼文数学分析中的典型问题与方法习题参考解答]4.4.9
  13. 利用在线PS将一张图片上的中文改写成英文
  14. 最易难学习的编程语言榜单出炉,C++最难学?
  15. 11. 文件操作与模块
  16. EventBus实现原理
  17. 利用ArcGIS创建要素与表之间的关系类并发布带有关系数据表的要素服务
  18. php 读取解析excel文件内容,怎么用PHP读取Excel文件信息及内容?(图文+视频教程)...
  19. Python 爬取煎蛋妹子图
  20. 阿里云服务器4核8G配置CPU性能报价表

热门文章

  1. log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). log4j:WARN
  2. 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...
  3. java 字符串是否包含字符串_在Java中,如何检查字符串是否包含子字符串(忽略大小写)?...
  4. mysql 复制方式_MySQL复制方法
  5. Win7系统网页视频无法播放怎么办
  6. Win11任务栏图标重叠怎么办 Win11任务栏图标重叠的解决方法
  7. Win7系统还原声音图标的方法
  8. 利用dos进入mysql数据库操作数据
  9. 如何根据进程号去查端口号?
  10. MySQL常见面试题与答案