Потоки и работа с нимиthreads and threading

Зачем уменьшать техпроцесс?

Как я уже говорил выше, оптимизация литографии ведет к размещению большего числа транзисторов на подложке меньшего размера. Говоря простым языком, на одной площади можно расположить не 1, а 1,5 млрд транзисторов, что ведет к повышению производительности без увеличения тепловыделения.

Коэффициент умножения системной шины процессора также возрастает, а значит и его мощь растет.

На данный момент оптимальными процессорами, которые вобрали в себя самое лучшее из современных технологий, можно назвать Intel 8700k и AMD Ryzen 1800x. Есть конечно и более новый вариант от «красных» в лице Ryzen 2700 (12 нм), но его производительность немного скромнее.Потоки и работа с нимиthreads and threadingНадеемся, вы поняли суть, которую я хотели донести до вас в этой статье. В следующих обзорах мы коснемся таких понятий как разгон, нагрев, охлаждение и прочих животрепещущих вопросов, которые требуют пояснения. Оставайтесь с нами и следите за новыми публикациями. Удачи!

C уважением Андрей Андреев

Как узнать сколько ядер в процессоре? Да тут все просто, ребята!

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

Чтобы определить сколько ядер в процессоре можно использовать как специальные программы, так и воспользоваться штатными средствами Windows. Хотя лучше использовать конечно программы, ибо они не только ядра/потоки покажут, но и много всякой другой инфы, которая может вам также пригодится.

Так, хватит говорить, переходим к делу. Значит сперва покажу как посмотреть ядра/потоки в Windows 7. Первый способ, это вообще без программ, только при помощи штатных средств. Способ рабочий и необычный, в общем смотрите, создаете на рабочем столе любой файл с расширением .nfo, например CPU.nfo (вообще имя можно любое задать):

Кстати, а у вас расширения файлов показываются? Проверьте, без них вы не сможете создать файл с указанным расширением! Для этого открываете Панель управления (в меню Пуск есть пункт) и в ней находите значок Параметры папок, вот там на вкладке Вид, внизу будет галочка по поводу расширений, ее нужно снять:

Потоки и работа с нимиthreads and threading

Вернемся к файлу, вот создали вы файл с расширением .nfo, теперь нажимаете по нему два раза мышкой, ну то есть запускаете его, появится вот такая ошибка:

Потоки и работа с нимиthreads and threading

На эту ошибку вы внимания не обращайте, нажимаете ОК и потом появляется вот такое окно:

Потоки и работа с нимиthreads and threading

В этом окне Сведения о системе, справа будет список характеристик, вот там будет и строка Процессор, в ней как раз и указывается сколько у вас ядер и сколько логических процессоров (колонку значение советую растянуть чтобы было лучше видно):

Потоки и работа с нимиthreads and threading

Логические процессоры это имеется ввиду потоки. Тут также указана модель и частота, что тоже хорошо. Можно также посмотреть и в диспетчере, но тут проблема в том, что винда показывает и ядра и потоки в кучу, поэтому понять сколько ядре на самом деле невозможно. Посмотреть можно на вкладке Быстродействие:

Потоки и работа с нимиthreads and threading

Забыл сказать, что если вы не знаете как запустить диспетчер задач, то нажимаете правой кнопкой по панели задач (внизу) и там есть пункт Диспетчер задач, вот его и выбираете. Ну это так, на заметку вам так бы сказать..

После установки CPU-Z у вас появится вот такой ярлык на рабочем столе:

Потоки и работа с нимиthreads and threading

Нажимаем по нему два раза и вот такое окно появится:

Потоки и работа с нимиthreads and threading

Вот видите там внизу есть такое как Cores и Threads? Вот это и есть ядра и потоки, но так как у меня стоит Pentium G3220, то увы, у меня два ядра или два потока и все..

Эта прога CPU-Z подходит как для Windows 7 так и для Windows 10, то есть будет работать без приколах в любой винде.

Но тем не менее, я еще должен вот что показать. В Windows 10 также можно посмотреть сколько ядер/потоков без программ. И для этого даже не нужно создавать файл nfo, все намного проще, вам нужно зайти в диспетчер задач, для этого нажимаете правой кнопкой по панели задач (внизу) и там выберите этот пункт:

Потоки и работа с нимиthreads and threading

Потом переходите на вкладку Производительность, там выбираете ЦП и вот там будет всякая инфа, а внизу в правом уголку будет показано сколько у вас ядер и сколько потоков (это логические процессоры):

