Можно ли на 4 ядерном процессоре (то есть с виртуальными 8 получается) запускать программу (процесс), которая использовала бы больше 8 потоков? Ну к примеру 50 потоков... Или это невозможно?. Вопрос как к асинхронной реализацией, так и синхронной. К синхронной я так понимаю будет выполняться всего n потоков, когда остальные 50-n заблокированны, тогда получается что теоритически для синхронных алгоритмов можно создавать и 1000 потоков?
А для асинхронных неужели только 8? Если зайти в запущенные процессы то вижно, что кол-во процессов гораздо больше по численности чем кол-во ядер процессора. Как же все таки определять оптимальное кол-во возможных для программы потоков?
Другие языки программирования и технологии
С++ Потоки, процессы...
Максимальное количество потоков (для линукса) определяется количеством виртуальной памяти поделенное на размер стека (по умолчанию 8 мб). Даже на машинах со слабыми характеристиками (например какой-нибудь vps за доллар) это значение более чем 10 тысяч. Само же количество потоков на процесс не ограничено (апачи, например, использует их на полную).
Нужно понимать для чего действительно нужны потоки: асинхронная работа представляет из себя работу в одном потоке, с использованием легковесных потоков (сопрограмм), которые создают дополнительные потоки при выполнении ожидающих операций (обращение к файловой системе, работа с сетью и т. п.) чтобы не заставлять ждать остальные сопрограммы.
Реальная параллельная работа возможна лишь если количестве ядер процессора больше одного (иначе потоки выполняются последовательно, да еще и время теряют при переключении контекста). Но тут, опять же, возникает новая проблема в виде race condition - это когда нужно обеспечить целостность данных при одновременном чтении/записи этих данных. Поддерживать эту целостность для 1000+ одновременно запущенных потоков - трата времени, поэтому, как правило, их количество не превышает 1-10 для большинства программ.
Восемь - это всего лишь число "переключателей" между потоками доступные процессору в один момент времени; каждый из них успеет получить должное внимание, не беспокойся.
Golang, по моему мнению, самый наглядный пример эффективного утилизирования потоков, ибо этот язык использует столько потоков, сколько ядер у процессора (исключая те моменты, когда обращается к файловой системе или вызывает cgo, но это напрямую связано с асинхронностью). Сиречь 1ядро - работает полностью асинхронно, 2 и более ядра - параллельно, но в то же время работая с теми же сопрограммами, которые соплетены уже между всеми потоками, что обеспечивает максимальную производительность.
Нужно понимать для чего действительно нужны потоки: асинхронная работа представляет из себя работу в одном потоке, с использованием легковесных потоков (сопрограмм), которые создают дополнительные потоки при выполнении ожидающих операций (обращение к файловой системе, работа с сетью и т. п.) чтобы не заставлять ждать остальные сопрограммы.
Реальная параллельная работа возможна лишь если количестве ядер процессора больше одного (иначе потоки выполняются последовательно, да еще и время теряют при переключении контекста). Но тут, опять же, возникает новая проблема в виде race condition - это когда нужно обеспечить целостность данных при одновременном чтении/записи этих данных. Поддерживать эту целостность для 1000+ одновременно запущенных потоков - трата времени, поэтому, как правило, их количество не превышает 1-10 для большинства программ.
Восемь - это всего лишь число "переключателей" между потоками доступные процессору в один момент времени; каждый из них успеет получить должное внимание, не беспокойся.
Golang, по моему мнению, самый наглядный пример эффективного утилизирования потоков, ибо этот язык использует столько потоков, сколько ядер у процессора (исключая те моменты, когда обращается к файловой системе или вызывает cgo, но это напрямую связано с асинхронностью). Сиречь 1ядро - работает полностью асинхронно, 2 и более ядра - параллельно, но в то же время работая с теми же сопрограммами, которые соплетены уже между всеми потоками, что обеспечивает максимальную производительность.
Николай Лоскарёв
но в случае с серверной программой численность потоков будет зависить напрямую от кол-во подключаемых потоков и это может быть неограниченно много... Как возможно соотнести мощность железа и требовательность программы на 1 клиента пока не понял. чтоб вычислить максимальное кол-во онлайна у данного сервера
Николай Лоскарёв
* точнее будет зависить от кол-ва подключаемых клиентов к серверу... опечатался...
Если речь идёт о параллельных вычислениях, то нет, не более 8 потоков одновременно. Если речь идёт о конкуренции за процессорное время то столько сколько ваша система позволит, столько и запустит.
Николай Лоскарёв
ааа вот оно что... печально. значит сервак с 8 виртуальными ядрами сможжет потянуть только онлайн из 7 человек, учитывая 1 ядро под системные вещи?
потоков у программы может быть сколько хочешь до тех пор, пока хватает памяти.
потоки просто будут стоять в очереди
потоки просто будут стоять в очереди
Николай Лоскарёв
а сколько блокируется памяти при 1 дополнительном потоке. Какая зависимость может есть.
и как влияет кол-во ядер процессора? ведь именно они и отвечают за параллельность процессов, поэтому связь между многопроцессорностью и многопоточностью должна быть прямая, вот только зависимость не понял
и как влияет кол-во ядер процессора? ведь именно они и отвечают за параллельность процессов, поэтому связь между многопроцессорностью и многопоточностью должна быть прямая, вот только зависимость не понял
Многопоточность и многозадачность появились раньше многоядерности и не зависят от нее. ОС сама решает, как распределить потоки на физические ядра
Николай Лоскарёв
Это понятно. Об этом пишут в книгах. Вопрос в том, как определить сколько ядер будет задействовано конкретной программой. Может получиться так, что комп не потянет программу - вот и хотелось бы примерить для начало
Похожие вопросы
- Общая загруженность процессора при запущенном процессе с один потоком, выполняющим "while(true){}", не превышает 33%.
- узнал от одного таварища, что можно ускорить входящий поток в адаптаре WI-FI. как?
- [ delphi] почему виснет Form вовремя выполнения задач в другом потоке?
- C++ как можно без переменных все в потоке выкинуть назад?
- Есть ли какие-либо стандарты по упаковки потока данных для передачи файлов?
- Приоритеты процессов в Linux
- Как же это работает. Разделение ресурсов устройств между процессами
- процесс conhost.exe
- Помогите забрался некий процесс lsass.exe
- Как снести процессы