#multithreading #threadpool
#многопоточность #пул потоков
Вопрос:
Я новичок в концепции потоков. Я читал, что количество потоков для компьютера зависит от количества ядер компьютера, т. Е. Если у машины 2 ядра, у нее будет 4 потока, 4 ядра, а не 8 потоков и так далее. Правильно ли я понимаю, что общее количество потоков на компьютере зависит только от количества ядер? Если да, то если мы говорим о пуле потоков в .net Framework, может ли пул потоков иметь более 16 потоков (для машины с 8 ядрами)?
Комментарии:
1. Не совсем — Windows 95 использовала несколько потоков одновременно, когда только мэйнфреймы использовали несколько процессоров. У каждого процесса есть хотя бы один поток, и операционная система определяет, какой поток может выполняться на ядре в любое время, как долго и т. Д
Ответ №1:
Потоки могут быть созданы даже в случае 1-ядерного процессора, т.Е. n (n>1) количество потоков может выполняться только на 1-ядерном процессоре (так это делалось в старые времена).
В многопоточности часто случается так, что потоки параллельны друг другу, они конкурируют за один ресурс, но это делается за такое короткое время, что они кажутся практически параллельными друг другу. Переключение процессора происходит за наносекунды или миллисекунды.
Потоки могут выполняться в действительно параллельном режиме, но это означает, что в вашем распоряжении должно быть как минимум 2 независимых ядра процессора. И все же, опять же: планирование того, что выполняется, где и когда, зависит от планирования процессора в операционной системе.
Вы должны понимать, что процессор выполняет простые двоичные инструкции и больше ничего не знает. Итак, когда приложение загружается в память, его потоки представляют собой просто набор инструкций машинного кода, которые могут выполняться фрагмент за фрагментом, один за другим, в частности, по расписанию, с некоторыми остановками или просто параллельно. Все это (опять же) зависит от дизайна ОС и процессора.
Как сказано выше, часто несколько потоков могут выполняться на 1 ядре, и планирование процессора будет выделять соответствующие временные интервалы для каждого потока, соответственно потоки будут конкурировать друг с другом за одно ядро. В этом случае процессор переходит от выполнения некоторой части инструкций из одного потока к выполнению некоторой другой части в каком-либо другом потоке, и это продолжается до тех пор, пока потоки не будут активны.
Если ваш процессор имеет несколько ядер, может быть достигнут реальный параллелизм, но вы [почти] никогда не контролируете это, операционная система и процессор делают.
В отличие от этого, смотрите также, как один поток может выполняться на разных ядрах. Как мы уже говорили выше, выполнение некоторой части инструкций запланировано процессором и ОС.
Комментарии:
1. Спасибо за ответ @Giorgi. Читая все ответы, которые я получил до сих пор, мне стало сложнее понять. Позвольте мне повторить итерацию по-другому. Существуют ли потоки нескольких уровней на компьютере, т. Е. Потоки уровня ОС, потоки уровня процессора и т.д.? Когда мы говорим о создании потоков в . Net framework или поговорим о ThreadPool, какие потоки мы имеем в виду? Каков предел этих потоков в случае, если мы используем потоковую обработку. Net framework?
2. @TechJay все современные версии Windows могут поддерживать не менее 5000 потоков.
3. @TechJay существуют потоки, управляемые промежуточным языком, ядром ОС или т.д. Но вам не следует беспокоиться об этом. Это больше не тема программирования, по крайней мере, это не то программирование, которое вы должны искать на этом уровне знаний. Это скорее манипуляция на уровне архитектуры и ОС, которая связана с инструкциями машинного кода очень низкого уровня. Концепцию потока можно рассматривать как путь выполнения . Когда вы вводите метод, у него есть инструкции first и last, это путь к этому конкретному методу, который нужно перейти от первого к последнему (сверху вниз) в последовательном порядке.
4. @Giorgi, спасибо тебе за твои усилия. Но мой вопрос больше касается направления. Программирование на основе Net framework с потоками. Вот почему я хочу знать, отличаются ли потоки пула потоков от того, что у нас есть 2 потока на ядро?
5. @TechJay ThreadPool — это просто пул потоков, которые используются повторно. Вы также можете немного погуглить и прочитать основные определения.