Модель вытесняющей многопоточности в Windows NT 6.1

Windows NT 6.1 использует модель вытесняющей многопоточности. Когда запускается приложение, стартует процесс, в нем могут выполнять свою работу один или несколько потоков, все они разделяют общую память и общее адресное пространство. Поток же, в свою очередь, — это обособленная последовательность команд, выполняемая независимо.

Существует три вида потоков:
  • пользовательского уровня — создается в пользовательской программе (на уровне пользователя). Эти потоки в Windows NT проецируются на потоки уровня ядра, так их видит процессор (Ни о каких потоках процессор не знает вообще! У процессора есть контекст исполнения (состояние регистров) и оперативная память. Загрузили программу в память, установили регистры - пошло выполнение. Пришло прерывание - посмотрела ОС, что пора переключать, сохранила контекст, загрузила новый - пошло исполнение другого потока. Такого объекта, как "поток", на уровне процессора не существует. А проецируются друг на друга структуры в памяти, т.е. чисто искусственные образования ОС.);
  • поток ядра — управляется ядром операционной системы;
  • аппаратный поток — единица, исполняемая на процессоре.

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

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