Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 20, 2024 03:45

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Хип и многопоточность.
СообщениеДобавлено: Пн дек 28, 2009 12:09 
Не в сети
Moderator
Moderator
Аватара пользователя

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

Логично, что у каждого потока должен быть собственный хип, с которым он и должен работать, так сделано в СПФ, но к примеру в Win32Forth используется глобальный хип, и любой поток получает память в нем. Есть и другие решения, например SwiftForth использует механизм VirtualAlloc, не привязанный к какому либо хипу.

В стандарте я не нашел (может пропустил) на этот счет никаких указаний.

Проблема возникает в случае обработки callback вызовов, потому что в случае СПФ использовать хип можно только на время одиночного колбэк вызова, то есть по выходу из callback процедуры хип удаляется.

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
Логично, что у каждого потока должен быть собственный хип, с которым он и должен работать

Это логично. Но логичны и другие решения - тут уж как потребует программист.
mOleg писал(а):
В стандарте я не нашел (может пропустил) на этот счет никаких указаний.

И правильно.
mOleg писал(а):
Проблема возникает в случае обработки callback вызовов, потому что в случае СПФ использовать хип можно только на время одиночного колбэк вызова, то есть по выходу из callback процедуры хип удаляется.

Если это память, выделяемая самой процедурой, то ничего странного - она не мусорит, и правильно делает. Тогда надо еще посмотреть, зачем пользоваться ее хипом. Может быть, дело в том, что процедура не переложила ожидаемые от нее данные куда-нибудь в более надежное место?


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

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

Проблема в том, что не подходит такое общее решение.
Любая динамическая структура данных оказывается недоступной внутри callback, а это не приятно, так как надо следить за тем, какой код используется для таких вызвовов. В случае, когда у каждого потока индивидуальный ХИП просто невозможно работать стандартными средствами (ALLOCATE FREE) с динамическими структурами данных "подписанного" на асинхронное событие потока.
(Кстати, это проблема винды, в линуксе ее нет, в силу другого вида многозадачности).

Хищник писал(а):
mOleg писал(а):В стандарте я не нашел (может пропустил) на этот счет никаких указаний.
И правильно.

не знаю на сколько это правильно. Это "узкое место" из-за которого код будет не переносим между системами.

Хищник писал(а):
Если это память, выделяемая самой процедурой, то ничего странного - она не мусорит, и правильно делает. Тогда надо еще посмотреть, зачем пользоваться ее хипом. Может быть, дело в том, что процедура не переложила ожидаемые от нее данные куда-нибудь в более надежное место?

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

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
В случае, когда у каждого потока индивидуальный ХИП просто невозможно работать стандартными средствами (ALLOCATE FREE) с динамическими структурами данных "подписанного" на асинхронное событие потока.
(Кстати, это проблема винды, в линуксе ее нет, в силу другого вида многозадачности).

Вариант 1 - обертка. Вариант 2 - подойти к проблеме с той стороны, что если уж проблема есть, значит, она откуда-то взялась. И можно сначала посмотреть, откуда именно, и не стоит ли ее аккуратно обойти. Может быть, просто не "желать странного"?


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

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

не совсем понятно как.

Хищник писал(а):
Вариант 2 - подойти к проблеме с той стороны, что если уж проблема есть, значит, она откуда-то взялась.

вот в голову приходят следующие решения:

1) ограничить используемые средства в колбэк вызове
2) в "подписавшемся потоке" создать аналог message-loop и копировать в него данные (но тут могут возникнуть неприятности, например всвязи с рекурсивными колбэк вызовами).
3) сделать хип глобальным для всех потоков процесса и мириться с возможными утечками памяти, отдельно заботиться об освобождении памяти при завершении потока. То есть, ALLOCATE будет выделять память из любого потока в одном месте.
???

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


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

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

mOleg писал(а):
мириться с возможными утечками памяти,

Кстати в однопоточном приложении используется хип основного потока
и его (поток) удалять нельзя ,так что память всё равно в ручную чистить надо :)

mOleg писал(а):
в "подписавшемся потоке" создать аналог message-loop и копировать в него данные

ну и зачем такие сложности.

mOleg посмотри почту еще примерчик на эту тему


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

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

да можно. Собственно проблема лишь в том, как это назвать 8) я имею ввиду набор имен на замену ALLOCATE и FREE.

_Harry писал(а):
Тем более стандарт не указывает где память выделять. Как основной механизм - ипользование хипа процесса

тем более, что в форке стандарт послан подальше ;) как тормозящий развитие.

_Harry писал(а):
Может они будут использоваться в других потоках, тогда хип процесса вне конкуренции.

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

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


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

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

О вопрос задан правильно т. е . пол ответа уже есть. Можно и совсем без него.
так как это сделано в виндовс создает больше проблем чем пользы.
По идее нужно было бы кроме закрытия доступа к изменению
размеров блока в хипе потока закрыть запись и чтение в него из других потоков.
Тогда был бы какойто смысл в хипе потока ( типа локальных переменных ).
Но это видимо потребует большой траты ресурсов.
Так что получилось не то ни се, и неудобств много, и пользы мало.

Есть одно но, вопросы совместимости :shuffle;
Или уже нет? :roll:


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
тут возникает вопрос, а нужен ли вообще хип потока?
Хипов может быть много, зачем фиксировать тогда за потоком один хип, тем более, что не удобно им пользваться.

Вообще постановка вопроса немного неясна. Зачем закреплять хип за потоками? Какая цель преследуется по сравнению с ALLOCATE/FREE?


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

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

дело в том, что в рамках одного процесса в СПФ для каждого потока создается свой хип.
И ALLOCATE выделяет память для каждого потока в другом хипе. Именно об этом речь, так как с одной стороны такой подход логичен, а с другой неудобен.

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


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

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

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

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


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

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


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

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


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

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