`

linux中的两个time

 
阅读更多
  今天发现linux中还有两个time指令,小结下:

在linux中存在两个time,一个是bash的命令,另外一个是程序/usr/bin/time,bash的time命令只能很简单的显示程序执行的时间,而/usr/bin/time程序可以显示很详细的与IO相关的数据,比如从内存中读取了多少数据,从磁盘中读取了多少数据之类的,以及文件系统的页大小。
通过type命令我们可以看到Linux中的两个time
oracle@linux[]:~
$type -a time
time is a shell keyword
time is /usr/bin/time
bash中的time示例
oracle@linux[]:~
$time echo test
test

real    0m0.000s
user    0m0.000s
sys     0m0.000s
bash中的time命令只能显示你程序的执行时间,包括实际执行时间,用户时间和系统时间,除此之外没有其他的信息。
而time程序就不一样了,它可以提供很详尽的信息,而且还能够定制time程序的输出结果,具体的可以通过man time查看,这里仅仅列举下time -v参数下的数据显示。
oracle@linux[]:~
$/usr/bin/time -v echo test
test
        Command being timed: "echo test"
        User time (seconds): 0.00
        System time (seconds): 0.00
        Percent of CPU this job got: 0%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.01
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 113
        Minor (reclaiming a frame) page faults: 16
        Voluntary context switches: 0
        Involuntary context switches: 0
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
从上面的输出结果我们可以看到,除了CPU时间之外,通常我们还关心下面几个:
Major (requiring I/O) page faults
从磁盘中读取了多少页的数据。
Minor (reclaiming a frame) page faults
从操作系统缓存中读取了多少页的数据。
Swaps
进程被swap出内存的次数。
File system inputs/outputs
从文件系统中读取/写入的数据数量。
Page size (bytes)
操作系统的页大小。

--------------------------------------
  关于time中的三态的补充讲解:

核心态(Kernel Mode):

在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。


用户态(User Mode):

在用户态,代码不具备直接访问硬件或者访问内存的能力,而必须借助操作系统提供的可靠的,底层的APIs来访问硬件或者内存。由于这种隔离带来的保护作用,用户态的代码崩溃(Crash),系统是可以恢复的。我们大多数的代码都是运行在用户态的。


我们来看看这三个的关系,这三者之间没有严格的关系,常见的误区有:

误区一: real_time = user_time + sys_time

我们错误的理解为,real time 就等于 user time + sys time,这是不对的,real time是时钟走过的时间,user time 是程序在用户态的cpu时间,sys time 为程序在核心态的cpu时间。

利用这三者,我们可以计算程序运行期间的cpu利用率如下:

%cpu_usage = (user_time + sys_time)/real_time * 100%

如:

# time sleep 2

real 0m2.003s

user 0m0.000s

sys 0m0.000s

cpu利用率为0,因为本身就是这样的,sleep 了2秒,时钟走过了2秒,但是cpu时间都为0,所以利用率为0

误区二:real_time > user_time + sys_time

一般来说,上面是成立的,上面的情况在单cpu的情况下,往往都是对的。

但是在多核cpu情况下,而且代码写的确实很漂亮,能把多核cpu都利用起来,那么这时候上面的关系就不成立了,例如可能出现下面的情况,请不要惊奇。

real 1m47.363s

user 2m41.318s

sys 0m4.013s


-----------------------------------------


分享到:
评论

相关推荐

    linux下的time

    该函数接收两个参数,第一个参数`tv`是一个指向`struct timeval`结构体的指针,用于存储秒和微妙级别的当前时间;第二个参数`tz`是一个指向`struct timezone`结构体的指针,用于存储时区信息。 `struct timeval`和`...

    减少Linux服务器过多的TIME_WAIT

    这是因为TCP设计者考虑到两个重要的因素: 1. **防止旧连接的重复数据包**:2MSL的时间足以让任何在旧连接中可能丢失并重新路由的包在网络中消失,避免这些旧包对新连接产生影响。 2. **保证TCP连接的可靠关闭**:...

    linux-time.rar_Time

    - **struct timespec**:包含秒和纳秒两个字段,提供更高的精度。 - **struct timeval**:与struct timespec类似,但精度稍低,包含秒和微秒。 3. **内核时间API** - **gettimeofday()**:获取当前时间,返回...

    linux中的时间函数

    - **作用**:计算两个 `time_t` 类型的时间值之间的时间间隔,返回一个 `double` 类型的值,表示时间差(以秒为单位)。 - **示例**: ```c #include <time.h> #include int main() { time_t start_time, end_...

    Linux下的石头剪刀布游戏

    在这个游戏中,我们可以创建两个进程:一个是玩家进程,另一个是计算机进程。玩家进程负责接收用户的输入,而计算机进程则生成随机的石头、剪刀或布选项。 创建进程在Linux中通常通过`fork()`系统调用来完成。`fork...

    在Linux下实现3个并发进程的誊抄

    - **`transport()`**: 负责在两个队列之间传输数据。 - 从第一个队列读取数据。 - 将数据写入第二个队列。 #### 5. 锁与互斥 - **互斥锁**: - `sem_wait(&mutex)`: 获取互斥锁,确保在同一时间只有一个线程能够...

    【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇 - slv

    【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法,这是一个关于网络编程和Linux系统配置的问题。在TCP/IP通信中,TIME_WAIT状态是TCP连接生命周期的一部分,用于确保...

    Linux CCTV

    8. **网络协议**:RTSP(Real-Time Streaming Protocol)和ONVIF(Open Network Video Interface Forum)是两个常见的CCTV领域协议,用于设备间的通信和互操作性。 9. **自动化脚本**:Linux的shell脚本可以用于...

    Linux系统中守护进程的创建方法.pdf

    守护进程与 Windows 中的后台服务程序比较类似,如 Windows 中有一种 time 系统服务,用来从远程主机获得日期和时间,Linux 中也有类似 的两个守护进程 time 和 time-udp,分别采用 TCP 和 UDP 协议从远程主机获得...

    论文《Linux for High Performance and Real-Time Computing on SMP system.pdf》

    文档最后提供了针对Adeos和ARTiS的性能测量结果,这些数据展示了在Linux操作系统上运行实时和高性能计算任务时,这两个组件的贡献和优势。通过对比不同场景下的执行时间、CPU利用率和任务调度效率,研究者们证明了在...

    Linux学习 - 命令运行监测和软件安装

    在 Linux 中,命令运行监测和软件安装是两个非常重要的概念。命令运行监测是指监测当前命令的运行时间和资源使用情况,而软件安装则是指在 Linux 系统中安装新的软件包。 命令运行监测 在 Linux 中,time 命令可以...

    rtlinux-3.2.zip

    在你提供的压缩包"rtlinux-3.2.zip"中,包含了两个重要的子文件,即"rtlinux-3.2-rc1.tar.bz2"和"rtlinux-3.2-pre3.tar.bz2"。这两个文件分别是RTLinux 3.2版本的候选发布1(Release Candidate 1,简称RC1)和预发布...

    zynq linux watchdog配置

    首先,需要在ZYNQ平台的Linux内核中启用Watchdog支持。这一步骤是通过内核配置菜单完成的。 1. **打开内核配置菜单**:运行`make menuconfig`进入内核配置界面。 2. **选择Watchdog配置**:在内核配置界面中找到并...

    Linux系统中账号管理最重要的两个文件:/etc/passwd和/etc/shadow

    在Linux系统中,用户管理和权限控制是至关重要的部分,而这一切的核心都离不开两个文件:`/etc/passwd` 和 `/etc/shadow`。这两个文件对于系统的正常运行至关重要,没有它们,几乎无法进行用户登录或执行与账户相关...

    linux中locale自用总结

    Linux 中 locale 自用总结 locale 是根据计算机用户所使用...locale 和字符集是 Linux 中的两个重要概念,它们都是软件运行时语言环境的组成部分。理解 locale 和字符集对于 Linux 的软件开发和系统管理是非常重要的。

    Linux中java log输出中文乱码.docx

    在 Linux 系统中,locale 设置分为两种:系统级别和用户级别。系统级别的 locale 设置影响整个系统,而用户级别的 locale 设置只影响当前用户。用户级别的 locale 设置可以通过在用户的家目录下创建一个名为 .bashrc...

    两个linux按键驱动之二 read(定时器去抖动)

    根据提供的文件信息,本文将对Linux按键驱动中的定时器去抖动机制进行深入解析,并结合具体代码示例来探讨其实现细节。 ### Linux按键驱动概述 在Linux内核中,按键驱动程序通常用于处理硬件上的按钮事件。这些...

    TIME服务的TCP实现

    在Linux系统中,TIME服务通常基于TCP协议实现,这允许两个系统之间可靠地传输时间信息。本文将深入探讨TIME服务的TCP实现,重点关注其在Linux环境下的工作原理、源码分析及其实现过程。 1. **TIME服务概述** TIME...

    CentOS解决服务器存在大量time_wait的问题

    1. `net.ipv4.tcp_syn_retries` 和 `net.ipv4.tcp_synack_retries`:这两个参数设置SYN连接请求的重试次数,减少等待时间,避免长时间占用连接资源。 2. `net.ipv4.tcp_keepalive_time`:设置TCP保持活动的时间间隔...

Global site tag (gtag.js) - Google Analytics