2016-05-18 1 views
4

Я работаю над концепцией многопоточности.Максимальное количество потоков и многопоточность

Например, мой процессор имеет 2 ядра (и с гиперпотоком) 2 потока на сердечник, всего 4 потока. Значит ли это, что мой процессор может выполнять четыре отдельные команды одновременно? Каждый поток может быть многопоточным?

+2

Одно ядро ​​уже может выполнять [несколько инструкций одновременно] (https://en.wikipedia.org/wiki/Superscalar_processor). Четыре ядра могут выполнять четыре отдельных потока одновременно. –

ответ

0

Я действительно исследовал эту тему в своем классе «Операционные системы».

При использовании потоков хорошее правило для повышения производительности процессов, связанных с процессором, заключается в использовании равного количества потоков в качестве ядер, за исключением случаев с гиперпотоковой системой, и в этом случае следует использовать вдвое больше сердечники. Другое эмпирическое правило, которое можно заключить, связано с процессами, связанными с I/O. Это правило состоит в том, чтобы в четыре раза увеличить число потоков на ядра, за исключением случая с гиперпотоковой системой, чем в четыре раза увеличить число потоков на ядро.

+0

* Это правило состоит в том, чтобы в четыре раза увеличить число потоков на ядра, за исключением случая с гиперпотоковой системой, чем в четыре раза увеличить число потоков на ядро. * - оба звука похожи. В противном случае, хороший короткий ответ! –

+0

libx264 (видеокодер) по умолчанию запускает N = 1,5x логических потоков процессора. Он имеет сложную диспетчеризацию из-за зависимостей в вычислениях, поэтому он может использовать более простую логику диспетчеризации и позволяет ОС заботиться о запуске потоков, которые могут быть запущены. В более простых случаях, хотя, один поток на логическое ядро ​​является разумным для рабочих потоков, связанных с процессором. –

3

Это значит, что мой процессор может выполнять четыре отдельные команды одновременно? Каждый поток может быть многопоточным?

Короче говоря, оба.

ЦПУ может выполнять только одну команду на фазу в такте, из-за определенных факторов, таких как конвейерная обработка, процессор может передавать несколько инструкций через разные фазы за один такт, а частота часы могут быть очень быстрыми, но это все равно только 1 команда за раз.

В качестве примера, NOP является инструкцией сборки x86, который процессор интерпретирует как «без работы в этом цикле» вот одна инструкция из сотен или тысяч (и более), которые выполняются из чего-то даже просто:

int main(void) 
{ 
    while (1) { /* eat CPU */ } 
    return 0; 
} 

CPU поток выполнения является один, в котором последовательность команд (поток команд) в настоящее время выполняются, это не имеет значения, из какого «приложения» инструкции поступают из, процессор не знает о концепциях высокого уровня (например, приложения), это функция ОС.

Так что если у вас есть компьютер с 2 (или 4/8/128/и т. Д.) Процессорами, которые имеют одну и ту же память (кеш/RAM), тогда у вас может быть 2 (или более) процессора, которые могут запускать 2 (или более) инструкций (буквально) в одно и то же время. Имейте в виду, что это машинные инструкции, которые работают одновременно (то есть физическая сторона программного обеспечения).

Уровень уровня ОС - это нечто иное. Хотя процессор обрабатывает физическую сторону выполнения, ОС обрабатывает логическую сторону. Вышеприведенный код разбивается на более чем 1 инструкцию и, когда выполняется, фактически запускается на более чем 1 CPU (в среде с поддержкой нескольких процессоров), хотя это единственный «поток» (на уровне ОС), графики ОС когда запускать следующие инструкции и на каком процессоре (на основе политики планирования потоков ОС, которая отличается от различных ОС). Таким образом, приведенный выше код будет потреблять 100% использования ЦП на данный «срез времени» на том процессоре, на котором он работает.

Это «нарезка» из «времени» (также известный как preemptive computing) почему ОС может работать с несколькими приложениями «в то же время», это не буквально в то же время, так как процессор может только одновременно обрабатывать 1 инструкцию, но человеку (который едва может понять длину 1 секунду), он появляется «в одно и то же время».

1) за исключением случая с многопроцессорной установкой, тогда это может быть буквально в одно и то же время.

Когда приложение запускается, ядро ​​(ОС) на самом деле создает отдельный поток (поток ядра) для запуска приложения, кроме того, приложение может запросить создание другой внешней нити (т.е. нерест другого процесса или разветвления), или создавая внутренний поток, вызывая API (или языки программирования) ОС, которые фактически вызывают программы ядра нижнего уровня, которые порождают и поддерживают контекстное переключение порожденного потока, кроме того, любой созданный поток также способен вызывать одни и те же API для создания других отдельных потоков (таким образом, поток может быть «многопоточным»).

Многопоточность (в том смысле, приложений и операционных систем), не обязательно портативный, поэтому в то время как вы можете узнать Java или C# и использовать их API, (т.е. Thread.Start или Runnable), используя фактические OS API, как это предусмотрено (т.е. CreateThread или pthread_create и множество других функций параллелизма) открывает другую конструкцию для решения (например, «поддерживает ли платформа X библиотеку потоков Y»); просто нужно иметь в виду, когда вы исследуете разные API.

Я надеюсь, что это может помочь добавить определенную ясность.

+0

Хороший обзор и хорошее усилие в ответе. Еще один важный момент, касающийся многопоточности API и уровня приложений в целом, заключается в том, что каждая ОС (и отдельная библиотека потокового программирования) обычно реализует потоки по-разному (хотя есть попытки создать переносные варианты потоков). Поэтому запись многопоточного кода для одной ОС не гарантирует, что он будет переносимым на другой. –

+0

Ничего себе, отличный ответ txtechhelp. Это очистило все. Я не знал, что существует такая вещь, как «поток уровня ОС». Где я мог бы узнать больше о потолочной обработке? – collinskewl2

+0

@ collinskewl2, я отредактировал свой ответ, но «уровень ОС» означает более высокий (логический) уровень, а не сам аппарат (т. Е. ЦП). Я также добавил некоторые ссылки на различные API-интерфейсы потоков, поэтому вы можете получить более эффективный дескриптор, а также захватить ваш любимый компилятор и попробовать его: – txtechhelp

Смежные вопросы