Потоки и работа с нимиthreads and threading

Как видите, в случае с Windows 10 вы можете прямо в диспетчере узнать количество ядер/потоков, да, это быстро, просто и легко. Но я все равно советую вам поставить CPU-Z, а вдруг вам еще какая-то инфа о проце понадобится? Вот тут то и пригодится програмулька CPU-Z, ибо там все удобно собрано, все самое необходимое.

Ну все ребята, этом уже все, надеюсь что все вам тут было понятно и что мне получилось вам немного помочь. Удачи вам в жизни и чтобы все у вас было хорошо

Многопоточность и все о ней

Многие наверняка слышали выражения из серии «2 потока», «4 потока», «8 потоков» и т.д. При этом физических ядер зачастую было в 2 раза меньше.

Многопоточность у красных появилась совсем недавно, с выходом чипов Ryzen на совершенно новом техпроцессе. Что это такое – тема отдельной статьи.

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

Недостаток технологии заключается в следующем:

  • оба потока обращаются к единой кэш-памяти 2 и 3 уровней;
  • тяжелые вычислительные процессы могут вызвать конфликт в системе.

Если очень грубо, то все кирпичи с одного места на другое можно перенести в одной руке (1 поток), либо в двух (2 потока), но человек при этом один (1 ядро) и устает одинаково при любых условиях, хоть его производительность фактически увеличивается вдвое. Иными словами, мы упираемся в производительность ЦП, а конкретней в его частоту.

Знакомы с понятием Turbo Boost? Процесс кратковременно повышает частоту процессора на несколько сотен мегагерц в особо сложных сценариях, чтобы вы не испытывали проблем при обработке сложных данных.

Многоядерность и гиперпоточность

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

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

Гиперпоточность позволяет распараллеливать вычисления более эффективно – если одно виртуальное ядро завершило работу над своей задачей и находится в режиме ожидания, его ресурсы может использовать другое. В случаях, когда гиперпоточность не поддерживается, эти ресурсы простаивают. Таким образом, поддержка виртуальных ядер может ускорить выполнение некоторых задач, хотя, разумеется, она не так хороша, как наличие дополнительных физических, и удвоения производительности ожидать не стоит.

Иллюстрация концепции потоков/виртуальных ядер:

Потоки и работа с нимиthreads and threading

Рассмотрим следующий упрощенный пример: если двухъядерный процессор с двумя потоками работает с четырьмя последовательностями команд одновременно, а производительность одного ядра для одной последовательности избыточна, то общая производительность будет ниже, чем в случае, если на месте такого процессора будет вариант с двумя ядрами, но с четырьмя потоками, поскольку на переключение между задачами тратится дополнительное время, и часть ресурсов иногда простаивает. А вот если вычислительных ресурсов одного потока недостаточно для выполнения одной последовательности, то виртуальные ядра почти не помогут – нужны дополнительные физические.

Распараллеливание нагрузки при помощи технологии Intel Hyper-Threading

Потоки и работа с нимиthreads and threading

Обзор

Модель процессора Intel Pentium 4 с тактовой частотой 3 ГГц с технологией Hyper-Threading.

Технология Hyper-Threading — это форма технологии одновременной многопоточности, представленная Intel, а концепция, лежащая в основе этой технологии, запатентована Sun Microsystems . Архитектурно процессор с технологией Hyper-Threading состоит из двух логических процессоров на ядро, каждый из которых имеет собственное архитектурное состояние процессора. Каждый логический процессор может быть индивидуально остановлен, прерван или направлен на выполнение указанного потока независимо от другого логического процессора, использующего то же физическое ядро.

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

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

Эта технология прозрачна для операционных систем и программ. Минимум, который требуется для использования преимуществ гиперпоточности, — это поддержка симметричной многопроцессорной обработки (SMP) в операционной системе, поскольку логические процессоры выглядят как стандартные отдельные процессоры.

