Защита локального хранилища потока от других потоков

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

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


person aminfar    schedule 22.06.2015    source источник
comment
Что ж, переменные стека / локального / автоматического хранения не требуют накладных расходов на синхронизацию, когда данные не используются совместно между потоками.   -  person Martin James    schedule 23.06.2015
comment
Я сказал, что им нужна синхронизация ?!   -  person aminfar    schedule 23.06.2015
comment
Нет, но вы подразумевали, что данные TLS были определены тем, что не требовали синхронизации, когда данные не используются совместно между потоками. Я указал, что это слишком узкое описание.   -  person Martin James    schedule 23.06.2015
comment
Можно было бы включить некоторую форму защиты памяти для каждого потока, используя новый 'SGX 'инструкции в последних процессорах Intel. Однако аппаратная поддержка в настоящее время очень скудна. В противном случае вам придется пойти на многое, чтобы добиться этого эффекта - каждый системный вызов учитывается, все остальные потоки приостанавливаются, пока страницы памяти TLS доступны для записи и т. Д.   -  person Cauterite    schedule 13.09.2016


Ответы (2)


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

Тот факт, что локальное хранилище потока управляется ОС, означает, что фактическое расположение локального хранилища потока в памяти процесса напрямую не объявляется. Чтение и запись в TLS «управляется» операционной системой с относительно низкими накладными расходами (вызов функции) путем предоставления простого API Get / Set. Защита здесь в основном заключается в удобстве, поскольку затрудняет случайный доступ к данным, принадлежащим (также доступным) другому потоку.

person Mike Dinescu    schedule 22.06.2015
comment
Спасибо за содержательный ответ. Пара вопросов. 1. Если чтение / запись из / в TLS управляется системными вызовами, я считаю это дорогостоящим. Или, может быть, вы имеете в виду, что это делается через вызовы функций на уровне пользователя без участия ОС? 2. А как насчет стека? Стеки являются частными для каждого потока. Допустим, я плохой программист и как-то испортил стек другого потока. Тогда ОС меня останавливает? Думаю, нет. - person aminfar; 23.06.2015
comment
Для меня вары TLS не намного лучше глобальных варов для нескольких потоков. - person Martin James; 23.06.2015
comment
Почему он или она? Десяток причин. Например, предположим, что объекту нужно что-то регистрировать, а регистратор имеет свой собственный поток. Скажем, контейнер необходимо отсортировать, а логика сортировки использует несколько потоков. Вся суть потоков заключается в том, что объекты принадлежат процессу, поэтому вам обычно не нужно беспокоиться о том, какой поток что-то делает. - person David Schwartz; 23.06.2015
comment
@aminfar Если вы будете делать что-то плохое в процессе, то и плохое случится. Если две вещи нужно изолировать друг от друга, не объединяйте их в один процесс. Потоки должны взаимодействовать. - person David Schwartz; 23.06.2015

Не требует механизма защиты. Фактически, защитный механизм только усложнит задачу. Например, предположим, что поток хочет отсортировать один из своих объектов, поэтому он передает его методу сортировки. Что произойдет, если этот метод сортировки использует несколько потоков «под капотом» для сортировки?

Итак, ваш вопрос основан на совершенно ложной предпосылке. Такой механизм защиты означал бы, что каждый метод, работающий с объектом, должен был бы объявлять, безопасно ли работать с данными, зависящими от потока, что было бы кошмаром.

person David Schwartz    schedule 23.06.2015