- 浏览: 142993 次
文章分类
最新评论
任一进程都可使用 times 函数来获得它自己以及终止子进程的 3 个时间:墙上时钟时间、用户 CPU 时间和系统 CPU 时间。
注意,墙上时钟时间是作为返回值得到的,它是相对于过去某一时刻度量的。tms 结构中两个针对子进程的字段包含了此进程用 wait 函数族已等待到的各子进程的值。所有由此函数返回的 clock_t 值都用 _SC_CLK_TCK(由 sysconf 函数返回的每秒时钟滴答数)转换成秒数(多数实现还提供了 getrusage 函数,该函数返回由 CPU 时间以及指示资源使用情况的另外 14 个值)。
下列程序会对每个 shell 命令计时,并打印从 tms 结构取得的值。
运行结果:
前两个命令的执行时间足够快避免了以可报告的精度记录 CPU 时间,但第三个命令运行了一个处理时间足够长的程序来表面所有的 CPU 时间都出现在子进程中,而 shell 和命令正是在子进程中执行的。
#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 和命令正是在子进程中执行的。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1254在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1553伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 800多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 952终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 571尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 946虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 710tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 817终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 439终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 582在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 948在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 619在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 498消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 487有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 422FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 391管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 894readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 456POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 626记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 442UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
以下是对"易语言取进程时间"这一主题的详细解释: 一、取进程时间 取进程时间是指获取特定进程运行的时间,包括进程启动后到当前时刻的总时间,以及进程执行的用户模式时间和内核模式时间。在易语言中,这通常通过...
在"易语言源码易语言取进程时间源码.rar"这个压缩包中,我们主要探讨的是如何使用易语言来获取进程中运行的时间。 首先,我们要理解什么是进程时间。在计算机科学中,进程时间通常分为用户时间(User Time)和系统...
本项目“守护进程时间服务器C语言实现”旨在帮助初学者理解如何用C语言创建一个守护进程,并实现一个时间服务器功能。 守护进程在操作系统中扮演着重要的角色,它们在用户登录会话之外运行,为其他程序或系统服务...
在“易语言取进程时间源码.zip”这个压缩包中,包含的是一段使用易语言编写的代码,用于获取指定进程的运行时间。这段源码对于学习易语言以及理解进程管理相关的编程概念非常有帮助。 在计算机系统中,进程是程序的...
多个进程在处理器调度顺序,按时间片进行,属于操作系统进程时间片调度实习课程
四、进程时间的重要性 1. 性能分析:通过查看进程的启动时间和运行时间,可以判断哪些进程占用了大量CPU资源,有助于优化系统性能。 2. 故障排查:当系统出现异常时,查看进程的启动时间有助于定位问题是否由新启动...
时间片轮转调度算法是一种常见的进程调度策略,尤其适用于多用户环境,如分时系统。本文将深入探讨时间片轮转调度算法的概念、原理以及其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 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。 当然,一个进程也可以主动释放CPU的控制权。函数 schedule()是一个调度函数,它...
1. **进程时间统计**:Timercheck能够实时监测每个进程的启动时间以及持续运行的时间,这对于排查系统性能问题或监控特定程序运行时长非常有用。用户可以借此了解哪些进程占据了大量系统资源,从而采取相应措施优化...
4. **获取进程时间**:调用`GetProcessTimes`函数,传入之前获取的进程句柄,可以得到进程的创建时间、用户时间、系统时间和空闲时间。这些时间值是以文件时间格式表示的,需要进行转换才能以人类可读的形式展示。 ...
2. **监视进程时间**:监控进程运行时间有助于识别哪些进程运行时间过长,可能消耗了大量CPU时间。长时间运行的进程可能是性能瓶颈,也可能是潜在的问题源,例如死循环或者资源泄漏。 3. **运行状态**:进程的运行...
- 当前运行的进程时间片到或主动放弃CPU时,选择就绪队列中的下一个进程运行。 #### 实验详细实现过程与算法流程 实验的核心是通过C++语言实现上述功能。具体来说,使用了链表数据结构来维护不同状态的进程队列,...
4. 获取进程时间:使用`GetProcessTimes`函数,传入进程句柄,获取`FILETIME`结构体表示的进程运行时间。 5. 计算CPU占用率:将`FILETIME`结构体转换为100纳秒的时间戳,然后计算用户时间和系统时间之和,再除以...
- **轮转算法**:固定时间片,如每执行一次,进程时间片加2,剩余时间片减2,然后放到就绪队列尾部。 ### 5. 开发环境与技术参数 使用VC++6.0作为开发工具,用户可以指定进程的优先级、时间片和运行时间等参数。...