Можно оптимизировать поведение операционной системы в многопроцессорных системах с поддержкой гиперпоточности. Например, рассмотрим систему SMP с двумя физическими процессорами, которые являются гиперпоточными (всего четыре логических процессора). Если планировщик потоков операционной системы не знает о гиперпоточности, он будет обрабатывать все четыре логических процессора одинаково. Если только два потока могут выполняться, он может запланировать эти потоки на двух логических процессорах, которые принадлежат одному и тому же физическому процессору; этот процессор будет чрезвычайно загружен, в то время как другой будет бездействовать, что приведет к снижению производительности, чем это возможно при планировании потоков на разных физических процессорах. Этой проблемы можно избежать, улучшив планировщик, чтобы логические процессоры обрабатывались иначе, чем физические процессоры; в некотором смысле это ограниченная форма изменений планировщика, необходимых для систем NUMA .

Планирование потоков

Для того чтобы понимать, в каком порядке исполнять код различных потоков, необходима организация планирования тих потоков. Ведь система может иметь как одно ядро, так и несколько. Как иметь эмуляцию двух ядер на одном так и не иметь такой эмуляции. На каждом из ядер: железных или же эмулированных необходимо исполнять как один поток, так и несколько. В конце концов система может работать в режиме виртуализации: в облаке, в виртуальной машине, песочнице в рамках другой операционной системы. Поэтому мы в обязательном порядке рассмотрим планирование потоков Windows. Это — настолько важная часть материала по многопоточке, что без его понимания многопоточка не встанет на своё место в нашей голове никоим образом.

Итак, начнём. Организация планирования в операционной системе Windows является: гибридной. С одной стороны моделируются условия вытесняющей многозадачности, когда операционная система сама решает, когда и на основе каких условия вытеснить потоки. С другой стороны — кооперативной многозадачности, когда потоки сами решают, когда они всё сделали и можно переключаться на следующий (UMS планировщик). Режим вытесняющей многозадачности является приоритетным, т.к. решает, что будет исполняться на основе приоритетов. Почему так? Потому что у каждого потока есть свой приоритет и операционная система планирует к исполнению более приоритетные потоки. А вытесняющей потому, что если возникает более приоритетный поток, он вытесняет тот, который сейчас исполнялся. Однако во многих случаях это бы означало, что часть потоков никогда не доберется до исполнения. Поэтому в операционной системе есть много механик, позволяющих потокам, которым необходимо время на исполнение его получить несмотря на свой более низкий по сравнению с остальными, приоритет.

Уровни приоритета

Windows имеет 32 уровня приоритета (0-31)

  • 1 уровень (00 — 00) — это Zero Page Thread;
  • 15 уровней (01 — 15) — обычные динамические приоритеты;
  • 16 уровней (16 — 31) — реального времени.

Самый низкий приоритет имеет Zero Page Thread. Это — специальный поток операционной системы, который обнуляет страницы оперативной памяти, вычищая тем самым данные, которые там находились, но более не нужны, т.к. страница была освобождена. Необходимо это по одной простой причине: когда приложение освобождает память, оно может ненароком отдать кому-то чувствительные данные. Личные данные, пароли, что-то ещё. Поэтому как операционная система так и runtime языков программирования (а у нас — .NET CLR) обнуляют получаемые участки памяти. Если операционная система понимает, что заняться особо нечем: потоки либо стоят в блокировке в ожидании чего-либо либо нет потоков, которые исполняются, то она запускает самый низко приоритетный поток: поток обнуления памяти. Если она не доберется этим потоком до каких-либо участков, не страшно: их обнулят по требованию. Когда их запросят. Но если есть время, почему бы это не сделать заранее?

Продолжая говорить о том, что к нам не относится, стоит отметить приоритеты реального времени, которые когда-то давным-давно таковыми являлись, но быстро потеряли свой статус приоритетов реального времени и от этого статуса осталось лишь название. Другими словами, Real Time приоритеты на самом деле не являются таковыми. Они являются приоритетами с исключительно высоким значением приоритета. Т.е. если операционная система будет по какой-то причине повышать приоритет потока с приоритетом из динамической группы (об этом — позже, но, например, потому, что потоку освободили блокировку) и при этом значение до повышения было равно , то повысить приоритет операционная система не сможет: следующее значение равно , а оно — из диапазона реального времени. Туда повышать такими вот «твиками» нельзя.

Чем процесс отличается от потока?… | БCБ на WordPress.com

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

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

С одной стороны, процесс можно рассматривать как способ объединения родственных ресурсов в одну группу. У процесса есть адресное пространство, содержащее текст программы и данные, а также другие ресурсы. Ресурсами являются открытые файлы, дочерние процессы, необработанные аварийные сообщения, обобработчики сигналов, учетная информация и многое другое. Гораздо проще управлять ресурсами, объединив их в форме процесса.

