OberonCore https://forum.oberoncore.ru/ |
|
Есть ли в A2 аналог TLS (thread-local-storage)? https://forum.oberoncore.ru/viewtopic.php?f=22&t=6530 |
Страница 1 из 3 |
Автор: | budden [ Пятница, 03 Январь, 2020 14:28 ] |
Заголовок сообщения: | Есть ли в A2 аналог TLS (thread-local-storage)? |
Такой вот вопрос. |
Автор: | budden [ Пятница, 03 Январь, 2020 16:23 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
По состоянию на конец 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 он будет достаточно быстрым. |
Автор: | Sergej Durmanov [ Суббота, 04 Январь, 2020 14:43 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Зачем это? |
Автор: | Comdiv [ Суббота, 04 Январь, 2020 15:54 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Предположу, что основное предназначение, служить костылём для кода, который беззаботно обращается к глобальным переменным без учёта проблем, возникающим в многопоточном коде. По идее, это не нужно, если с самого начала учитывать многопоточность |
Автор: | Sergej Durmanov [ Суббота, 04 Январь, 2020 16:40 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Так в а2 есть активные объекты и мониторы. Зачем там tls? |
Автор: | Ярослав Романченко [ Суббота, 04 Январь, 2020 18:25 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Капец, отсутствие нормальной модульности компенсируют костылями. В АО могут быть переменные модуля, переменные активности и т.д. переменные на любой вкус. |
Автор: | Rifat [ Суббота, 04 Январь, 2020 18:29 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Мне просто интересно, а стек вызовов процедур и функций у активных объектов у каждого свой или же один общий? |
Автор: | Sergej Durmanov [ Суббота, 04 Январь, 2020 19:14 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
У каждой активности свой стэк. |
Автор: | budden [ Воскресенье, 05 Январь, 2020 01:45 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Переменные активности - это и есть частный случай TLS, т.к. сама текущая активность получается именно через TLS - посмотрите как реализована функция Objects.ActiveObject и сколько раз она явно применяется в коде A2. А неявно она, как я понимаю, применяется в каждом обращении к методу или полю текущей активности. Т.е. говорить о ненужности TLS абсолютно неправильно - она лежит в основе A2. Конкретно мне она была нужна для отладочной печати, которая не должна зависеть от типа активного объекта. Во-первых, я не знаю, для любого ли процесса есть активный объект. Во-вторых, если да, то я не знаю, можно ли поменять базовый тип всех активных объектов. В-третьих, если я так поменяю, то это будет называться fragile base class и вообще плохая затея. В отличие от этого, TLS не ломает никаких совместимостей. Переменные модуля вообще не в тему для моей задачи. |
Автор: | Sergej Durmanov [ Воскресенье, 05 Январь, 2020 06:59 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
,у активности есть ссылка на объект, с которым она связана, у объекта есть ссылка на соответствующую активность. Вместе они образуют активный объект. Где в этой схеме tls? Чтобы обратиться к методу объекта активность не нужна. И при вызове метода объекта обращение к активности не происходит. |
Автор: | budden [ Воскресенье, 05 Январь, 2020 10:53 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Я ещё ни разу не пользовался активными объектами и не особо знаю, как они устроены. В любом случае, то, что я написал про функцию Objects.ActiveObjects, остаётся верным - она реализована через TLS и применяется в исходниках более 100 раз, пусть даже в большинстве случаев для ASSERT-ов. Спорить о том, костыль ли TLS или нет, я не планирую ![]() |
Автор: | budden [ Воскресенье, 05 Январь, 2020 11:46 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Comdiv писал(а): Предположу, что основное предназначение, служить костылём для кода, который беззаботно обращается к глобальным переменным без учёта проблем, возникающим в многопоточном коде. По идее, это не нужно, если с самого начала учитывать многопоточность Вероятно, товарищ Комдив допустил опечатку, он хотел написать: Цитата: Предположу, что основное предназначение, служить для создания кода, который беззаботно обращается к "как бы глобальным" переменным без возникновения проблем, типичных для многопоточного кода. Это очень нужно и полезно, т.к. упрощает создание программ, делает их более эффективными и надёжными. Стек процесса является первейшим примером TLS Наводящие соображения: в Delphi есть threadvar. А вот что пишут на SO: https://stackoverflow.com/questions/356 ... we-need-it |
Автор: | budden [ Воскресенье, 05 Январь, 2020 11:56 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Монитор (если он основан на мьютексах) - это довольно дорогостоящая вещь. Это "системный вызов" в Линуксе, не знаю насчёт нативного A2. Всякие там CAS тоже не такие уж безплатные, как кажутся. Любые примитивы блокировки требуют рассуждений об их корректности и могут приводить к задержкам и дедлокам. Если по сути дела нечто относится только к одному треду/процессу/активности, то TLS позволяет безопасно обращаться к этому нечто без всяких мониторов. В A2, видимо, можно использовать текущую активность, но в случае вещей типа отладочной печати, которая может вызываться из любого процесса, это сделать нельзя, не изменив базовый класс активного объекта или как оно там называется. |
Автор: | Sergej Durmanov [ Воскресенье, 05 Январь, 2020 12:15 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Активный объект - это объект, у которого есть активность. Активность существует пока выполняются. После этого активный объект становится пассивным, то есть обычным. Он продолжает существовать, хотя активности уже нет. Поэтому, обращение к полям объекта происходит через ссылку на объект, а не через ссылку на активность. А2 использует возможности нижележащего слоя. Например, виртуальную память для органицации стэка. Также хостовые версии используют реализацию процессов нижележащей ос, и, соответственно, вынуждены использовать определенные правила. Это такой клей между a2 и нижележащей ос. В нативной a2 нет tls, а упомянутая выше процедура Objects.ActiveObject, возвращающая указатель на текущий активный объект, берет из стэка текущей активности ссылку на активность (процесс), и возвращает содержимое поля obj - указатель на активный объект. Естественно, что указатель на активность помещается в стэк при создании. В winaos для этого используются возможности нижележащего слоя, в частности tls. Но этот tls не часть а2. А2 о tls ничего не знает и никак не управляет ( просто вызывает процедуры из Kernel32) |
Автор: | Sergej Durmanov [ Воскресенье, 05 Январь, 2020 12:20 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
budden писал(а): В A2, видимо, можно использовать текущую активность, но в случае вещей типа отладочной печати, которая может вызываться из любого процесса, это сделать нельзя, не изменив базовый класс активного объекта или как оно там называется. Зачем это всё? Межпроцессное взаимодействие в а2 строится не на глобальных переменных и tls, а на разделяемых объектах ( так как память разделяется между всеми потоками ) |
Автор: | Sergej Durmanov [ Воскресенье, 05 Январь, 2020 12:22 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
"Системный вызов" в а2 по стоимости ничем не отличается от вызова процедуры в модуле или метода объекта. |
Автор: | budden [ Воскресенье, 05 Январь, 2020 13:35 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Не знаю, как ещё объяснить. Я думаю, что взаимодействие в A2 можно строить по-разному. Например, если я добавлю поле в активный объект, то чем это отличается от TLS по сути? Далее, разделяемая память - это плохая идея вообще. Она противоречит идее разделения ответственности, т.к. нет "владельца" данного куска памяти. Не только на уровне аппаратной защиты, а даже на уровне логики программы. Если мы хотим разделить ответственность и если у нас есть абстракция процесса (треда, активности) как "изолированно текущего потока времени", то и TLS нужен. Просто, если его нет в явном виде, то в его роли выступает либо активный объект, позволяющий (ненадёжно) инкапсулировать то, что является контекстом данного процесса, либо мы вынуждены делать это на стеке. Но я обещал не спорить. Однако я пытаюсь объяснить, т.к. Вы мне много полезного рассказываете и хочу по возможности вернуть долг ![]() Касаемо реализации ActiveObject на железе, то я уже выяснил, что берётся донышко стека и хранилище TLS (укзатель на объект процесса) находится там. В упомянутом обсуждении на SO это приведено как один из вариантов реализации TLS. Так что активности в A2 и на железе, можно сказать, основаны на TLS. А дальше уже наш выбор: либо мы видим эту абстракцию, либо не видим. Её пользу я считаю доказуемой, поскольку это один из вариантов инкапсуляции. Но давайте определимся, нужно ли Вам, чтобы я это попытался доказать или нет? |
Автор: | budden [ Воскресенье, 05 Январь, 2020 13:36 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Sergej Durmanov писал(а): "Системный вызов" в а2 по стоимости ничем не отличается от вызова процедуры в модуле или метода объекта. Даже если так, мониторы имеют свою стоимость: это ожидание их освобождения другими процессами, усложнение программной логики, усложнение динамического поведения программы. |
Автор: | Comdiv [ Воскресенье, 05 Январь, 2020 22:33 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
budden писал(а): Стек процесса является первейшим примером TLS Если Вы, действительно, так считаете, то о чём же тогда спрашивает заглавный вопрос темы?budden писал(а): Есть ли в A2 аналог TLS?
|
Автор: | budden [ Воскресенье, 05 Январь, 2020 23:05 ] |
Заголовок сообщения: | Re: Есть ли в A2 аналог TLS (thread-local-storage)? |
Есть TLS как абстракция (данные, к-рые по умолчанию принадлежат только одному потоку выполнения, в отличие от данных на куче, которые по умолчанию принадлежат всем и никому). В этом смысле текущий активный объект и стек процесса - это примеры воплощения абстракции TLS. В определённой степени приближения - не знаю, можем ли мы передать ссылку на наш активный объект другому процессу, чтобы он там лазил грязными руками. Данные на стеке, от которых нельзя взять адрес, чуть больше похожи на настоящий TLS. А есть TLS как конкретный механизм, который в Дельфи воплощён в слове threadvar. Мне именно он нужен. Но я уже понял, что его нет. Вопрос теперь - как сделать. Но не очень актуальный вопрос, потому что я уже разместил эти данные на стеке. Неудобно, но задача решена. У Вас есть идеи, как сделать? Или только идеи о том, почему он не нужен? Первый вид идей я бы оценил гораздо выше ![]() |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |