OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 05 Июль, 2022 01:07

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Есть ли в A2 аналог TLS (thread-local-storage)?
СообщениеДобавлено: Пятница, 03 Январь, 2020 14:28 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Такой вот вопрос.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 03 Январь, 2020 16:23 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
По состоянию на конец 2016-го, можно его реализовать, добавив поле в Process, но получение текущего процесса - вещь, вообще говоря, дорогостоящая в A2. В Unix.Objects.Mod получаем некий индекс текущего процесса от pthread_self.

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

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

На SO Linux's thread local storage implementation пишут, что контейнер с данными TLS - это глобальная переменная, к-рая выделяется под каждый тред и переключается при переключении процесса. Поэтому она быстра, не требует мьютексов и магически правильна. Думаю, это неправда и зависит от конкретной платформы и конкретного линукса.

В Win реализации A2 (win32.Objects.Mod) используется TLS из ОС. Думается, работает оно не хуже, чем в Линуксе.

В Objects.Mod (думаю, это реализация на железе?) используется Machines.GetProcessPtr.

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

Соответственно, ориентировочно получается, что на "виртуальной" A2 поверх других ОС TLS может быть медленным, но на нативной A2 он будет достаточно быстрым.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Январь, 2020 14:43 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 260
Откуда: Russia
Зачем это?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Январь, 2020 15:54 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1338
Откуда: Киев
Предположу, что основное предназначение, служить костылём для кода, который беззаботно обращается к глобальным переменным без учёта проблем, возникающим в многопоточном коде. По идее, это не нужно, если с самого начала учитывать многопоточность


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Январь, 2020 16:40 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 260
Откуда: Russia
Так в а2 есть активные объекты и мониторы. Зачем там tls?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Январь, 2020 18:25 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Капец, отсутствие нормальной модульности компенсируют костылями. В АО могут быть переменные модуля, переменные активности и т.д. переменные на любой вкус.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Январь, 2020 18:29 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 986
Откуда: Казань
Мне просто интересно, а стек вызовов процедур и функций у активных объектов у каждого свой или же один общий?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 04 Январь, 2020 19:14 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 260
Откуда: Russia
У каждой активности свой стэк.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 01:45 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Переменные активности - это и есть частный случай TLS, т.к. сама текущая активность получается именно через TLS - посмотрите как реализована функция Objects.ActiveObject и сколько раз она явно применяется в коде A2. А неявно она, как я понимаю, применяется в каждом обращении к методу или полю текущей активности.

Т.е. говорить о ненужности TLS абсолютно неправильно - она лежит в основе A2.

Конкретно мне она была нужна для отладочной печати, которая не должна зависеть от типа активного объекта. Во-первых, я не знаю, для любого ли процесса есть активный объект. Во-вторых, если да, то я не знаю, можно ли поменять базовый тип всех активных объектов. В-третьих, если я так поменяю, то это будет называться fragile base class и вообще плохая затея.

В отличие от этого, TLS не ломает никаких совместимостей.

Переменные модуля вообще не в тему для моей задачи.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 06:59 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 260
Откуда: Russia
,у активности есть ссылка на объект, с которым она связана, у объекта есть ссылка на соответствующую активность. Вместе они образуют активный объект. Где в этой схеме tls? Чтобы обратиться к методу объекта активность не нужна. И при вызове метода объекта обращение к активности не происходит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 10:53 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Я ещё ни разу не пользовался активными объектами и не особо знаю, как они устроены. В любом случае, то, что я написал про функцию Objects.ActiveObjects, остаётся верным - она реализована через TLS и применяется в исходниках более 100 раз, пусть даже в большинстве случаев для ASSERT-ов. Спорить о том, костыль ли TLS или нет, я не планирую :) Моя конкретная задача: при отладочной печати дерева объектов нужно хранить некий контекст, например, текущую глубину вложенности. Я решил вопрос, добавив VAR параметр в десяток функций, но это многословно, не слишком эффективно и обладает некоторыми ограничениями, т.к. я не могу сохранять этот контекст между соседними вызовами печати.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 11:46 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Comdiv писал(а):
Предположу, что основное предназначение, служить костылём для кода, который беззаботно обращается к глобальным переменным без учёта проблем, возникающим в многопоточном коде. По идее, это не нужно, если с самого начала учитывать многопоточность

Вероятно, товарищ Комдив допустил опечатку, он хотел написать:
Цитата:
Предположу, что основное предназначение, служить для создания кода, который беззаботно обращается к "как бы глобальным" переменным без возникновения проблем, типичных для многопоточного кода. Это очень нужно и полезно, т.к. упрощает создание программ, делает их более эффективными и надёжными. Стек процесса является первейшим примером TLS