С другой стороны, процесс можно рассматривать как поток исполняемых кокоманд или просто поток. У потока есть счетчик команд, отслеживающий порядок выполнения действий. У него есть регистры, в которых хранятся текущие переменные. У него есть стек, содержащий протокол выполнения процесса, где на каждую процедуру, вызванную, но еще не вернувшуюся, отведен отдельный фрейм. Хотя поток должен исполняться внутри процесса, следует различать концепции потока и процесса. Процессы используются для группирования ресурсов, а потоки являются объектами, поочередно исполняющимися на центральном процессоре.

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

Любой поток состоит из двух компонентов:

объекта ядра, через который операционная система управляет потоком. Там же хранится статистическая информация о потоке(дополнительные потоки создаются также ядром); стека потока, который содержит параметры всех функций и локальные переменные, необходимые потоку для выполнения кода.

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

Я решил не рассказывать о многопоточном программировании сегодня, тем более что есть отличные мануалы по этой теме(ссылка внизу), а просто познакомиться с тем какие средства есть у CSharp для взаимодействия с потоками и процессами. А что рассказывать? MSDN в соседнее от окошка Class1.cs и вперед…=)

Понять пост не читая или для ленивых:

  1. Поток (thread) определяет последовательность исполнения кода в процессе.
  2. Процесс ничего не исполняет, он просто служит контейнером потоков.
  3. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах.
  4. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах.
  5. Так как потоки расходуют существенно меньше ресурсов, чем процессы, старайтесь решать свои задачи за счет использования дополнительных потоков и избегайте создания новых процессов(но подходите к этому с умом).

Ссылка в тему: Основы многопоточного программирования на CSharp: albahari.com/threading/index.html

А почитать еще теории? Рихтер и Таненбаум…

Процессы и потоки

Чтобы поддерживать мультипрограммирование, ОС должна определить и оформить для себя те внутренне единицы работы, между которыми будет разделяться процессор и другие ресурсы компьютера. В настоящее время в большинстве ОС определены два типа единиц работы:

  • Процесс (более крупная единица работы).
  • Поток (нить или тред) – более мелкая единица работы, которую требует для своего выполнения процесс.
  • Когда говорят о процессах, то тем самым хотят отметить, что ОС поддерживает их обособленность: у каждого процесса имеется свое виртуальное адресное пространство, каждому процессу назначаются свои ресурсы – файлы, окна и др. Такая обособленность нужна для того, чтобы защитить один процесс от другого, поскольку они, совместно используя все ресурсы вычислительной системы, конкурируют друг с другом.

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

Для повышения быстродействия процессов есть возможность задействовать внутренний параллелизм в самих процессах.

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

Можно выделить следующие отличия потоков от процессов:

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

Главное, что обеспечивает многопоточность, — это возможность параллельно выполнять несколько видов операций в одной прикладной программе. За счет чего реализуется эффективное использование ресурсов ЦП, а суммарное время выполнения задач становится меньше.

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

Потоки, процессы, контексты…

Системный вызовРежим ядраРежим пользователяПотокПроцесс

  • Регистры процессора.
  • Указатель на стек потока/процесса.
  • Если ваша задача требует интенсивного распараллеливания, используйте потоки одного процесса, вместо нескольких процессов. Все потому, что переключение контекста процесса происходит гораздо медленнее, чем контекста потока.
  • При использовании потока, старайтесь не злоупотреблять средствами синхронизации, которые требуют системных вызовов ядра (например мьютексы). Переключение в редим ядра — дорогостоящая операция!
  • Если вы пишете код, исполняемый в ring0 (к примеру драйвер), старайтесь обойтись без использования дополнительных потоков, так как смена контекста потока — дорогостоящая операция.

Волокно

Как использовать многопоточность в .NETHow to use multithreading in .NET

Начиная с .NET Framework 4 для многопоточности рекомендуется использовать библиотеку параллельных задач (TPL) и Parallel LINQ (PLINQ).Starting with the .NET Framework 4, the recommended way to utilize multithreading is to use Task Parallel Library (TPL) and Parallel LINQ (PLINQ). Дополнительные сведения см. в разделе Параллельное программирование.For more information, see Parallel programming.

