Это значит, что мой процессор может выполнять четыре отдельные команды одновременно? Каждый поток может быть многопоточным?
Короче говоря, оба.
ЦПУ может выполнять только одну команду на фазу в такте, из-за определенных факторов, таких как конвейерная обработка, процессор может передавать несколько инструкций через разные фазы за один такт, а частота часы могут быть очень быстрыми, но это все равно только 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.
Я надеюсь, что это может помочь добавить определенную ясность.
Одно ядро уже может выполнять [несколько инструкций одновременно] (https://en.wikipedia.org/wiki/Superscalar_processor). Четыре ядра могут выполнять четыре отдельных потока одновременно. –