2014-02-05 3 views
2

Мне нужна помощь, чтобы понять основы параллельного программирования. На самом деле, чем больше я читаю, тем больше смущаюсь. Итак, я понял, что процесс является экземпляром программы, которая выполняется последовательно и что она может состоять из одного или нескольких потоков. В одноядерном ЦП одновременно может выполняться только один поток, в то время как в многоядерном процессоре многие потоки могут выполняться одновременно. Теперь вопросы:Процессы, потоки и параллельное программирование

1) Сколько потоков и процессов можно запускать одновременно с, например, четырехъядерным процессором? Только четыре потока одновременно? и только 1 процесс?

2) Является ли параллелизм возможным только для потоков, а не для процессов? Например, если я запускаю три разных приложения (= процессы) на трехъядерном процессоре, например в веб-браузере, текстовом процессоре и калькуляторе, могут ли они использовать только ядро ​​для каждого и запускать одновременно?

3) Во многих книгах вы можете найти объяснение трех состояний: runnable, заблокирован и запущен. Они относятся к процессам или нитям или обоим? Я не понимаю. Спасибо.

+1

1) Процесс представляет собой набор из одного или нескольких потоков. Для четырехъядерного ядра одновременно могут выполняться только 4 потока, не имеет значения, к какому процессу они принадлежат. –

ответ

2

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

Я должен начать с ответа на ваш третий вопрос, чтобы дать вам лучший контекст для ваших других вопросов. Темы и процессы начинаются в состоянии RUNNABLE, что означает, что он может быть выбран планировщиком потоков/процессов в качестве следующего потока/процесса, который должен выполняться на заданном ядре. После того, как он был выбран, он загружается в контекст этого ядра и входит в состояние RUNNING. Это продолжается до тех пор, пока поток/процесс не завершит свою работу и не умрет, или он не будет ждать состояния. Это ожидание помещает его в состояние BLOCKED. После того, как это условие отменено, оно входит в состояние RUNNABLE (даже если это условие становится истинным позже!)

Для вашего первого вопроса вы можете создавать столько процессов и потоков, сколько у вас есть системные ресурсы, но только для каждого виртуального ядро будет RUNNING в любой момент времени. (Это процесс выбора, описанный выше.) Обратите внимание, что когда я говорю о виртуальном ядре, я имею в виду то, что операционная система сообщает в качестве ядра. Передовые технологии позволяют нам помещать то, что кажется несколько ядер на одном ядре. Таким образом, у вас может быть 4-ядерная система с двойной гиперпотокой, которая сообщит о 8 ядрах операционной системе. Это абстракция, которой мы, как правило, не занимаемся, - мы просто заботимся о том, сколько ядер операционная система говорит, что у нас есть, и с этим.

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

2

1) Да, на процессоре с четырьмя ядрами/4-мя потоками может работать только 4 потока. Все будет немного сложнее, если мы будем говорить о процессорах с гиперпотоком, но, честно говоря, я не был бы прав, чтобы объяснить это.

2) Да, это возможно. Четырехъядерный процессор сможет запускать по 4 потока за раз - эти потоки могут принадлежать одному процессу или к 4 различным процессам.

3) Они относятся к резьбам. Бегущий поток - это, конечно, поток, которому был предоставлен временной срез и в настоящее время выполняется CPU. Блокированный поток - это тот, кто, например, ждет результатов ввода-вывода. Запустимый поток - это тот, который больше не блокируется, готов к запуску, но ему еще не предоставлен срез времени.

+1

Одно ядро ​​процессора с HyperThreading ведет себя как два логических процессора, по крайней мере, с точки зрения API, хотя на самом деле они не являются двумя полными ядрами (в основном дублированным конвейером). –

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