Что такое потоковый контекст?

Содержит ли контекст нити персональную память потока? Если да, то как распределяется память между несколькими потоками?

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

Причина, по которой я думал/думал, что у каждого потока есть какая-то частная память, была из-за ключевого слова volatile в Java и .NET, и как разные потоки могут иметь разные значения для одного и того же примитива, если он не используется. Это всегда подразумевало личную память для меня.

Поскольку я не понимал, что термин был более общим, я предполагаю, что я спрашиваю, как работает контекстная коммутация в Java и С#.

Ответ 1

Причина, по которой я думал/думал, что у каждого потока есть какая-то частная память, была из-за ключевого слова volatile в Java и .NET, и как разные потоки могут иметь разные значения для одного и того же примитива, если он не используется. Это всегда подразумевало личную память для меня.

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

  • Все потоки в процессе имеют одно и то же адресное пространство виртуальной памяти, но
  • Любые два потока могут в любой момент не согласиться с содержимым этого пространства

Как это может быть? Потому что

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

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

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

Если это не ясно, начните с чтения моей статьи, объясняя, что означает "volatile" в С#:

http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx

А затем прочитайте раздел "Необходимость в моделях памяти" в статье Ванса:

http://msdn.microsoft.com/en-us/magazine/cc163715.aspx

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

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

Ответ 2

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

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

Я не считаю себя огромным экспертом по этой теме.. но это то, что я всегда понимал, что конкретный термин означает.