作者回复: 因为你在一台多核或者多cpu的机器上运行,seq和wc命令会分配到两个cpu上,user和sys是两个cpu时间相加的,而real只是现实时钟里走过的时间,极端情况下user+sys可以到达real的两倍
作者回复: 我知道原因了,这个的确是因为“并行原因”的运行的。虽然seq和wc这两个命令都是单线程运行的,但是这两个命令在多核cpu运行的情况下,会分别分配到两个不同的cpu,于是user和sys的时间都是两个cpu上运行的时间之和,就可能超过real的时间。你可以这样来快速验证
运行
time seq 100000000 | wc -l &
让这个命令多跑一会儿,并且在后台运行。
然后利用 top 命令看不同进程的cpu占用情况,你会在top的前几行里看到seq和wc的cpu占用都接近100,实际是各被分配到了一个不同的cpu执行。
我写文稿测试的时候开了一个1u的最小的虚拟机,只有一个cpu所以不会遇到这个问题。
作者回复: 👍
作者回复: changing同学你好,一般情况下,如果user+sys比real大,甚至光光user比real大的情况出现,都是因为对应的程序被多个进程或者多个线程并行执行了,也很常见。不过你遇到的这个问题的确有些奇怪,我要研究一下,因为linux下的seq和wc这些命令按照我的理解都是单线程运行的。
能告诉我你使用的硬件和操作系统么?
作者回复: 易儿易同学你好,这个问题提的得非常好,你学得和思考得都很仔细深入。1的理解更准确一点,我们为了理解简单可以暂且认为就是晶振在触发一条一条电路变化指令,就好像你拨算牌盘的节奏一样。算盘拨得快,珠算就算得快。结果就是一条简单的指令需要的事件就和一个时钟周期一样,实际这个问题要比这样一句话复杂很多。一方面,其实时钟周期应该是放下最复杂的一条指令的时间长度。我们是通过流水线来提升cpi的。我会在讲解cpu的部分更深入讲解始终信号和计数器,让大家能够理解cpu到底是怎么回事儿。
作者回复: 👍监测到跑分程序在运行进行超频或者过热也不降频是一种常见的作弊手段
作者回复: humor同学你好,如果我没理解错你的意思的话,你的理解是对的。CPU主频是一个频率(frequency),频率的单位叫做赫兹(Hz)。意思是一秒内这个事情可以发生多少次。主频2.8GHz就代表一秒内晶振振动了2.8G次,这里的G其实就是10亿次,也就是28亿次。那么我们的时钟周期时间就是1/28亿秒。
作者回复: 霹雳同学你好,
关于用户态运行和系统内核运行,如果要深入了解的话,可以去看看刘超老师的 《趣谈Linux操作系统》。
如果简单讲一下的话,就是我们的程序实际在操作系统里面是运行在“保护模式”下的,很多指令我们的应用程序并没有权限去操作执行,需要切换到内核态,由操作系统去执行,比如说操作硬件的时候。
作者回复: 谢谢支持😊
作者回复: 👍
作者回复: 秦晋同学,某种程度上来说,你理解反了。精简指令集意味着cpu从硬件或者电路层面支持的指令数比较少。这个意味着很多复杂的操作需要执行更多的指令而不是更少的。
执行效率这个问题更复杂一些,精简指令也许更容易提高频率或者利用流水线等等,只能说具体问题具体分析。现在更多地是出于一个“混合”的状态
作者回复: 潜默闻雨同学你好,这个理解没错。到了cpu层面只有一条条机器码的指令,它并不关心这个指令具体是从哪个程序里来的。
作者回复: 是的
作者回复: 彩色的沙漠同学你好,你的描述的确更加准确一些
作者回复: 👍说得八九不离十
作者回复: 我知道原因了,这个的确是因为“并行原因”的运行的。虽然seq和wc这两个命令都是单线程运行的,但是这两个命令在多核cpu运行的情况下,会分别分配到两个不同的cpu,于是user和sys的时间都是两个cpu上运行的时间之和,就可能超过real的时间。你可以这样来快速验证
运行
time seq 100000000 | wc -l &
让这个命令多跑一会儿,并且在后台运行。
然后利用 top 命令看不同进程的cpu占用情况,你会在top的前几行里看到seq和wc的cpu占用都接近100,实际是各被分配到了一个不同的cpu执行。
我写文稿测试的时候开了一个1u的最小的虚拟机,只有一个cpu所以不会遇到这个问题。
作者回复: 嗯,但是核心问题是按理一般seq和wc都不是并行运行的,我需要看一下是为什么
作者回复: 静静的拼搏你好,的确有这么干的,一监测到是运行跑分程序就超频或者控制即使过热了也不降频来进行运算以获得一个更高的分数
作者回复: 👍很快就学以致用了,可以想一想,跑分作弊在这三个里面哪个更现实?