📅  最后修改于: 2023-12-03 15:35:56.077000             🧑  作者: Mango
在操作系统中,进程与时间密不可分。进程需要对时间进行操作来达到不同的目的,而操作系统也提供了多种不同的时间,方便程序员进行操作。本文将会介绍与进程相关的OS各种时间。
系统时间是指当前操作系统所使用的时间。系统时间的变化是由时钟中断触发的,一般每秒钟发出一个时钟中断,更新一次系统时间。通过获取和设置系统时间,软件可以知道当前的具体时间,也可以设置延迟、超时等等。在UNIX系统下,系统时间被存放在time_t类型的变量中,存储机制是自1970年1月1日0时0分0秒以来经过的秒数。
获取系统时间的函数为time(),其原型为:
#include <time.h>
time_t time(time_t *tloc);
函数返回自1970年1月1日以来经过的秒数。如果传入非空指针,则将值存放在指针指向的变量中。
进程时间是指一个进程所花费的时间。通常有两种类型的进程时间:用户时间和系统时间。
用户时间是指进程在用户态下所花费的时间,也就是进程在执行自己的代码过程中所用的时间。
系统时间是指进程在内核态下所花费的时间,也就是进程执行系统调用和内核代码所用的时间。
一般地,获取进程时间使用的函数是clock()和gettimeofday()两个函数。
clock()函数返回的是自进程运行以来所花费的CPU时间,单位是时钟周期。在UNIX系统中,时钟周期的长度是由宏变量CLK_TCK表示的。CLK_TCK表示每秒钟时钟中断的次数,可以通过sysconf()函数或者<unistd.h>头文件中的_SC_CLK_TCK常量获取。
clock()函数的原型为:
#include <time.h>
clock_t clock(void);
函数返回自进程开始运行以来所用的时钟周期数。用时钟周期数除以CLK_TCK就可以得到CPU时间。
gettimeofday()函数可以获取墙上时间。函数的原型为:
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
函数将当前时间的秒数和微秒数存储在timeval结构体中。需要注意的是,gettimeofday()函数返回的秒数是指自1970年1月1日0时0分0秒到当前时间所经过的秒数。
系统负载指的是一段时间内系统处于可运行状态和不可中断状态的平均进程数。可以通过查看/proc/loadavg文件来获取当前的系统负载。
/proc/loadavg文件的内容格式为:
$ cat /proc/loadavg
0.00 0.00 0.00 1/66 7603
其中,前三个数字分别表示在过去1分钟、5分钟和15分钟内的平均进程数,后面的1/66表示可运行进程数和总进程数。
在操作系统中,时间是一个非常重要的概念。我们通过本文的介绍,了解了系统时间、进程时间和系统负载等与进程相关的OS各种时间,可以更加方便地进行编程。