Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 01:38

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: О пользовательских переменных, хипе и проблемах
СообщениеДобавлено: Сб янв 17, 2009 20:39 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
О пользовательских переменных, хипе, и некоторых проблемах с ними связанных.

Пользовательские (далее USER) переменные тесно связаны с многопоточностью в windows модели (это когда один код может разделять несколько одновременно исполняющихся процессов, которые, собственно, и называются потоками). Особенностью такой модели является разделения всеми потоками статической части кода и данных программы (форт-системы в нашем случае). При этом возникает необходимость создания переменных, уникальных для каждого потока, но с точки зрения, как имен переменных, так и кода с их участием разделяемых всеми потоками. Интерфейс к USER переменным не является стандартизированным, и в каждой Форт-системе может быть свой, поэтому для определенности выберем вариант, используемый в СПФ и его клонах.

При запуске каждого нового потока в хипе (heap) выделяется блок памяти всегда одинакового размера, который связан с размером уже созданных в USER области переменных плюс некий запас (tls-reserve), адрес начала этого самого блока памяти запоминается в регистр EDI. Из Форта к EDI получить доступ можно с помощью слов TlsIndex@ TlsIndex! . Итак, адресация данных внутри USER области ведется по принципу: disp TlsIndex@ + то есть к адресу начала пользовательской области добавляется смещение внутри нее. Так как все регистры у каждого потока содержат собственные (уникальные) данные, TlsIndex каждого потока указывает на собственный участок памяти, а пользовательские переменные являются приватными. Однако же, пользовательские переменные оказываются более медленными, чем обычные VARIABLE , VALUE и VECT, данные в которых разделяют все потоки, так как каждый раз приходится вычислять адрес значения переменной (то есть два обращения к памяти вместо одного).
Как и обычных переменных, пользовательских три типа имеется: USER USER-VALUE USER-VECT , поведение которых соответствует аналогичным: VARIABLE , VALUE и VECT .

При запуске каждого нового потока внутри Форт-системы каждый раз создается новый хип, пользовательская область, а так же инициализируются все системные переменные, в том числе и некоторые пользовательские переменные. То есть надо помнить, что у каждого потока свои ХИП и ПОЛЬЗОВАТЕЛЬСКАЯ область памяти. Соответственно, при завершении потока, и хип процесса и его пользовательская область освобождаются.

Наиболее острой проблемой является то, что при CALLBACK вызовах форт система (СПФ) запускает обработчик каждый раз в новом потоке (создает его при каждом вызове), и все USER переменные не принадлежат тому потоку, который запрашивал этот самый CALLBACK. Второй проблемой, с которой реально столкнуться – это попытка обращения к данным, находящимся в хипе убитого процесса.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: О пользовательских переменных, хипе и проблемах
СообщениеДобавлено: Пн янв 19, 2009 17:24 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg писал(а):
О пользовательских переменных, хипе, и некоторых проблемах с ними связанных.

Итак, адресация данных внутри USER области ведется по принципу: disp TlsIndex@ + то есть к адресу начала пользовательской области добавляется смещение внутри нее.


disp это USER-HERE ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 19, 2009 19:06 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
_Harry писал(а):
disp это USER-HERE ?

USER-HERE - это указатель на первую свободную ячейку в USER области.
когда создается очередная переменная USER-HERE увеличивается на ее величину, а disp - это значение USER-HERE перед его увеличением.
То есть у каждой переменной свой адрес в USER области.
USER-HERE и USER-ALLOT - это способ резервирования пространства.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 20, 2009 00:06 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Ну для полной ясности :
Адрес последней созданой переменой USER (который она положит на стек)
Код:
TlsIndex@ USER-HERE + CELL -
так? :writer;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 20, 2009 21:50 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
_Harry писал(а):
Ну для полной ясности :

Адрес последней созданой переменой USER (который она положит на стек)

Код:TlsIndex@ USER-HERE + CELL - так?

так, при условии что переменная заняла CELL (а не больше или не меньше места).

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 20, 2009 23:55 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
Наиболее острой проблемой является то, что при CALLBACK вызовах форт система (СПФ) запускает обработчик каждый раз в новом потоке (создает его при каждом вызове)

Неверно.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 21, 2009 00:00 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
mOleg писал(а):Наиболее острой проблемой является то, что при CALLBACK вызовах форт система (СПФ) запускает обработчик каждый раз в новом потоке (создает его при каждом вызове)

Неверно.

