`
阅读更多
    任一进程都可使用 times 函数来获得它自己以及终止子进程的 3 个时间:墙上时钟时间、用户 CPU 时间和系统 CPU 时间。
#include <sys/times.h>
clock_t times(struct tms *buf);
   /* 返回值:若成功,返回流逝的墙上时钟时间(以时钟滴答数为单位);否则,返回 -1 */

struct tms{
    clock_t  tms_utime;      // user CPU time
    clock_t  tms_stime;      // system CPU time
    clock_t  tms_cutime;     // user CPU time, terminated children
    clock_t  tms_cstime;     // system CPU time, terminated children
};

    注意,墙上时钟时间是作为返回值得到的,它是相对于过去某一时刻度量的。tms 结构中两个针对子进程的字段包含了此进程用 wait 函数族已等待到的各子进程的值。所有由此函数返回的 clock_t 值都用 _SC_CLK_TCK(由 sysconf 函数返回的每秒时钟滴答数)转换成秒数(多数实现还提供了 getrusage 函数,该函数返回由 CPU 时间以及指示资源使用情况的另外 14 个值)。
    下列程序会对每个 shell 命令计时,并打印从 tms 结构取得的值。
#include <stdlib.h>
#include <stdio.h>
#include <sys/times.h>

static void pr_times(clock_t, struct tms *, struct tms *);
static void do_cmd(char *);

int main(int argc, char *argv[]){
	int	i;

	setbuf(stdout, NULL);
	for(i=1; i<argc; i++)
		do_cmd(argv[i]);
	exit(0);
}

static void do_cmd(char *cmd){
	struct tms	tmsstart, tmsend;
	clock_t		start, end;
	int		status;

	printf("\ncommand: %s\n", cmd);
	if((start=times(&tmsstart)) == -1)
		printf("times 1 error\n");
	if((status=system(cmd)) < 0)
		printf("system error\n");
	if((end=times(&tmsend)) == -1)
		printf("times 2 error\n");

	pr_times(end-start, &tmsstart, &tmsend);
}

static void
pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend){
	static long		clktck = 0;

	if(clktck == 0)
		if((clktck=sysconf(_SC_CLK_TCK)) < 0)
			printf("sysconf error\n");
	printf(" real: %7.2f\n", real/(double)clktck);
	printf(" user: %7.2f\n",
		(tmsend->tms_utime - tmsstart->tms_utime)/(double)clktck);
	printf(" sys: %7.2f\n",
		(tmsend->tms_stime - tmsstart->tms_stime)/(double)clktck);
	printf(" child user: %7.2f\n",
		(tmsend->tms_cutime - tmsstart->tms_cutime)/(double)clktck);
	printf(" child sys: %7.2f\n",
		(tmsend->tms_cstime - tmsstart->tms_cstime)/(double)clktck);
}

    运行结果:
$ ./timesDemo.out "sleep 5" "date>/dev/null" "man bash>/dev/null"

command: sleep 5
 real:    5.01
 user:    0.00
 sys:    0.00
 child user:    0.00
 child sys:    0.00

command: date>/dev/null
 real:    0.00
 user:    0.00
 sys:    0.00
 child user:    0.00
 child sys:    0.00

command: man bash>/dev/null
 real:    0.28
 user:    0.00
 sys:    0.00
 child user:    0.23
 child sys:    0.02

    前两个命令的执行时间足够快避免了以可报告的精度记录 CPU 时间,但第三个命令运行了一个处理时间足够长的程序来表面所有的 CPU 时间都出现在子进程中,而 shell 和命令正是在子进程中执行的。
分享到:
评论

相关推荐

    易语言取进程时间

    以下是对"易语言取进程时间"这一主题的详细解释: 一、取进程时间 取进程时间是指获取特定进程运行的时间,包括进程启动后到当前时刻的总时间,以及进程执行的用户模式时间和内核模式时间。在易语言中,这通常通过...

    易语言源码易语言取进程时间源码.rar

    在"易语言源码易语言取进程时间源码.rar"这个压缩包中,我们主要探讨的是如何使用易语言来获取进程中运行的时间。 首先,我们要理解什么是进程时间。在计算机科学中,进程时间通常分为用户时间(User Time)和系统...

    守护进程时间服务器C语言实现.rar

    本项目“守护进程时间服务器C语言实现”旨在帮助初学者理解如何用C语言创建一个守护进程,并实现一个时间服务器功能。 守护进程在操作系统中扮演着重要的角色,它们在用户登录会话之外运行,为其他程序或系统服务...

    易语言取进程时间源码.zip

    在“易语言取进程时间源码.zip”这个压缩包中,包含的是一段使用易语言编写的代码,用于获取指定进程的运行时间。这段源码对于学习易语言以及理解进程管理相关的编程概念非常有帮助。 在计算机系统中,进程是程序的...

    操作系统 进程时间片调度

    多个进程在处理器调度顺序,按时间片进行,属于操作系统进程时间片调度实习课程

    windows查看进程启动时间以及累计运行时间_Windows进程

    四、进程时间的重要性 1. 性能分析:通过查看进程的启动时间和运行时间,可以判断哪些进程占用了大量CPU资源,有助于优化系统性能。 2. 故障排查:当系统出现异常时,查看进程的启动时间有助于定位问题是否由新启动...

    进程调度 时间片轮转调度算法源代码(C语言)

    时间片轮转调度算法是一种常见的进程调度策略,尤其适用于多用户环境,如分时系统。本文将深入探讨时间片轮转调度算法的概念、原理以及其C语言实现的关键点。 时间片轮转调度算法的基本思想是将所有的就绪进程放入...

    操作系统(基本操作、轮换调度)完整代码

    /*进程时间轮转时间片*/ int cputime; /*进程占用CPU时间*/ int needtime; /*进程到完成还要的时间*/ int count; /*计数器*/ char state; /*进程的状态*/ struct node *next; /*链指针*/ }PCB; PCB *finish,*...

    时间片轮转法及优先数优先算法的进程调度管理程序

    时间片轮转法是一种简单的进程调度算法,在这种算法中,每个进程被分配一个固定的时间片(通常称为时间量子或时间间隔),在该时间内,只要进程没有主动放弃CPU(例如通过系统调用请求I/O操作),它将一直运行。...

    易语言取进程启动时间源码

    Windows API提供了丰富的函数来操作和查询进程信息,比如`CreateToolhelp32Snapshot`、`Process32First`和`Process32Next`等用于遍历进程,以及`GetProcessTimes`用于获取进程时间。 以下是一个简单的易语言源码...

    基于时间片的进程调度程序

    时间片轮转调度算法是一种常见的进程调度策略,它将处理器的时间划分为一个个小的时间段,称为时间片。每个时间片内,操作系统会为一个进程分配处理器,执行其指令。当时间片用完后,进程会被挂起,转而执行下一个...

    进程调度源代码

    - `round`:进程时间轮转时间片,适用于时间片轮转调度算法。 - `cputime`:进程占用CPU的时间。 - `needtime`:进程到完成还需要的时间。 - `count`:计数器,可能用于记录时间片消耗。 - `state`:进程的状态,如'...

    Linux进程的睡眠和唤醒

    一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。 当然,一个进程也可以主动释放CPU的控制权。函数 schedule()是一个调度函数,它...

    Timercheck时间进程管理软件

    1. **进程时间统计**:Timercheck能够实时监测每个进程的启动时间以及持续运行的时间,这对于排查系统性能问题或监控特定程序运行时长非常有用。用户可以借此了解哪些进程占据了大量系统资源,从而采取相应措施优化...

    易语言取进程创建时间源码.zip

    4. **获取进程时间**:调用`GetProcessTimes`函数,传入之前获取的进程句柄,可以得到进程的创建时间、用户时间、系统时间和空闲时间。这些时间值是以文件时间格式表示的,需要进行转换才能以人类可读的形式展示。 ...

    监视进程的时间,运行状态等信息的程序

    2. **监视进程时间**:监控进程运行时间有助于识别哪些进程运行时间过长,可能消耗了大量CPU时间。长时间运行的进程可能是性能瓶颈,也可能是潜在的问题源,例如死循环或者资源泄漏。 3. **运行状态**:进程的运行...

    进程PCB队列的组织、管理(以及进程调度)模拟实验

    - 当前运行的进程时间片到或主动放弃CPU时,选择就绪队列中的下一个进程运行。 #### 实验详细实现过程与算法流程 实验的核心是通过C++语言实现上述功能。具体来说,使用了链表数据结构来维护不同状态的进程队列,...

    取指定进程CPU占用率.rar

    4. 获取进程时间:使用`GetProcessTimes`函数,传入进程句柄,获取`FILETIME`结构体表示的进程运行时间。 5. 计算CPU占用率:将`FILETIME`结构体转换为100纳秒的时间戳,然后计算用户时间和系统时间之和,再除以...

    可抢占的优先进程调度算法

    - **轮转算法**:固定时间片,如每执行一次,进程时间片加2,剩余时间片减2,然后放到就绪队列尾部。 ### 5. 开发环境与技术参数 使用VC++6.0作为开发工具,用户可以指定进程的优先级、时间片和运行时间等参数。...

Global site tag (gtag.js) - Google Analytics