OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 05:06

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




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Среда, 21 Июль, 2010 18:13 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В Oberon at glance указано ограничение для ARM-версии
Open arrays as parameters cannot have more than one dimension.
Значит, что-то может и на динамически создаваемые массивы влиять.
Смотрим дальше.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 19:18 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Alexey Veselovsky писал(а):
Валерий Лаптев писал(а):
Вообще-то Фортран много лет обходился без динамических массивов... :)
Кроме того, на базе фиксированного массива большого размера можно построить систему распределения памяти. Например, см. Холл "Вычислительные структуры"... :)

Угу. Менеджер памяти написать для своей виртуальной машины :-)
Это называется -- эмуляция.

Кроме того, речь идет не о динамических массивах (размер которых можно менять ПОСЛЕ создания), а о обычных массивах просто размер которых не известен на момент компиляции. Скажите лучше, что в них плохого?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 19:57 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Валерий Лаптев писал(а):
Плохого ничего нет. Поскольку фортран без них обходился, дело, видимо, было в пресловутой эффективности. Надо иметь как минимум в операционной системе систему динамического распределения памяти. В ОС такая система неизбежно универсальная, отсюда издержки при выделении и возврате памяти. Если в языке разрешить только динамические массивы (указатели как отдельный тип - отсутствуют), то можно такую систему соптимизировать и издержки уменьшить.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 21:42 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Alexey Veselovsky писал(а):
Валерий Лаптев писал(а):
Плохого ничего нет. Поскольку фортран без них обходился, дело, видимо, было в пресловутой эффективности. Надо иметь как минимум в операционной системе систему динамического распределения памяти. В ОС такая система неизбежно универсальная, отсюда издержки при выделении и возврате памяти. Если в языке разрешить только динамические массивы (указатели как отдельный тип - отсутствуют), то можно такую систему соптимизировать и издержки уменьшить.

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

Ну, в конечном итоге все равно выполняется обращение в функции API за памятью. Ибо уже давно нет осей без динамического распределения памяти. Я имею ввиду оси общего назначения. В системах реального времени память как раз лучше фиксировано распределить при разработке. Для эффективности.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 22:08 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Валерий Лаптев писал(а):
Alexey Veselovsky писал(а):
Валерий Лаптев писал(а):
Плохого ничего нет. Поскольку фортран без них обходился, дело, видимо, было в пресловутой эффективности. Надо иметь как минимум в операционной системе систему динамического распределения памяти. В ОС такая система неизбежно универсальная, отсюда издержки при выделении и возврате памяти. Если в языке разрешить только динамические массивы (указатели как отдельный тип - отсутствуют), то можно такую систему соптимизировать и издержки уменьшить.

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

Ну, в конечном итоге все равно выполняется обращение в функции API за памятью. Ибо уже давно нет осей без динамического распределения памяти. Я имею ввиду оси общего назначения. В системах реального времени память как раз лучше фиксировано распределить при разработке. Для эффективности.

Это, опять таки, к массивам с размером неизвестным на этапе компиляции, отношения не имеет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Июль, 2010 06:24 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Alexey Veselovsky писал(а):
Я таки дико извиняюсь, но при чем тут ОС? Менеджер памяти это чисто библиотечное средство. В частности их можно легко менять, и вообще можно написать свой.
Иногда очень даже причем.
Как-то тут была беседа про релокацию (скажем, изменение размера массива в run-time), и приводилась ссылка на библиотеку, которая это умеет.
Так вот, умеет это она лишь путем тупого копирования старого контекста в новый. И никак иначе (если ты отвел себе память через VirtualAlloc, и работаешь далее только с ней)
А ось умеет сделать ремэпинг (речь идет, естественно, о действительно больших размерах, а не осотне-другой байт). И никогда ось не отдаст эту возможность на уровень приложения.

Как-то так, в общем...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Июль, 2010 10:16 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Galkov писал(а):
Alexey Veselovsky писал(а):
Я таки дико извиняюсь, но при чем тут ОС? Менеджер памяти это чисто библиотечное средство. В частности их можно легко менять, и вообще можно написать свой.
Иногда очень даже причем.
Как-то тут была беседа про релокацию (скажем, изменение размера массива в run-time), и приводилась ссылка на библиотеку, которая это умеет.
Так вот, умеет это она лишь путем тупого копирования старого контекста в новый. И никак иначе (если ты отвел себе память через VirtualAlloc, и работаешь далее только с ней)
А ось умеет сделать ремэпинг (речь идет, естественно, о действительно больших размерах, а не осотне-другой байт). И никогда ось не отдаст эту возможность на уровень приложения.

Как-то так, в общем...


И? Каким образом релокация массива к массивам с неизвестным размером на этапе компиляции? От темы не стоит отклоняться таки :-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Май, 2011 14:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Рапортую о том как опасны динамические массивы :D :D :D

На работе несколько лет иногда у клиентов в программе память текла "на ровном месте" ни с того ни с сего. Дорастает до 3.5 гигабайтов и на что израсходовано - не понятно. В лабораторных условиях воспроизвести не получалось.

На что только не думали...

И вот, сейчас думаем, что вроде как нашли...

Там иногда (в зависимости от действий клиентов) временно создаются большие динамические массивы. Используется Mono 2.4. Сборщик мусора не перемещающий. Вот и наступает фрагментация памяти.

Вывод.

Хочешь динамические массивы - заодно хоти и перемещающий сборщик мусора.

А если у тебя нет перемещающего сборщика мусора, тогда вместо одного большого динамического массива используй цепочку массивов небольшого фиксированного размера.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Май, 2011 20:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Сергей Губанов писал(а):
Там иногда (в зависимости от действий клиентов) временно создаются большие динамические массивы.
Может быть, это синдром for-array поднимает свою ugly head?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Май, 2011 22:42 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Сергей Губанов писал(а):
Хочешь динамические массивы - заодно хоти и перемещающий сборщик мусора.
В Блэкбоксе, видимо, сборщик мусора как раз неперемещающий?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Май, 2011 00:37 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Фрагментации можно добиться и без массивов, если, например, есть два или более вида записей, с размерами отличающимися в разы. Может сложится ситуация, что суммарной памяти достаточно, а память под запись бОльшего размера выделить не получается.

Чтобы не было фрагментации, тогда надо, чтобы все выделяемые куски памяти были одного и того же размера, тогда они будут взаимозаменяемы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Май, 2011 11:41 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
> это синдром for-array

А ещё синдром найма дешёвых "студентов", после которых весь код надо переписывать.

> Фрагментации можно добиться и без массивов

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Четверг, 12 Май, 2011 17:40 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Александр Ильин писал(а):
Илья Ермаков писал(а):
Ещё Files.File.

Но дин. массивы представляются всё равно нужными. Мелкий пример - вот хранить неизменяемую, но дополняемую структуру со строками разных длин; удобно эти "хвосты" переменной длины динамически порождать.
Можно обойтись блоками фиксированной длины:
Код:
TYPE
Chunk = ARRAY ChunkSize OF BYTE;
Stream = POINTER TO RECORD (Chunk)
   data: Chunk;
   len: INTEGER;
   (* etc. *)
   next: Stream;
END;

Только такой вариант не скомпилируется, из-за того, что базовым типом у Stream не является тип "запись".


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

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


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

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


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

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