资源密集型多线程杀死其他进程
Resource intensive multithreading killing other processes
我编写了一个非常占用资源的代码,因此我可以将工作负载分配给多个 pthread。虽然一切正常,但计算速度更快,等等。我猜发生的是该处理器核心上的其他进程变得如此缓慢,以至于它们在运行几秒钟后崩溃。
我已经设法杀死随机进程,例如 Chrome 选项卡、Cinnamon DE 甚至整个 OS(内核?)。
代码:(来晚了,懒得做伪代码了,连注释都懒得写了。。)
-- 但它是一个暴力代码,与其说是为了破解,不如说是为了测试密码和/或 CPU IPS。
有什么想法可以解决这个问题,同时仍然保持尽可能高的性能吗?
static unsigned int NTHREADS = std::thread::hardware_concurrency();
static int THREAD_COMPLETE = -1;
static std::string PASSWORD = "";
static std::string CHARS;
static std::mutex MUTEX;
void *find_seq(void *arg_0)
{
unsigned int _arg_0 = *((unsigned int *) arg_0);
std::string *str_CURRENT = new std::string(" ");
while (true)
{
for (unsigned int loop_0 = _arg_0; loop_0 < CHARS.length() - 1; loop_0 += NTHREADS)
{
str_CURRENT->back() = CHARS[loop_0];
if (*str_CURRENT == PASSWORD)
{
THREAD_COMPLETE = _arg_0;
return (void *) str_CURRENT;
}
}
str_CURRENT->back() = CHARS.back();
for (int loop_1 = (str_CURRENT->length() - 1); loop_1 >= 0; loop_1--)
{
if (str_CURRENT->at(loop_1) == CHARS.back())
{
if (loop_1 == 0)
str_CURRENT->assign(str_CURRENT->length() + 1, CHARS.front());
else
{
str_CURRENT->at(loop_1) = CHARS.front();
str_CURRENT->at(loop_1 - 1) = CHARS[CHARS.find(str_CURRENT->at(loop_1 - 1)) + 1];
}
}
}
};
}
阿鲁兹
你能post完整的代码吗?我怀疑问题出在 NTHREADS 值上。在我的 Ubuntu 框中,值设置为 8,这是 /proc/cpuinfo 文件中的核心数。在我的 box hog 上启动 8 'hot' 个线程占据了 CPU 的 100%。内核将为它自己的关键进程分配时间片,但通常所有其他进程都会饿死 CPU。
检查 /etc/cpuinfo 中的最大处理器值并至少低于该值。 CPU 在我的盒子上编号为 0-7,所以 7 对我来说是最大值。实际最大值可能是 3,因为我的 4 个内核是超线程。对于完全 CPU 个进程,超线程通常无济于事。
最重要的是,不要独占所有 CPU,这会破坏系统的稳定性。
--马特
感谢您的回答,尤其是 Matthew Fisher 建议在另一个系统上尝试。
经过反复试验,我决定取消我认为稳定的 CPU 超频(我已经使用了一年多),这解决了这个奇怪的行为。我想我从来没有 运行 这样的 CPU 密集和(我猜)高效(关于不通过屈服来限制完整的 CPU )脚本来看到这种情况发生。
正如 Matthew 所建议的,我需要想出一个更好的方法,而不是用 while true
循环不断检查 THREAD_COMPLETE 变量,但我希望在评论中解决这个问题。
供未来访客使用的完整更新代码位于此处:pastebin.com/jbiYyKBu
我编写了一个非常占用资源的代码,因此我可以将工作负载分配给多个 pthread。虽然一切正常,但计算速度更快,等等。我猜发生的是该处理器核心上的其他进程变得如此缓慢,以至于它们在运行几秒钟后崩溃。
我已经设法杀死随机进程,例如 Chrome 选项卡、Cinnamon DE 甚至整个 OS(内核?)。
代码:(来晚了,懒得做伪代码了,连注释都懒得写了。。) -- 但它是一个暴力代码,与其说是为了破解,不如说是为了测试密码和/或 CPU IPS。
有什么想法可以解决这个问题,同时仍然保持尽可能高的性能吗?
static unsigned int NTHREADS = std::thread::hardware_concurrency();
static int THREAD_COMPLETE = -1;
static std::string PASSWORD = "";
static std::string CHARS;
static std::mutex MUTEX;
void *find_seq(void *arg_0)
{
unsigned int _arg_0 = *((unsigned int *) arg_0);
std::string *str_CURRENT = new std::string(" ");
while (true)
{
for (unsigned int loop_0 = _arg_0; loop_0 < CHARS.length() - 1; loop_0 += NTHREADS)
{
str_CURRENT->back() = CHARS[loop_0];
if (*str_CURRENT == PASSWORD)
{
THREAD_COMPLETE = _arg_0;
return (void *) str_CURRENT;
}
}
str_CURRENT->back() = CHARS.back();
for (int loop_1 = (str_CURRENT->length() - 1); loop_1 >= 0; loop_1--)
{
if (str_CURRENT->at(loop_1) == CHARS.back())
{
if (loop_1 == 0)
str_CURRENT->assign(str_CURRENT->length() + 1, CHARS.front());
else
{
str_CURRENT->at(loop_1) = CHARS.front();
str_CURRENT->at(loop_1 - 1) = CHARS[CHARS.find(str_CURRENT->at(loop_1 - 1)) + 1];
}
}
}
};
}
阿鲁兹
你能post完整的代码吗?我怀疑问题出在 NTHREADS 值上。在我的 Ubuntu 框中,值设置为 8,这是 /proc/cpuinfo 文件中的核心数。在我的 box hog 上启动 8 'hot' 个线程占据了 CPU 的 100%。内核将为它自己的关键进程分配时间片,但通常所有其他进程都会饿死 CPU。
检查 /etc/cpuinfo 中的最大处理器值并至少低于该值。 CPU 在我的盒子上编号为 0-7,所以 7 对我来说是最大值。实际最大值可能是 3,因为我的 4 个内核是超线程。对于完全 CPU 个进程,超线程通常无济于事。
最重要的是,不要独占所有 CPU,这会破坏系统的稳定性。
--马特
感谢您的回答,尤其是 Matthew Fisher 建议在另一个系统上尝试。
经过反复试验,我决定取消我认为稳定的 CPU 超频(我已经使用了一年多),这解决了这个奇怪的行为。我想我从来没有 运行 这样的 CPU 密集和(我猜)高效(关于不通过屈服来限制完整的 CPU )脚本来看到这种情况发生。
正如 Matthew 所建议的,我需要想出一个更好的方法,而不是用 while true
循环不断检查 THREAD_COMPLETE 变量,但我希望在评论中解决这个问题。
供未来访客使用的完整更新代码位于此处:pastebin.com/jbiYyKBu