runat 400mhz ./my-program --argument-of="my program"
对于我来说,在具有固定(较低)CPU 时钟速度(例如,为了获得该时钟速度)的 Linux 环境中运行特定程序非常有用。
我需要它在程序的每个汇编指令之间生成延迟,如果延迟不准确(例如,如果它取决于操作系统调度程序,因为它几乎肯定会),它不会杀死我。
目标是在学校编写不太繁重的应用程序时使算法效率非常明确(拥有 3GHz CPU 使得很难注意到运行时间短且可以真正优化的缓慢算法)。此外,它也许对于实时发现竞争条件很有用。
你知道有这样的工具吗?有什么类型的解释器可以让我破解来实现此目的吗? gdb 可以以相对简单的方式帮助我吗?我认为这是我所知道的最接近控制 Linux 程序执行的东西。
在 CPU 上限的虚拟机中运行漏洞系统可能是另一种选择,因为它给我带来了一种错觉 - 速度较低的 CPU - 但最好还是运行单个程序。
答案1
我认为您正在寻找的应用程序称为cpulimit
。这不是系统中通常包含的命令,因此您必须通过发行版包管理器 (Ubuntu/Debian) 或从源代码安装它。
Ubuntu/Debian
$ apt-cache search cpulimit
cpulimit - tool for limiting the CPU usage of a process
所以安装会像这样:
$ sudo apt-get install cpulimit
从源头
像这样下载:
$ wget https://github.com/opsengine/cpulimit/archive/master.zip \
-O cpulimit-master.zip
解压并构建:
$ unzip cpulimit-master.zip ; cd cpulimit-master ; make
用法
您可以使用 a 安装它make install
,但现在我们只需从构建它的目录中使用它:
$ pwd
/home/saml/tst/96387/cpulimit-master
$ src/cpulimit -e firefox -l 30
这会将调用的进程限制firefox
为可用 CPU 使用率的 30%。
您还可以在调用进程后将其应用于正在运行的进程:
$ pgrep firefox
1234
$ src/cpulimit -p 1234 -l 30
您可以看到其余的用法cpulimit
:
$ src/cpulimit
Error: You must specify a cpu limit percentage
Usage: cpulimit [OPTIONS...] TARGET
OPTIONS
-l, --limit=N percentage of cpu allowed from 0 to 400 (required)
-v, --verbose show control statistics
-z, --lazy exit if there is no target process, or if it dies
-i, --ignore-children don't limit children processes
-h, --help display this help and exit
TARGET must be exactly one of these:
-p, --pid=N pid of the process (implies -z)
-e, --exe=FILE name of the executable program file or path name
COMMAND [ARGS] run this command and limit it (implies -z)
Report bugs to <[email protected]>.
cyberciti.biz 上还有一个关于其使用的很好的教程,标题为:Linux 限制每个进程的 CPU 使用率。
笔记:请记住,它以百分比形式限制 CPU 使用率,因此如果您有四核机箱(4 个 cpu),那么您需要将其限制在 0% - 400% 之间。
答案2
您也许可以设置处理器的时钟,但是是全局设置,而不是针对特定程序。处理器不是这样工作的。适用于功率有限环境(尤其是笔记本电脑和其他移动设备)的处理器往往支持多种速度。
原则上,您可以安排在调度进程时更改处理器速度(如果支持),并在调度另一个进程时重置处理器速度。我不知道有任何软件支持这一点,它可能需要对内核进行相当大的修改。
您可以在速度较慢的虚拟机中运行您的程序,例如 Qemu(没有 KVM,因此您可以获得纯软件模拟)或 Bochs。
以较低的 CPU 速度运行不太可能会暴露更多的竞争条件。
如果您的程序是多线程的,您可以强制它使用单个处理器或带有 的一组特定处理器taskset
,例如taskset 3 myprogram
仅在 CPU #0 和 #1 上运行。强制程序在单个 CPU 上运行可能会出现更少的竞争条件。
对于您的用例,与其运行速度较慢,不如运行几次。例如,如果您希望程序在比计算机慢大约 10 倍的设备上具有一定的速度,请通过连续运行程序 10 次来测试它。多次运行程序会增加遇到竞争条件的可能性。
答案3
另一种选择是使用速度较慢的硬件 - 某种廉价的基于 ARM 的板,例如树莓派或(稍微强大一点)Compulab修剪切片应该做。它们的内存量有限,CPU 速度慢,但可以运行完整的 Linux 系统 - Fedora、Debian 和其他一些发行版都有 ARM 版本。
答案4
您可以使用 cpufreq-info 查找您的 cpu 支持的所有 CPU 时钟速度。您可以使用 cpufreq-set 选择 cpu 时钟速度。