2013-12-06 2 views
0

У меня есть (белая шляпа) инструмент для взлома пароля, который постоянно увеличивает строку пароля, а затем хеширует ее, чтобы сравнить ее с поставляемым хешем (который я хочу взломать). Тем не менее, программа использует только 14% CPU.Почему мое приложение C# (Mono) использует низкий процессор?

Приложение имеет два потока, только один из которых должен быть ресурсоемким. Моя машина имеет 4 ядра с гиперпотоком (8 виртуальных ядер). Тем не менее, даже одно ядро ​​имеет процессорное использование выше 25%. По данным монитора ресурсов, работа, похоже, распространяется вокруг (каждое ядро ​​составляет в среднем около 12%).

Есть ли способ заставить его использовать больше процессора и, надеюсь, работать быстрее или не работает так?

+3

Сколько процессоров/ядро ​​ли ваша машина есть? Является ли ваше приложение однопоточным? Вы пытались изменить приоритет процесса? –

+0

Приложение имеет два потока, только один из которых должен быть ресурсоемким. Моя машина имеет 4 ядра с гиперпотоком (8 виртуальных ядер). Даже в одном ядре нет большого использования ЦП, хотя, по словам монитора ресурсов, работа, по-видимому, распространяется по всему (каждое ядро ​​составляет в среднем около 12%). – Razick

+1

8 * 12 = 96 (или 8 х 12,5 = 100). Поскольку мясо вашего приложения однопоточное, оно может работать только на одном ядре сразу. Он перескакивает от ядра к ядру в соответствии с обычными правилами планирования процесса. Поскольку он использует каждое ядро, он использует 100% этого ядра в течение времени, которое он на этом ядре. Но это только на каждом ядре 1/8 времени. –

ответ

2

8 * 12 = 96 (или 8 x 12,5 = 100). Поскольку мясо вашего приложения однопоточное, оно может работать только на одном ядре сразу. Он перескакивает от ядра к ядру в соответствии с обычными правилами планирования процесса. Поскольку он использует каждое ядро, он использует 100% этого ядра в течение времени, которое он на этом ядре. Но это только на каждом ядре 1/8 времени.

+0

Спасибо, я собираюсь принять Айдын Адн вместо этого, потому что я думаю, что это поможет будущим читателям. Спасибо, хотя, это помогло мне понять. – Razick

+0

Вы можете принять как ответы, так и знать. Мой сделал более прямой ответ на ваш вопрос. –

+0

Я пробовал, это не позволило мне. Да, но я думаю, что большинство людей, которые могут искать это, не поймут многопоточность. – Razick

3

Самый простой способ, очевидно, заключался бы в многопоточности. Поскольку большинство современных процессоров имеют несколько ядер, если вы используете один поток, вы можете использовать только одно ядро ​​за раз.

http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx

Выше учебник для многопоточной.

Что касается тактики, поскольку вы, кажется, грубо заставляете пароль, вы можете иметь несколько «приращений строк», начиная с другой начальной строки.

+0

Странно то, что даже одно ядро ​​не превышает 25%. – Razick

+0

Вы сказали, что вы «увеличиваете строку». Вы используете право StringBuilder? Если вы используете строку, вы теряете время, выбирая память – Haedrian

+0

Да, я использую построитель строк. – Razick

1

То, что вы ищете, называется так называемым MultiThreading, в то время как ваше приложение работает на одном потоке, если вы хотите, чтобы он работал на больше, вам нужно научиться разделить заданную задачу на равные куски ,

Еще одна проблема, с которой вы столкнетесь, - это проблемы безопасности потоков, поскольку ваши потоки будут использовать одни и те же ресурсы. Чтобы избежать проблем, которые возникают с ним, вам необходимо заблокировать данные, к которым вы пытаетесь получить доступ, которые блокируют доступ других ресурсов к ресурсу до тех пор, пока поток не будет выполнен с ним.

Как использовать нити

var thread = new Thread(()=> RunMethod()); 
thread.Start(); 

Как заблокировать данные:

private static readonly Object lock = new Object(); 
private void RunMethod() 
{ 
    Lock(lock) 
    { 
     // Access or modify shared resource 
    } 
} 
Смежные вопросы