缘起:因为看到jimmy发了宇中同学”运筹帷幄的工作进度”,那我站在巨人的肩膀上,有必要学习一下有关运行任务的时间管理。
1基本概念
1.1 日历时间
Coordinated Universal Time(UTC):世界协调时间(又称世界标准时间),旧称格林威治标准时间(Greenwich Mean Time, GMT)。<br /> Calendar Time:日历时间,即从一个标准时间点到此时的时间所经过的秒数。该标准时间点因编译器而异,但对编译系统而言标准时间点不变。该编译系统中的时间对应的日历时间都通过该标准时间点衡量,故日历时间是“相对时间”。UNIX/Linux的时间系统由“新纪元时间(Epoch)”开始算起,该起点指定为1970年1月1日凌晨0时0分0秒(格林威治时间)。Microsoft C/C++ 7.0中标准时间点指定为1899年12月31日0时0分0秒,而其它版本的Microsoft C/C++和所有不同版本的Visual C++中标准时间点指定为1970年1月1日0时0分0秒。日历时间与时区无关。<br /> Epoch:时间点。时间点在标准C/C++中是一个整数(time_t),它用此刻的时间和标准时间点相差的秒数(即日历时间)来表示。目前大部分UNIX系统采用32位记录时间,正值表示为1970年以后,负值则表示1970年以前。可简单地估算出所能表达的时间范围:1970±((231-1)/3600/24/365)≈[1901,2038]年。为表示更久远的时间,某些编译器厂商引入64位甚至更长的整型数来保存日历时间。
1.2 进程时间
进程时间也称CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴嗒计算,通常使用三个进程时间值,即实际时间(Real)、用户CPU时间(User)和系统CPU时间(Sys)。<br /> 实际时间指实际流逝的时间;用户时间和系统时间指特定进程使用的CPU时间。具体区别如下:<br />Real是从进程开始执行到完成所经历的挂钟(wall clock)时间,包括其他进程使用的时间片(time slice)和本进程耗费在阻塞(如等待I/O操作完成)上的时间。该时间对应秒表(stopwatch)直接测量。<br />User是进程执行用户态代码(内核外)耗费的CPU时间,仅统计该进程执行时实际使用的CPU时间,而不计入其他进程使用的时间片和本进程阻塞的时间。<br />Sys是该进程在内核态运行所耗费的CPU时间,即内核执行系统调用所使用的CPU时间。<br /> CPU总时间(User+Sys)是CPU执行用户进程操作和内核(代表用户进程执行)系统调用所耗时间的总和,即该进程(包括其线程和子进程)所使用的实际CPU时间。若程序循环遍历数组,则增加用户CPU时间;若程序执行exec或fork等系统调用,则增加系统CPU时间。<br /> 在多核处理器机器上,若进程含有多个线程或通过fork调用创建子进程,则实际时间可能小于CPU总时间——因为不同线程或进程可并行执行,但其时间会计入主进程的CPU总时间。若程序在某段时间处于等待状态而并未执行,则实际时间可能大于CPU总时间。其数值关系总结如下:<br />Real < CPU,表明进程为计算密集型(CPU bound),利用多核处理器的并行执行优势;<br />Real ≈ CPU,表明进程为计算密集型(CPU bound),未并行执行;<br />Real > CPU,表明进程为I/O密集型(I/O bound),多核并行执行优势并不明显。<br /> 在单核处理器上,Real时间和CPU时间之差,即Real- (User + Sys)是所有延迟程序执行的因素的总和。可估算程序运行期间的CPU利用率为CpuUsage = (User + Sys)/ Real * 100(%)。<br /> 在SMP(对称多处理系统)上,该差值近似为Real* ProcessorNum - (User + Sys)。这些因素包括:<br />调入程序文本和数据的I/O操作;<br />获取程序实际使用内存的I/O操作;<br />由其它程序消耗的CPU用时;<br />由操作系统消耗的CPU用时。<br />计算机拥有系统时钟和硬件时钟。
1.3使用date和at。
at软件安装需要获得root 权限;目前还没有找到适合一般用户使用的软件。
date##查看当前时间date##输入at和后面用户所希望执行的作业的时间at 17:20##输入命令at> cp##Ctrl+D退出at shellCtrl+D##查看任务jobs##atq再次确认安排好了任务atq##要在执行之前删除命令atrm 1
1.4date和sleep
Linux sleep命令可以用来将目前动作延迟一段时间。
使用权限:所有使用者。
语法
sleep [—help] [—version] number[smhd]
参数说明:
- —help : 显示辅助讯息
- —version : 显示版本编号
- number : 时间长度,后面可接 s、m、h 或 d
- 其中 s 为秒,m 为 分钟,h 为小时,d 为日数
实例
休眠5分钟
显示目前时间后延迟 5秒钟,之后再次显示时间# sleep 5m
date;sleep 5s;date

$ cat > test.shecho "start sleep" `date`sleep 10secho "end sleep" `date`$ bash test.sh 1>test.log 2>&1 &$ cat test.log
2计时方式
2.1 time命令
可测量命令或脚本执行所耗时间及系统资源使用等信息,统计结果包含以下时间(以秒计):
实际执行时间(real time):从命令行执行到运行结束所消耗的时间;
用户CPU时间(user CPU time):命令在用户态中执行所消耗的CPU时间,即程序本身及其调用的库函数所使用的时间;
系统CPU时间(system CPU time):命令在内核态中执行所消耗的CPU时间,即由程序直接或间接调用的系统调用执行的时间。
Linux系统中,可使用Shell内置命令time,或GNU一般命令time(/usr/bin/time)来测试程序运行的时间。前者只负责计时,精度可达10毫秒;后者精度略低,但可访问getrusage系统调用的信息,并提供丰富的参数选项,包括指定输出文件等功能。
time命令不能用于测量程序内某个函数或某段代码的执行时间。
测量命令的执行时间,或者给出系统资源的使用情况。
Shell内置命令time的使用格式为time <command> [<arguments...>]$ timereal 0m0.000suser 0m0.000ssys 0m0.000s## eg:$ time lsbackup_bashrc miniconda3 project project-testsoft Rtest TNBC数据biosoft mvpiliang,txt project2 R server twohourdaydayup piliangscript project-nephro R-IgAN tnbc xbwkreal 0m0.005suser 0m0.000ssys 0m0.003s
(1) real:从进程 ls 开始执行到完成所耗费的 CPU 总时间。该时间包括 ls 进程执行时实际使用的 CPU 时间,ls 进程耗费在阻塞上的时间(如等待完成 I/O 操作)和其他进程所耗费的时间(Linux 是多进程系统,ls 在执行过程中,可能会有别的进程抢占 CPU)。
(2) user:进程 ls 执行用户态代码所耗费的 CPU 时间。该时间仅指 ls 进程执行时实际使用的 CPU 时间,而不包括其他进程所使用的时间和本进程阻塞的时间。
(3) sys:进程 ls 在内核态运行所耗费的 CPU 时间,即执行内核系统调用所耗费的 CPU 时间。
