0

我正在尝试了解有关 Linux 中进程的一些事情,并且我有一些问题希望您能为我解答。

我做了这个小程序来看看它是如何工作的:

#!/bin/bash
count=1
while [ true ]
do
  echo "Counter $count "
  count=$(( $count + 1 ))
done

只是一个无限循环

现在,当我执行程序并top在 shell 中使用命令时,该进程是消耗更多 CPU 资源的进程:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND   
4037 lola    20   0  16880 1248 1028 R   80  0.0   0:33.42 memoryleak.sh  

我让程序运行了一段时间,但是从来没有超过85%的CPU消耗,这是为什么呢?我猜这是 OP 的卫生机制,但是,如果是真的,这是要决定的参数。更重要的是,计数器仍在工作,而且,就我所见,仍然可以无限工作。为什么 CPU 密集型程序不会使 CPU 崩溃?

现在,如果我中断该过程 - 发送一个STOP信号 - 并做一个ps aux我得到:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
lola       3896 24.4  0.0  16880  1248 pts/3    T    09:15   0:37 /bin/bash ./cpukilla.sh

为什么进程停止后,CPU消耗还是24%?不应该是零吗?

任何援助将不胜感激。

编辑:好吧,对不起内存泄漏术语的“混乱”。无论如何,从技术上讲,这不会是内存泄漏,因为计数会消耗大量内存而不释放它?

4

3 回答 3

2

如果它从未超过 CPU 的 85%,那是因为操作系统有其他东西在调用它的资源。许多进程在多任务系统上运行,操作系统的工作就是让它们都运行良好。

事实上,在 Linux 下(对于一个),如果你的进程一直使用它的整个时间片(即不提前让出),它的优先级将被降级为“惩罚”。

CPU 密集型程序不会仅仅因为操作系统知道如何保护自己免受此类恶作剧而使操作系统崩溃:-)

至于 24% 的数字,我不确定。可能这个数字是基于程序生命周期而不是最后几秒,在这种情况下它会逐渐减少(ps -aux相隔十秒的一系列陈述将证实或破坏该理论,前者如果不断减少,后者如果它又跳起来了)。

手册页没有详细说明%cpu实际代表的内容,但确实说:

CPU 使用率目前表示为在进程的整个生命周期中运行所花费的时间百分比。这并不理想,并且不符合 ps 在其他方面符合的标准。CPU 使用率加起来不太可能达到 100%。

可以被解读为在一段时间内(例如,最后五分钟)而不是瞬时(最后一秒)计算的数字。

于 2012-04-09T14:16:57.870 回答
0

首先,这根本不会导致内存泄漏。也许您将“内存泄漏”误认为是另一个概念。内存泄漏是指您分配内存但未能释放它。在这里,您没有直接分配任何内存。

  1. 内核为每个进程保留时间,所以没有人会“饿死”,特别是为自己,所以它可以很好地安排一切(顺便说一句,这样的脚本会导致 Windows 98 崩溃,例如,多任务处理的实现很差)。
  2. 为什么CPU会崩溃?这个问题没有意义。它会无限工作,是的。
  3. 它没有运行(感谢 geekosaur)
于 2012-04-09T14:15:16.400 回答
0

通常,内存泄漏是指将一块内存分配给程序的情况,并且(通常由于编程错误),当程序完成时,该内存永远不会被释放。实际上,这里的 bash 脚本没有内存泄漏。

操作系统将阻止进程 100% 控制 CPU。Linux 是一个抢占式多任务系统;它永远不会放弃对 CPU 的控制。调度程序确保所有需要 CPU 时间片的进程都获得一个。以下是有关 Linux 调度程序的更多信息:http: //www.ibm.com/developerworks/linux/library/l-scheduler/

发送 STOP 信号不会终止进程;它只会暂停它。发送一个 SIGCONT 让它继续。如果您终止它,它将从您的进程列表中删除。

于 2012-04-09T14:23:20.770 回答