Библиотека параллельных задач и PLINQ полагаются на потоки ThreadPool.Both TPL and PLINQ rely on the ThreadPool threads. Класс System.Threading.ThreadPool предоставляет приложения .NET с пулом рабочих потоков.The System.Threading.ThreadPool class provides a .NET application with a pool of worker threads. Также можно использовать потоки из пула потоков.You can also use thread pool threads. Дополнительные сведения см. в разделе Управляемый пул потоков.For more information, see The managed thread pool.

Наконец, можно использовать класс System.Threading.Thread, который представляет управляемый поток.At last, you can use the System.Threading.Thread class that represents a managed thread. Дополнительные сведения см. в разделе Использование потоков и работа с потоками.For more information, see Using threads and threading.

Несколько потоков могут требовать доступ к общему ресурсу.Multiple threads might need to access a shared resource. Чтобы сохранить ресурс в неповрежденном состоянии и избежать состояния гонки, необходимо синхронизировать доступ к нему потоков.To keep the resource in a uncorrupted state and avoid race conditions, you must synchronize the thread access to it. Вы также можете координировать взаимодействие нескольких потоков.You also might want to coordinate the interaction of multiple threads. Платформа .NET предоставляет ряд типов для синхронизации доступа к общему ресурсу или координации взаимодействия потоков..NET provides a range of types that you can use to synchronize access to a shared resource or coordinate thread interaction. Дополнительные сведения см. в разделе Обзор примитивов синхронизации.For more information, see Overview of synchronization primitives.

Исключения следует обрабатывать в потоках.Do handle exceptions in threads. Необработанные исключения в потоках, как правило, приводят к завершению процесса.Unhandled exceptions in threads generally terminate the process. Дополнительные сведения см. в статье Исключения в управляемых потоках.For more information, see Exceptions in managed threads.

Процессоры, ядра и потоки. Топология систем

Потоки и работа с нимиthreads and threading

Потоки и работа с нимиthreads and threading

Поддержка нескольких центральных процессоров в одной системе требует многочисленных изменений в её дизайне. Как минимум, необходимо обеспечить их физическое подключение (предусмотреть несколько сокетов на материнской плате), решить вопросы идентификации процессоров (см. далее в этой статье, а также мою предыдущую заметку), согласования доступов к памяти и доставки прерываний (контроллер прерываний должен уметь маршрутизировать прерывания на несколько процессоров) и, конечно же, поддержки со стороны операционной системы. Я, к сожалению, не смог найти документального упоминания момента создания первой многопроцессорной системы на процессорах Intel, однако Википедия утверждает, что Sequent Computer Systems поставляла их уже в 1987 году, используя процессоры Intel 80386. Широко распространённой поддержка же нескольких чипов в одной системе становится доступной, начиная с Intel Pentium.

Потоки и работа с нимиthreads and threading

Казалось бы, если в системе больше процессоров, то выше её производительность (на задачах, способных задействовать все ресурсы). Однако, если стоимость коммуникаций между ними слишком велика, то весь выигрыш от параллелизма убивается длительными задержками на передачу общих данных. Именно это наблюдается в многопроцессорных системах — как физически, так и логически они находятся очень далеко друг от друга. Для эффективной коммуникации в таких условиях приходится придумывать специализированные шины, такие как Intel QuickPath Interconnect. Энергопотребление, размеры и цена конечного решения, конечно, от всего этого не понижаются. На помощь должна прийти высокая интеграция компонент — схемы, исполняющие части параллельной программы, надо подтащить поближе друг к другу, желательно на один кристалл. Другими словами, в одном процессоре следует организовать несколько ядер, во всём идентичных друг другу, но работающих независимо.

Потоки и работа с нимиthreads and threading

Я не буду пытаться объяснить все плюсы и минусы дизайнов с SMT вообще и с HT в частности. Интересующийся читатель может найти довольно подробное обсуждение технологии во многих источниках, и, конечно же, в Википедии. Однако отмечу следующий важный момент, объясняющий текущие ограничения на число гиперпотоков в реальной продукции.

Другая ситуация наблюдается на типичных задачах, выполняемых на видеоускорителях. Поэтому для этих архитектур характерно использование техники SMT с бóльшим числом потоков. Так как сопроцессоры Intel Xeon Phi (представленные в 2010 году) идеологически и генеалогически довольно близки к видеокартам, на них может быть четыре гиперпотока на каждом ядре — уникальная для IA-32 конфигурация.

