可以工作的进程太多,但 CPU 时隙太少。很可能,这就是问题的一部分——构建软件不仅要运行cc1plus,还要链接(ld),而且通常这是一个非常紧张的过程,您的编译可能会在逻辑上受到阻碍,并且也会因资源耗尽而失去继续进行的机会。
它们被其他东西挡住了。这里很可能就是这种情况:请注意您如何最大限度地利用交换使用量?因此,无论您的 CPU 在做什么,只要它访问内存页面,就很有可能需要从非易失性存储器读取并随后将其写入非易失性存储器。这需要花费几个数量级的时间,在此期间程序“无法做任何事情”。
就你的情况而言,你的设备是 Raspberry Pi,而且看起来,RAM 非常少,非易失性存储器要么是 SD 卡(速度极慢),要么是 USB 连接的外部存储(更好,但不能容忍),并且在你编译复杂的 C++ 软件时一直使用。如果是 SD 卡,你可能很快就要更换它了——SD 卡(极少数例外)不适用于这种随机访问的大量写入,其内部块储备很快就会用完。
这里的问题是,您正尝试在嵌入式设备上为嵌入式设备构建软件。不要这样做。在“合适的”机器(如 PC)上交叉编译您想要在 Raspberry Pi 上运行的东西。GQRX 是一个 Qt 密集型的基于 GNU Radio 的图形工具包,因此,您在构建 RPi 时遇到困难也就不足为奇了。
因此,交叉编译是这里的魔法词。现在,GQRX 已为 Raspberry Pi OS(我猜您正在使用?)打包,并且是相对较新的版本。除非您正在修复错误:也许坚持使用最新版本的 Raspberry Pi OS 并直接通过apt而不是从源代码构建它来安装 GQRX?如果您使用适合您的 Pi 的 Raspberry Pi OS 版本(例如,不是 64 位计算机的 32 位操作系统),那么执行后者将一无所获。
如果您确实需要使用经过修改的 GQRX,请设置一个交叉编译环境;这应该不难,我只是认为树莓派基金会“忘记”记录它(声称 Pis 的速度足够快,可以进行目标编译,这对于自动软件测试来说显然是错误的和无用的;我无法在我的壁橱里扩展到 100 个树莓派来自动并行构建,但我可能手头有一个构建服务器,或者一次租用一个几分钟)。
或者:在 PC 上的 VM 中运行 Raspberry Pi OS 效果很好,您可以为该 VM 提供任意数量的 RAM。当然,它在具有相同指令集的机器上运行得更好,因为编译器将以本机速度运行。(如果不是这种情况,亚马逊现在就不会成为附带小型零售服务的数据中心提供商,而是相反。)
有两个原因导致进程无法被调度:
cc1plus
,还要链接(ld
),而且通常这是一个非常紧张的过程,您的编译可能会在逻辑上受到阻碍,并且也会因资源耗尽而失去继续进行的机会。就你的情况而言,你的设备是 Raspberry Pi,而且看起来,RAM 非常少,非易失性存储器要么是 SD 卡(速度极慢),要么是 USB 连接的外部存储(更好,但不能容忍),并且在你编译复杂的 C++ 软件时一直使用。如果是 SD 卡,你可能很快就要更换它了——SD 卡(极少数例外)不适用于这种随机访问的大量写入,其内部块储备很快就会用完。
这里的问题是,您正尝试在嵌入式设备上为嵌入式设备构建软件。不要这样做。在“合适的”机器(如 PC)上交叉编译您想要在 Raspberry Pi 上运行的东西。GQRX 是一个 Qt 密集型的基于 GNU Radio 的图形工具包,因此,您在构建 RPi 时遇到困难也就不足为奇了。
因此,交叉编译是这里的魔法词。现在,GQRX 已为 Raspberry Pi OS(我猜您正在使用?)打包,并且是相对较新的版本。除非您正在修复错误:也许坚持使用最新版本的 Raspberry Pi OS 并直接通过
apt
而不是从源代码构建它来安装 GQRX?如果您使用适合您的 Pi 的 Raspberry Pi OS 版本(例如,不是 64 位计算机的 32 位操作系统),那么执行后者将一无所获。如果您确实需要使用经过修改的 GQRX,请设置一个交叉编译环境;这应该不难,我只是认为树莓派基金会“忘记”记录它(声称 Pis 的速度足够快,可以进行目标编译,这对于自动软件测试来说显然是错误的和无用的;我无法在我的壁橱里扩展到 100 个树莓派来自动并行构建,但我可能手头有一个构建服务器,或者一次租用一个几分钟)。
或者:在 PC 上的 VM 中运行 Raspberry Pi OS 效果很好,您可以为该 VM 提供任意数量的 RAM。当然,它在具有相同指令集的机器上运行得更好,因为编译器将以本机速度运行。(如果不是这种情况,亚马逊现在就不会成为附带小型零售服务的数据中心提供商,而是相反。)