/ / Чи можу я покластися, що ОС планує потоки "оптимальних" (Паралелізація) - java, багатопотокова, операційна система

Чи можу я розраховувати, що ОС планує потоки "оптимальних" (Паралелізація) - java, багатопотокова, операційна система

Afaik: Оптимальна кількість потоків для даних, що підходить для паралельної обробки, - це кількість ядер - оскільки кожен потік має (теоретично) власне ядро, на якому слід працювати. Для центральних процесорів, які здатні до гіперструзії, це 2 рази кількість ядер. Будь ласка, виправте мене, якщо я помиляюся.

Моє питання, чи лежить в основі ОС (Linux,Winodws OSX) автоматично реалізує мій "намір" і, напр. присвоює кожну нитку одному ядру, якщо я маю, наприклад, 8 ядер і відповідно 8 ниток, де кожне з них працює на "трудомістким"завдання?

Або навпаки: чи можна призначити нитки ядрам (особливо в Java)?

Відповіді:

2 для відповіді № 1

Афаїк: Оптимальна кількість потоків для даних, придатних для паралельної обробки, - це кількість ядер, оскільки кожна теорія має (теоретично) своє власне ядро. Для центральних процесорів, які здатні до гіперструзії, це 2 рази кількість ядер. Будь ласка, виправте мене, якщо я помиляюся.

Це набагато складніше, ніж це.

Це залежить від того, для чого ви оптимізуєте. Якщо ви оптимізуєте для ефективного (тобто економічно вигідного) використання наявного обладнання, то це рідко є оптимальним. Якщо будь-яку з ниток потрібно чекати значного періоду з будь-якої причини, то виділення потоків один на одинфізичні сердечники призводять до недостатнього використання ядер. Якщо ці ядра можна було б використовувати для чогось іншого (наприклад, запустити хтось інший програми!), То ваше використання буде неоптимальним.

Навіть якщо ви оптимізуєте виключно швидкість застосування, розподіл один на один не обов'язково є найкращою стратегією.

  • Кожна програма + робоче навантаження має "солодке місце" втерміни кількості ниток. Це залежить від кількості та характеру будь-якої внутрішньої суперечки та кількості та характеру спілкування із зовнішніми системами (файлові системи, мережеві зв’язки тощо).

  • Якщо у вас є жорстке правило "одна нитка на одне ядро", то ви можете мати не більше N потоків у N основній системі.

  • Якщо це N значно менше кількості ниток "солодкої плями", ви можете виявити, що сердечники простоюють багато часу.

Тепер для гіпер-ниток.

Hyperthreads потенційно дасть вам додатковий процесорциклів на тактовий цикл. Однак вони не дають вам додаткових циклів у системі пам’яті. Характеристики продуктивності «віртуального ядра» гіперточок будуть відрізнятися від фізичного ядра ... а для реальних програм різниця буде значною. Отже, ваші 2 x припущення без підстави.

Моє питання, чи лежить в основі ОС (Linux,Winodws OSX) автоматично реалізує мій "намір" і, напр. присвоює кожну нитку одному ядру, якщо я маю, наприклад, 8 ядер і відповідно 8 ниток, де кожне з них працює над "трудомістким" завданням?

Не обов'язково.

  • ОС має враховувати і інші речівідбуваються в системі. Інші програми, демони тощо, які обробляють ваш робочий стіл, речі, які стосуються файлових систем та мережевих протоколів.

  • ОС (і JVM), як правило, реагують лише нащо вже відбулося при прийнятті планових рішень. Прогнозування майбутньої поведінки на основі попередньої поведінки (на цьому рівні) не є рентабельним ... а сучасні ОС не намагаються це робити, за винятком дуже грубого / евристичного рівня. Ідеальне (оптимальне) прогнозування неможливо, і навіть якщо ви володіти ідеальними знаннями. Проблема планування не є важкою.

Теоретично програміст програми може розроблятиоптимальний графік. На практиці більшість програм занадто складні для цього І важко врахувати інші "випадкові" речі, що відбуваються в системі.

Або навпаки: чи можна призначити потоки ядрам (особливо в Java)?

Для цього немає практичного способу. (Див. Відповідь @ ksmonkey123) Звичайно, не портативно.

І це, мабуть, навряд чи буде працювати на Javaтак чи інакше. У Java є проблема з додаванням того, що за задньою частиною програми є приховані потоки (наприклад, нитки збирача сміття та фіналізатора), а управління пам'яттю Java важче передбачити та важче налаштувати.


2 для відповіді № 2

Ні, ви не можете призначити потік певному ядру в Java (Java багатопотоковість - призначте потоки ядрам процесора)

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