?
<pre>
: EXTERN ( xt1 n -- xt2 )
HERE
SWAP LIT,
['] FORTH-INSTANCE> COMPILE,
SWAP COMPILE,
['] <FORTH-INSTANCE COMPILE,
RET,
;

: CALLBACK: ( xt n "name" -- )
\ Здесь n в байтах!
EXTERN
HEADER
['] _WNDPROC-CODE COMPILE,
,
;

FORTH-INSTANCE> =

: USER-INIT ( n )
\ n - размер параметров, к-е Windows передает callback процедуре (в байтах)
CREATE-HEAP
<SET-EXC-HANDLER>
POOL-INIT
AT-THREAD-STARTING
;
</pre>
поясните тогда логику работы (все будут благодарны)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 21, 2009 01:22 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Я эту логику не разбирал, т.к. не было нужды - работает и ладно. Видно что создаётся новая USER-область. Запуска потока не видно.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 21, 2009 11:53 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
Я эту логику не разбирал, т.к. не было нужды - работает и ладно.

тогда не надо делать громких заявлений.

ygrek писал(а):
Видно что создаётся новая USER-область. Запуска потока не видно.

вероято, потому что надо разбираться в том, как запускается потоки в СПФ...

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 21, 2009 13:21 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
А поток по идее должен запускаться системой.
Она же запускает CALLBACK или как ??? :roll:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 21, 2009 13:31 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
_Harry писал(а):
А поток по идее должен запускаться системой.
Она же запускает CALLBACK или как ???

боюсь, что так, иначе совсем не понятно, почему в нескольких форт системах Callback-и запускаются в отдельном потоке.
С другой стороны не совсем ясно, что мешает каждому колбэку присвоить id потока, и после его срабатывания установить USER область соответствующего потока. Однако, все не так уж и просто, потому что сегмент FS: (точнее его содержимое) будет уникально, кроме того, не совсем ясно куда сохранять TlsIndex (то есть EDI, который указатель на USER область), и еще одно но: хип у каждого потока свой, и, хотя, вроде бы хип другого потока должен быть виден (надо только знать его id). Вобщем надо разбираться в устройстве винды...

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 22, 2009 03:14 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
<pre>\ $Id: push.f,v 1.2 2008/07/24 20:09:39 ygreks Exp $
\
\ X/Motif example -- http://www.cs.cf.ac.uk/Dave/X_lecture/node5.html

REQUIRE SO ~ac/lib/ns/so-xt.f

\ important: link Xm before Xt
\ http://www.faqs.org/faqs/motif-faq/part9/section-29.html
ALSO SO NEW: libXm.so.3
ALSO SO NEW: libXt.so.6
ALSO SO NEW: libX11.so.6

0 CONSTANT NULL

VARIABLE top_wid
VARIABLE button
VARIABLE app

VARIABLE argv
VARIABLE argc

:NONAME
." Don't Push Me!!"
SPACE THREAD-ID U. CR
0
; 3 CELLS CALLBACK: pushed_fn

: main
\ initialize Xt and create top widget
NULL NULL argv argc 0 NULL S" Push" DROP app 8 XtVaAppInitialize top_wid !

\ create button
0 NULL S" Push_me" DROP top_wid @ 4 XmCreatePushButton button !

\ tell Xt to manage button
button @ 1 XtManageChild DROP

\ attach callback to widget
NULL ['] pushed_fn S" activateCallback" DROP button @ 4 XtAddCallback DROP

\ display widget hierarchy
top_wid @ 1 XtRealizeWidget DROP

." main : "
THREAD-ID U. CR

\ enter processing loop
app @ 1 XtAppMainLoop DROP
;

main
</pre>

Цитата:
main : 3084666544
Don't Push Me!! 3084666544
Don't Push Me!! 3084666544


Не вижу нового потока.

Покажите мне код в src где
mOleg писал(а):
форт система (СПФ) запускает обработчик каждый раз в новом потоке (создает его при каждом вызове)

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 22, 2009 03:22 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
вероято, потому что надо разбираться в том, как запускается потоки в СПФ...

Словом START, которое принимает xt обёрнутый в TASK который создаёт новую USER-область до передачи управения xt.
При вызове слова созданного CALLBACK:'ом создаётся новая USER-область, но из этого не следует что запускается новый поток.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 22, 2009 21:12 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
Словом START, которое принимает xt обёрнутый в TASK который создаёт новую USER-область до передачи управения xt.

вообще, похоже мы оба правы.

действительно новый поток, то есть CreateThread, не создается, но и только, потому что при CALLBACK вызове создается новый хип, создается и инициализируется USER область, выделяется место под стеки, ТО ЕСТЬ, практически выполняется вся работа по инициализации нового потока...

Интересный вопрос ЗАЧЕМ?

И еще, очень жаль, что нет нормальной документации по процессу инициализации и взаимодействия с системой 8(

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 23, 2009 00:51 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
Интересный вопрос ЗАЧЕМ?

Очевидно, затем что callback может вызываться из потока не проинициализированного форт-системой и соответственно использовать USER нельзя будет. А так -- можно. Если же надо использовать USER-область какого-то конкретного потока - передайте и установите в callback нужный TlsIndex. Смотрите примеры в devel.

Если callback гарантированно будет вызывается в контексте потока созданного форт-системой, то инициализацию USER-области можно не проводить -- используя облегчённую реализацию CALLBACK: -- ~af/lib/QuickWNDPROC.f

_________________
http://forth.org.ru/~ygrek


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB