Когда запускается сборщик мусора при вызове экспорта Haskell из C?

При экспорте функции Haskell для вызова из C, когда собирается мусор Haskell? Если C владеет main, то невозможно предсказать следующий вызов Haskell. Этот вопрос особенно актуален при запуске однопоточного Haskell или без параллельного GC.


person Elliot Cameron    schedule 11.02.2015    source источник
comment
Если вас беспокоит конкретный иностранный экспорт или экспорт, вы можете добавить performGC перед возвратом Addr.   -  person Cirdec    schedule 12.02.2015
comment
@Cirdec Что Addr?   -  person Elliot Cameron    schedule 12.02.2015
comment
IIRC, сборка мусора может запускаться каждый раз, когда код Haskell что-то выделяет. Если ваша программа часто вызывает Haskell, этого должно быть достаточно. В противном случае, если вы беспокоитесь о том, что Haskell удерживает память слишком долго, вы можете вызвать сборщик мусора, вызывающий performGC из C.   -  person chi    schedule 12.02.2015
comment
@chi Если вы подтвердите, что IIRC, то это ответ!   -  person Elliot Cameron    schedule 12.02.2015
comment
Я согласен с тем, что Чи говорит о GC, я узнал то же самое, однако я не уверен, как это отвечает способности GC предсказывать что-либо. Как среда выполнения узнает, что значение больше не понадобится со стороны C?   -  person MasterMastic    schedule 12.02.2015
comment
@MasterMastic Точно так же он знает, когда он больше не нужен со стороны Haskell, когда больше нет корней GC, из которых он доступен. Два наиболее интересных базовых внешних типов — это FunPtr и StablePtr. Когда вы делаете StablePtr или FunPtr, создаются новые корни GC, которые существуют до тех пор, пока они не будут освобождены.   -  person Cirdec    schedule 12.02.2015
comment
@MasterMastic Грубо говоря, когда вы передаете что-то из Haskell в C, вы должны закрепить эти данные, чтобы они не были освобождены сборщиком мусора. После того, как вы узнаете, что C больше не нужен, вы можете открепить его. Это ручное и не очень удобное, но в C мы все-таки привыкли к ручному управлению памятью, так что не так страшно, если нам придется делать это еще и на границе двух языков.   -  person chi    schedule 12.02.2015
comment
@ 3noch Я недостаточно уверен, чтобы написать реальный ответ. Я читал что-то в далеком прошлом о среде выполнения GHC, но я не эксперт в этом.   -  person chi    schedule 12.02.2015
comment
Понижение? Я все уши для того, как улучшить мой вопрос.   -  person Elliot Cameron    schedule 17.03.2015


Ответы (1)


Когда вы инициализируете среду выполнения ghc, вы можете передать ей флаги rts через argc и argv вот так:

  RtsConfig conf = defaultRtsConfig;
  conf.rts_opts_enabled = RtsOptsAll;
  hs_init_ghc(&argc, &argv, conf);

Это позволяет вам установить параметры, чтобы, например, зафиксировать меньший максимальный размер кучи или использовать алгоритм уплотнения в питомнике для дальнейшего сокращения распределения. Кроме того, обратите внимание, что существует бездействующий GC, интервал которого можно установить (или отключить), и если вы свяжете многопоточную среду выполнения, она должна работать независимо от того, вернетесь ли вы к вызову Haskell или нет.

Изменить. На самом деле я не проводил экспериментов, чтобы проверить следующее, но если мы посмотрим на источник hs_init_ghc мы видим, что он инициализирует обработчики сигналов, которые должны включать в себя обработчики таймеров, которые реагируют на SIGVTALRM и действительно запускают время, которое вызывает (в POSIX) timer_create, который должен подавать эти сигналы через равные промежутки времени. В свою очередь, это должно периодически «будить» RTS независимо от того, происходит что-либо или нет, что, в свою очередь, должно означать, что он будет запускать бездействующий сборщик мусора независимо от того, уступит ли система обратно Haskell из C. Но опять же, я только прочитал код и комментарии, сам не проверял.

person sclv    schedule 19.03.2016
comment
Вы похоже на ответ на старые вопросы пинайте. Какая-то конкретная причина, или вы просто в настроении? - person dfeuer; 19.03.2016
comment
Бессонница @dfeuer и периодическое принуждение, которое настигает меня, чтобы попытаться снизить количество вопросов без ответов. - person sclv; 19.03.2016
comment
@sclv Я почти готов принять этот ответ, но суть моего вопроса все еще остается: когда на самом деле запускается GC? Это просто когда на стороне Haskell есть выделения или что-то в этом роде? - person Elliot Cameron; 22.03.2016
comment
@sclv Отлично! Спасибо. - person Elliot Cameron; 22.03.2016