Далее для удобства обозначим количества процессоров, ядер и потоков в некоторой системе тройкой (x, y, z), где x — это число процессоров, y — число ядер в каждом процессоре, а z — число гиперпотоков в каждом ядре. Далее я буду называть эту тройку топологией — устоявшийся термин, мало что имеющий с разделом математики. Произведение p = xyz определяет число сущностей, именуемых логическими процессорами системы. Оно определяет полное число независимых контекстов прикладных процессов в системе с общей памятью, исполняющихся параллельно, которые операционная система вынуждена учитывать. Я говорю «вынуждена», потому что она не может управлять порядком исполнения двух процессов, находящихся на различных логических процессорах. Это относится в том числе к гиперпотокам: хотя они и работают «последовательно» на одном ядре, конкретный порядок диктуется аппаратурой и недоступен для наблюдения или управления программам.

Потоки и работа с нимиthreads and threading

Потоки и работа с нимиthreads and threading

Потоки и работа с нимиthreads and threading

Потоки и работа с нимиthreads and threading

В Linux информация о топологии содержится в псевдофайле /proc/cpuinfo, а также выводе команды dmidecode. В примере ниже я фильтрую содержимое cpuinfo на некоторой четырёхядерной системе без HT, оставляя только записи, относящиеся к топологии:

Также их предоставляет консольная утилита Sysinternals Coreinfo и API вызов GetLogicalProcessorInformation.

Потоки и работа с нимиthreads and threadingПотоки и работа с нимиthreads and threadingПотоки и работа с нимиthreads and threading

Общее понятие архитектуры процессора ПК

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

Потоки и работа с нимиthreads and threading

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

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

Стоит отметить, что ЦП, выполняющие одинаковую программную модель, могут значительно отличаться друг от друга микроархитектурой – например, устройства от фирм AMD и Intel. Современные чипы имеют идентичную программную архитектуру x86, но абсолютно разную микроархитектуру.

Потоки или ядра?

Центральный процессор – один из ключевых компонентов системы, влияющих на ее производительность в целевых задачах, а также на удобство использования компьютера. Часто у пользователей, желающих собрать систему, возникает вопрос: на что ориентироваться при выборе ЦП? Стоит ли переплачивать за дополнительные потоки/виртуальные ядра?

Ответ зависит от предполагаемых сценариев использования. В большинстве игр прирост производительности от гиперпоточности окажется минимальным или даже нулевым, а вот добавление физических ядер скажется на частоте кадров явно положительно. Разумеется, если движок игры способен распараллеливать вычисления на такое количество ядер. Многие игры, выпущенные в предыдущие годы, способны работать только с 2-4 ядрами — остальные будут простаивать или заниматься фоновыми программами.

Наибольшую выгоду виртуальные ядра приносят в рабочих задачах, подверженных эффективному распараллеливанию. К ним относятся, например, архивация файлов, обработка фотографий, рендеринг видео, моделирование. Таким образом, польза дополнительных потоков для компьютера, который будет использоваться в первую очередь для игр или медиа, сомнительна. Впрочем, если параллельно с играми будут выполняться и другие задачи, такие как стриминг, запись/обработка видео, скачивание/раздача файлов при помощи торрент-клиента, антивирусная проверка, она возрастает. В подобных ситуациях виртуальные ядра помогают снять фоновую нагрузку с физических.

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

Подытожим: если речь идет о домашнем игровом или мультимедийном компьютере, не стоит ждать чудес от виртуальных ядер, и, если за них придется доплатить ощутимую сумму, лучше рассмотреть вариант с дополнительными физическими, или вложить деньги в другие комплектующие. Если же система будет использоваться для работы – прирост может быть значительным, поэтому стоит ознакомиться с тестами гиперпоточных ЦП для конкретного вида задач.

POSIX threads

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

В связи с этим, появилась необходимость в стандарте для потоков. Для UNIX-подобных операционных систем был принят
стандарт IEEE POSIX 1003.1c (1995). Реализация библиотеки для работы с потоками в соответствии с этим стандартом и называется POSIX threads, или pthreads.

В настоящее время большинство производителей совместно со своими собственными интерфейсами для работы с потоками предлагают Pthreads.
Pthreads обычно представляет собой набор типов и функций на языке си, описанных в файле pthread.h и реализованных в .h, .lib, .dll и т.д. файлах, поставляемых с библиотекой. Иногда pthread входит в состав другой библиотеки (например, libc).

Q&A

Всё ещё не понятно? – пиши вопросы на ящик