Ich habe einen sehr ressourcenintensiven Code, den ich erstellt habe, sodass ich die Arbeitslast auf mehrere Pthreads aufteilen kann. Während alles funktioniert, ist die Berechnung schneller, usw. Was ich vermute, ist, dass andere Prozesse auf diesem Prozessorkern so langsam werden, dass sie nach ein paar Sekunden Laufzeit abstürzen.Ressourcenintensives Multithreading, das andere Prozesse zerstört
Ich schon geschafft, zufällige Prozesse wie Chrome Tabs, die Cinnamon DE oder sogar das gesamte Betriebssystem (Kernel?) Zu töten.
Code: (Es ist spät, und ich bin zu müde, um einen Pseudo-Code oder sogar Kommentare ..) - Aber es ist ein Brute-Force-Code, nicht so sehr zum Knacken, sondern zum Testen von Passwörtern und oder CPU IPS.
Irgendwelche Ideen, wie Sie dies beheben können, während Sie immer noch so viel Leistung wie möglich halten?
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];
}
}
}
};
}
Die Symptome, die Sie beschreiben, die eines der Speicher Situation durch einen Speicher oder Ressourcen-Leck verursacht werden, unter Berufung auf die [oom Killer] (https: // www .memset.com/docs/additional-information/oom-killer /) – kfsone
@kfsone Klingt wahrscheinlich, aber die Anwendung verwendet maximal 20 MB, und Valgrind meldet Folgendes: möglicherweise verloren: 2,223 Bytes in 14 Blöcken && noch erreichbar: 56 Bytes in 7 Blöcken. Natürlich, es gibt einige Lecks, die ich versuchen werde zu beheben, aber manchmal gibt Valgrind ungenaue Daten. – areuz
Ein Prozess, der die CPU nervt, sollte nicht in der Lage sein, andere Prozesse zum Absturz zu bringen. Es wird sie verlangsamen, aber kann sie nur aufgrund von fehlerhafter Hardware oder einem Kernel-Bug zum Absturz bringen. –