Наводящие соображения: в Delphi есть threadvar.
А вот что пишут на SO: https://stackoverflow.com/questions/356 ... we-need-it


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 11:56 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Монитор (если он основан на мьютексах) - это довольно дорогостоящая вещь. Это "системный вызов" в Линуксе, не знаю насчёт нативного A2. Всякие там CAS тоже не такие уж безплатные, как кажутся. Любые примитивы блокировки требуют рассуждений об их корректности и могут приводить к задержкам и дедлокам. Если по сути дела нечто относится только к одному треду/процессу/активности, то TLS позволяет безопасно обращаться к этому нечто без всяких мониторов.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 12:15 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 260
Откуда: Russia
Активный объект - это объект, у которого есть активность. Активность существует пока выполняются. После этого активный объект становится пассивным, то есть обычным. Он продолжает существовать, хотя активности уже нет.
Поэтому, обращение к полям объекта происходит через ссылку на объект, а не через ссылку на активность.
А2 использует возможности нижележащего слоя. Например, виртуальную память для органицации стэка. Также хостовые версии используют реализацию процессов нижележащей ос, и, соответственно, вынуждены использовать определенные правила. Это такой клей между a2 и нижележащей ос.
В нативной a2 нет tls, а упомянутая выше процедура Objects.ActiveObject, возвращающая указатель на текущий активный объект, берет из стэка текущей активности ссылку на активность (процесс), и возвращает содержимое поля obj - указатель на активный объект. Естественно, что указатель на активность помещается в стэк при создании.
В winaos для этого используются возможности нижележащего слоя, в частности tls. Но этот tls не часть а2. А2 о tls ничего не знает и никак не управляет ( просто вызывает процедуры из Kernel32)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 12:20 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 260
Откуда: Russia
budden писал(а):
В A2, видимо, можно использовать текущую активность, но в случае вещей типа отладочной печати, которая может вызываться из любого процесса, это сделать нельзя, не изменив базовый класс активного объекта или как оно там называется.

Зачем это всё? Межпроцессное взаимодействие в а2 строится не на глобальных переменных и tls, а на разделяемых объектах ( так как память разделяется между всеми потоками )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 12:22 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 260
Откуда: Russia
"Системный вызов" в а2 по стоимости ничем не отличается от вызова процедуры в модуле или метода объекта.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 13:35 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Не знаю, как ещё объяснить. Я думаю, что взаимодействие в A2 можно строить по-разному. Например, если я добавлю поле в активный объект, то чем это отличается от TLS по сути? Далее, разделяемая память - это плохая идея вообще. Она противоречит идее разделения ответственности, т.к. нет "владельца" данного куска памяти. Не только на уровне аппаратной защиты, а даже на уровне логики программы.

Если мы хотим разделить ответственность и если у нас есть абстракция процесса (треда, активности) как "изолированно текущего потока времени", то и TLS нужен. Просто, если его нет в явном виде, то в его роли выступает либо активный объект, позволяющий (ненадёжно) инкапсулировать то, что является контекстом данного процесса, либо мы вынуждены делать это на стеке.

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

Касаемо реализации ActiveObject на железе, то я уже выяснил, что берётся донышко стека и хранилище TLS (укзатель на объект процесса) находится там. В упомянутом обсуждении на SO это приведено как один из вариантов реализации TLS. Так что активности в A2 и на железе, можно сказать, основаны на TLS.

А дальше уже наш выбор: либо мы видим эту абстракцию, либо не видим. Её пользу я считаю доказуемой, поскольку это один из вариантов инкапсуляции. Но давайте определимся, нужно ли Вам, чтобы я это попытался доказать или нет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 13:36 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Sergej Durmanov писал(а):
"Системный вызов" в а2 по стоимости ничем не отличается от вызова процедуры в модуле или метода объекта.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 22:33 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1338
Откуда: Киев
budden писал(а):
Стек процесса является первейшим примером TLS
Если Вы, действительно, так считаете, то о чём же тогда спрашивает заглавный вопрос темы?
budden писал(а):
Есть ли в A2 аналог TLS?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 23:05 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1447
Есть TLS как абстракция (данные, к-рые по умолчанию принадлежат только одному потоку выполнения, в отличие от данных на куче, которые по умолчанию принадлежат всем и никому).

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

А есть TLS как конкретный механизм, который в Дельфи воплощён в слове threadvar. Мне именно он нужен. Но я уже понял, что его нет. Вопрос теперь - как сделать. Но не очень актуальный вопрос, потому что я уже разместил эти данные на стеке. Неудобно, но задача решена. У Вас есть идеи, как сделать? Или только идеи о том, почему он не нужен? Первый вид идей я бы оценил гораздо выше :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2022, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB