User Tag List

Результаты опроса: Сборка мусора на Speccy?

Голосовавшие
28. Вы ещё не участвовали в этом опросе
  • Да

    3 10.71%
  • Нет

    25 89.29%
Страница 4 из 9 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 94

Тема: Сборка мусора

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    а какая разница между принудительным освобождением памяти или корректировкой указателя на указатель? все одно надо сообщать системе что блок не нужен. только в первом случае все происходит гораздо быстрее и эффективнее
    Принудительное освобождение памяти - это вызов процедуры, которая наверняка выполнит как минимум одну запись в память, а потом ещё и возврат, а если вызов ещё будет маршрутизироваться через RST или подобные программные шлюзы... При изолированном рассмотрении - не эффективнее.

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

    А сборщик мусора позволяет автоматически разрешать зависимости в динамических структурах данных со сложной структурой.
    Последний раз редактировалось captain cobalt; 29.03.2005 в 23:54.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от captain cobalt
    Принудительное освобождение памяти - это вызов процедуры, которая наверняка выполнит как минимум одну запись в память, а потом ещё и возврат, а если вызов ещё будет маршрутизироваться через RST или подобные программные шлюзы... При изолированном рассмотрении - не эффективнее.
    а если точнее, то вставит в список новый элемент. и все.
    и причем тут маршрутизация при возврате из функции? вложенные вызовы в таком случае не используются. да и без рст обойтись уже решили вроде как...

    Цитата Сообщение от captain cobalt
    Более того, сумма накладных расходов на вызов процедуры явного освобождения может запросто стать сопоставимой со временем работы сборщика мусора.

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

    со сборщиком:
    на N блоков памяти имеем N вызовов освобождения, N указателей на блоки, N коррекций этих указателей, М просмотров цепочек (при периодической проверке живых блоков)

    что быстрее?

  4. #3

    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    ты забыл о спектрумовской структуре памяти. забыл о том что одновременно адресовать можно только 64 кило и не больше. причем из них приложению принадлежит максимум 16. или ты думаешь что 16 кило нижней памяти хватит на кучу для системы и для всех процессов? сильно в этом сомневаюсь.... да и к тому же защищенность практически никакая в таком случае
    Я подразумеваю одну большую кучу в верхних страницах, к которым обращается код из нижней памяти.

    А что? Делать кучи по одной странице 16К? Кучки. И нельзя в одной куче иметь указатель на блок в другой? Мне не нравится.
    Цитата Сообщение от Vitamin
    а если точнее, то вставит в список новый элемент. и все.
    и причем тут маршрутизация при возврате из функции? вложенные вызовы в таком случае не используются. да и без рст обойтись уже решили вроде как...
    Здесь уже пошла зависимость от реализации. Но как минимум CALL и RET никуда не денутся.
    Цитата Сообщение от Vitamin
    а теперь давай свалим все в одну кучу чтоб посмотреть у какого метода чего больше.
    без сборщика:
    на N блоков памяти имеем N вызовов освобождения.
    все.
    А также, при ошибках программирования, утечку памяти и висящие указатели.
    Цитата Сообщение от Vitamin
    со сборщиком:
    на N блоков памяти имеем N вызовов освобождения
    Откуда вызовы освобождения?
    Цитата Сообщение от Vitamin
    N указателей на блоки
    Традиционный распределитель не будет отслеживать корректность освобождаемого указателя? Значит, будем получать крушение всей кучи при попытке повторного освобождения одного указателя.
    Цитата Сообщение от Vitamin
    N коррекций этих указателей, М просмотров цепочек (при периодической проверке живых блоков)
    И освобождение от указанных недостатков ручного освобождения - возможность более лёгкого построения более сложных программных систем.
    Цитата Сообщение от Vitamin
    что быстрее?
    Это не всегда абсолютный приоритет.

  5. #4

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от captain cobalt
    Я подразумеваю одну большую кучу в верхних страницах, к которым обращается код из нижней памяти.

    А что? Делать кучи по одной странице 16К? Кучки. И нельзя в одной куче иметь указатель на блок в другой? Мне не нравится.
    почитай соседний тред. куча для того и нужна чтоб ее адресовать и юзать непосредственно в прямых адресах. верхняя память достукивается через менеджер и там сборщик мусора работает на уровне "сдох процесс- освобождаем память".

    Цитата Сообщение от captain cobalt
    Здесь уже пошла зависимость от реализации. Но как минимум CALL и RET никуда не денутся.
    а куда они деваются при сборщике?

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

    Цитата Сообщение от captain cobalt
    Откуда вызовы освобождения?
    ну сборщик их же вызывает чтобы освободить неиспользуемые блоки

    Цитата Сообщение от captain cobalt
    Традиционный распределитель не будет отслеживать корректность освобождаемого указателя? Значит, будем получать крушение всей кучи при попытке повторного освобождения одного указателя.
    а если будет?

    Цитата Сообщение от captain cobalt
    Это не всегда абсолютный приоритет.
    в условиях жестокой ограниченности процессорных ресурсов это один из абсолютных приоритетов

  6. #5

    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    почитай соседний тред. куча для того и нужна чтоб ее адресовать и юзать непосредственно в прямых адресах. верхняя память достукивается через менеджер и там сборщик мусора работает на уровне "сдох процесс- освобождаем память".
    Данных должно быть больше чем кода. В том числе потому, что данные могут выступать как код (например, мегакод). Поэтому должна быть возможность манипулирования большими объёмами данных без их копирования.
    Цитата Сообщение от Vitamin
    а куда они деваются при сборщике?
    ...
    ну сборщик их же вызывает чтобы освободить неиспользуемые блоки
    Сборщик ничего не вызывает для каждого указателя. Сборщик крутит довольно простой и короткий цикл, в котором помечаются живые блоки. Оставшееся после этого является мусором.
    Цитата Сообщение от Vitamin
    хех. забудем обнулить указатель для сборщика и у нас тоже чета откудато потечет %)
    Однако, со сборщиком мусора практически невозможно ненамеренно добиться, чтобы память систематически утекала (всё больше и больше). Обычно самое худшее - это необнулённый указатель будет удерживать некоторое постоянное количество памяти.
    Цитата Сообщение от Vitamin
    а если будет?
    Значит ему тоже понадобится дополнительная память.
    Цитата Сообщение от Vitamin
    в условиях жестокой ограниченности процессорных ресурсов это один из абсолютных приоритетов
    Опять же, весь вопрос, каков баланс. Будет ли сборщик мусора в два раза медленнее? Или только на 20%? Умозрительно это точно не оценить.

  7. #6

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от captain cobalt
    Данных должно быть больше чем кода. В том числе потому, что данные могут выступать как код (например, мегакод). Поэтому должна быть возможность манипулирования большими объёмами данных без их копирования.
    это означает что нижнюю память надо отдать на растерзание резидентам и приложениям. иными словами, не система будет управлять приложениями, а приложения системой. нехорошо....

    Цитата Сообщение от captain cobalt
    Сборщик ничего не вызывает для каждого указателя. Сборщик крутит довольно простой и короткий цикл, в котором помечаются живые блоки. Оставшееся после этого является мусором.
    предположим. разумеется, что цикл будет короче чем освобождение всех блоков. при периодичной проверке выигрыш будет или нет?

    Цитата Сообщение от captain cobalt
    Однако, со сборщиком мусора практически невозможно ненамеренно добиться, чтобы память систематически утекала (всё больше и больше). Обычно самое худшее - это необнулённый указатель будет удерживать некоторое постоянное количество памяти.
    в контексте "забыл убрать- начались потери" оба метода абсолютно равнозначны. потому что можно постоянно выделять блоки и забывать обнулять указатели и память будет именно систематически утекать. все больше и больше...

    Цитата Сообщение от captain cobalt
    Значит ему тоже понадобится дополнительная память.
    не факт. просто проверяем- принадлежит ли освобождаемая память свободному блоку. с чем может быть проблема- это контроль на правильность длин освобождаемых блоков (выделили столько а освобождаем другой объем).

    Цитата Сообщение от captain cobalt
    Опять же, весь вопрос, каков баланс. Будет ли сборщик мусора в два раза медленнее? Или только на 20%? Умозрительно это точно не оценить.
    прошу к ассемблеру! %)
    то, что на системном уровне сборщик будет только на уровне процессов- однозначно. а вот менеджер кучи может быть ЛЮБЫМ. в том числе и со сборщиком. хотя бы потому что спецификация на большинство ЯВУ требует наличия функции освобождения памяти, а в сборщике такого нет. как говорится, убрать мы всегда сумеем!

  8. #7

    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    это означает что нижнюю память надо отдать на растерзание резидентам и приложениям. иными словами, не система будет управлять приложениями, а приложения системой. нехорошо....
    Без полноценной аппаратной защитной памяти невозможно полноценно реализовать архитектуру юниксов. Значит, следует смотреть в сторону других архитектур операционных систем.
    Цитата Сообщение от Vitamin
    предположим. разумеется, что цикл будет короче чем освобождение всех блоков. при периодичной проверке выигрыш будет или нет?
    Ну, может быть и так и сяк.
    В типичных случаях сборщик мусора скорее всего будет проигрывать по суммарной скорости. Однако, есть и другие факторы.
    Цитата Сообщение от Vitamin
    в контексте "забыл убрать- начались потери" оба метода абсолютно равнозначны. потому что можно постоянно выделять блоки и забывать обнулять указатели и память будет именно систематически утекать. все больше и больше...
    Для того, чтобы память систематически утекала со сборщиком мусора, необходимо специально весь мусор связывать в список, чтобы мусор оставался живым. Однако, "против" такого традиционный распределитель тем более "не поможет".

    Если же, например, циклически выделять и не освобождать память на имя глобального указателя, то традиционный распределитель ничего не сможет поделать. Сборщик же мусора, не обраружив ссылок на предыдущие выделенные блоки, сможет прибрать их.
    Цитата Сообщение от Vitamin
    не факт. просто проверяем- принадлежит ли освобождаемая память свободному блоку. с чем может быть проблема- это контроль на правильность длин освобождаемых блоков (выделили столько а освобождаем другой объем).
    Ну конечно, при каждом запросе на освобождение проверять весь список занятых блоков - тоже вариант.
    Цитата Сообщение от Vitamin
    то, что на системном уровне сборщик будет только на уровне процессов- однозначно.
    Неоднозначно.
    См. выше. Сборщик мусора вообще может располагаться ниже, чем планировщик процессов.
    Цитата Сообщение от Vitamin
    а вот менеджер кучи может быть ЛЮБЫМ. в том числе и со сборщиком.
    Да, именно так.
    Сборщику мусора совершенно ни к чему работать на вытесняющей многозадачности параллельно с другими, обслуживаемыми им, задачами. Он может работать только при исчерпании памяти при вызове NEW(), в рамках этой процедуры.
    Цитата Сообщение от Vitamin
    хотя бы потому что спецификация на большинство ЯВУ требует наличия функции освобождения памяти
    Так ведь у нас пока не так уж много реализовано этих самых ЯВУ.
    Цитата Сообщение от Vitamin
    а в сборщике такого нет. как говорится, убрать мы всегда сумеем!
    Можно сначала сделать, а потом убрать, а можно сразу сделать сборщик мусора. Тогда и делать а потом убирать ничего не придётся.

  9. #8

    Регистрация
    21.01.2005
    Адрес
    ссср
    Сообщений
    468
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от captain cobalt
    Без полноценной аппаратной защитной памяти невозможно полноценно реализовать архитектуру юниксов. Значит, следует смотреть в сторону других архитектур операционных систем.
    вы сами поправитесь или вас опозорить прилюдно? =)

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

  10. #9

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от captain cobalt
    Без полноценной аппаратной защитной памяти невозможно полноценно реализовать архитектуру юниксов. Значит, следует смотреть в сторону других архитектур операционных систем.
    а никто и не говорит что необходимо полностью передирать архитектуру юниксов. кста, есть их реализации и на машинах без аппаратной защиты. в качестве прикола приведу цитату из текстика "ОСи как сортиры" %)

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

    Цитата Сообщение от captain cobalt
    Ну, может быть и так и сяк.
    В типичных случаях сборщик мусора скорее всего будет проигрывать по суммарной скорости. Однако, есть и другие факторы.
    поэтому его надо как минимум делать прицепным а не обязательным и единственным.

    Цитата Сообщение от captain cobalt
    Для того, чтобы память систематически утекала со сборщиком мусора, необходимо специально весь мусор связывать в список, чтобы мусор оставался живым. Однако, "против" такого традиционный распределитель тем более "не поможет".
    насколько я понял из твоих рассуждений, блок остается "живым" до тех пор, пока на него имеется хоть один указатель из списка указателей. ну вот и получаем- пополняем список указателей и забиваем мусором кучу. те же самые проблемы.

    Цитата Сообщение от captain cobalt
    См. выше. Сборщик мусора вообще может располагаться ниже, чем планировщик процессов.
    поясни. куда ниже и куда выше

    Цитата Сообщение от captain cobalt
    Да, именно так.
    Сборщику мусора совершенно ни к чему работать на вытесняющей многозадачности параллельно с другими, обслуживаемыми им, задачами. Он может работать только при исчерпании памяти при вызове NEW(), в рамках этой процедуры.
    поэтому НЕ НАДО его пихать в системный уровень как обязательную часть.

    Цитата Сообщение от captain cobalt
    Так ведь у нас пока не так уж много реализовано этих самых ЯВУ.
    ну а своим предложением обязательности сборщика ты вообще лишаешь надежды поддержать часть стандартизованных ЯВУ, реализация которых наиболее вероятна.

    Цитата Сообщение от captain cobalt
    Можно сначала сделать, а потом убрать, а можно сразу сделать сборщик мусора. Тогда и делать а потом убирать ничего не придётся.
    ты повернул все обратно ))
    я говорил насчет процедуры освобождения блока. ее мы всегда успеем убрать. главное чтоб она была в рамках стандартного спискового менеджера кучи

  11. #10

    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от random
    вы сами поправитесь или вас опозорить прилюдно? =)
    А в чём должно заключаться опозоривание? В том что
    Цитата Сообщение от Vitamin
    юниксов. кста, есть их реализации и на машинах без аппаратной защиты.
    ?
    Цитата Сообщение от elf/2
    приехали
    два основных типа ошибок связанных с работой с памятью это:
    1. забыли освободить память
    При программировании без сборщика мусора необходимо выполнять две операции:
    -- строить алгоритм таким образом, чтобы в момент ручного освобождения памяти на неё не осталось ни одного указателя.
    -- собственно вручную освободить память.

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

    Таким образом, со сборщиком мусора, проблема "забыли освободить память" существует в форме "забыли избавиться от всех указателей на ненужную память". Однако, и без сборщика мусора также необходимо избавляться от указателей на ненужную память. Если их сохранять, то возникнет опасность попытки обращения к ним.

    Итак, сборщик мусора превращает ошибку программирования "обращение к освобождённой памяти" в менее опасную ошибку "утечка памяти". Однако, это в любом случае ошибка. Сборщик мусора не виноват.
    Цитата Сообщение от elf/2
    2. обратились к уже освобожденной памяти
    Чтобы обратиться к памяти нужно иметь указатель на неё. Сборщик мусора должен знать обо всех указателях. Если существует указатель на память, то сборщик не будет освобождать её.
    Цитата Сообщение от elf/2
    сборка мусора предназначена для того чтобы подобных ошибок не было. ты предлагаешь сборку мусора (т.е. кучу дополнительного кода) которая от этих ошибок не защищает. тогда какой от нее толк?
    Всё-таки во многих случаях защищает.
    Цитата Сообщение от elf/2
    про работу с динамическими связными структурами.
    довольно часто используют такой подход: программа имеет свой менеджер памяти который берет память у системы большими кусками, а после окончания работы со структурой отдает ее сразу всю.
    поскольку в таких структурах элементы одного типа - менеджер получается простой и очень эффективный. а C++ предоставляет все необходимое для его реализации (перегрузка оператора new)
    Осталось только где-то взять компилятор C++ -> Z80.
    Цитата Сообщение от elf/2
    ну и по традиции о главном считаем что у нас есть готовый сборщик мусора:
    хотелось бы увидеть как будет лежать в памяти простой односвязный список из друх элементов + указатель на голову этого списка, чтобы при пометке этого указателя как неиспользуемого автоматически отдавалась вся выделенная память
    Цитата Сообщение от Знахарь
    Может кто расписать на пальцах как это всё чудище будет работать ?
    Это лучше всё-таки посмотреть в учебнике. Или в интернете. Там и картинки есть.
    Цитата Сообщение от Знахарь
    Вот надо мне не 200 байт, а скажем 70 килобайт для игры. И чтоб на прерываниях мизер системы. И чтоб оба экрана юзать... Да хрен с ним, хоть один, основной. И понятно, что не где попало память нужна... короче КАК это всё будет выглядеть реально ?
    Я подразумеваю, что будет одна куча в верхних страницах, а видимый системе код будет выполняться в нижних страницах. И сможет таким образом, обращаться ко всей куче. Поэтому всё просто - запрашиваем выделение нужного объёма на куче, и имеем к нему произвольный доступ.

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

    Впрочем, это низкоуроневые вопросы, и совсем не имеют отношения к сборщику мусора. Лучше этот вопрос задать тому, у кого кучи по 16К.
    Цитата Сообщение от Vitamin
    поэтому его надо как минимум делать прицепным а не обязательным и единственным.
    Надо делать обязательным.
    Цитата Сообщение от Vitamin
    насколько я понял из твоих рассуждений, блок остается "живым" до тех пор, пока на него имеется хоть один указатель из списка указателей. ну вот и получаем- пополняем список указателей и забиваем мусором кучу. те же самые проблемы.
    Вот именно. Для возникновения утечки недостаточно просто выделять память. Необходимо ещё потрудиться "обеспечить" каждый блок живым указателем на него.

    Ситуации же вроде

    NEW(p);
    NEW(p);

    и все их вариации легко разрешаются сборщиком мусора.
    Цитата Сообщение от Vitamin
    поясни. куда ниже и куда выше
    Планировщик процессов выделяет себе для работы память используя нижележащий распределитель памяти со сборщиком мусора.
    Цитата Сообщение от Vitamin
    поэтому НЕ НАДО его пихать в системный уровень как обязательную часть.
    Но сборщик мусора эффективнее в некоторых ситуациях - в ситуациях, когда он вообще не вызывается. Но готов всегда придти на помощь.
    Цитата Сообщение от Vitamin
    ну а своим предложением обязательности сборщика ты вообще лишаешь надежды поддержать часть стандартизованных ЯВУ, реализация которых наиболее вероятна.
    Если вдруг внезапно появится нечто интересное со сборщиком мусора, то это может стимулировать фракцию противников сборщика мусора на написание распределителя памяти с ручным освобождением, чтобы продемонстрировать его конкурентное преимущество. Таким образом, все выиграют.
    Последний раз редактировалось captain cobalt; 31.03.2005 в 08:48.

Страница 4 из 9 ПерваяПервая 12345678 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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