Как стать автором
Обновить

Комментарии 5

очень интересно.

Та обертка для rust nif, которую я гонял, адски текла и ездила по памяти
Спасибо, интересно. Сам в свое время писал NIF'ы (тынц), правда на C.

На мой взгляд, опасность переполнения буфера или разыменования не того что нужно немного преувеличена. Куда бОльшая проблема, о которой часто тактично умалчивают, заключается в том, что NIF блокирует тред на котором он выполняется и вместе с ним исполняемые на нем акторы. Для быстрых вычислений это не проблема, но для сериализации/десериализации/кодирования/сжатия пары мегабайт данных проблема очень даже актуальная.

Я слышал, что проблему отчасти решили в последних релизах Erlang'а, но, увы, не знаю деталей. Вроде как можно запустить сишный код на отдельной нитке ОС или вроде того.
Если кратко, то существующую проблему пытаются решить через dirty scheduler. Можно выставить флаги ERL_NIF_NORMAL_JOB = 0,
ERL_NIF_DIRTY_JOB_CPU_BOUND = 1,
ERL_NIF_DIRTY_JOB_IO_BOUND = 2
В rustler есть обработка этого функционала через
pub enum SchedulerFlags {
Normal = 0,
DirtyCpu = 1,
DirtyIo = 2,
}
При объявлении наших обработчиков пишем что-то подобное:
(«dirty_cpu», 0, dirty_cpu_fun, SchedulerFlags::DirtyCpu),
(«dirty_io», 0, dirty_io_fun, SchedulerFlags::DirtyIo),
Думаю, nifs можно разделить на две группы: 1) процесс исполнения можно поделить на мелкие порции укладывающиеся в 1мс по времени. 2) для которых такую оптимизацию применить нельзя.
Детали реализации первой группы можно найти изучив информацию по enif_schedule_nif и enif_send. Вторые точно нужно выносить под DS, чтобы не случился scheduler-collapse.
Также, в свое время я находил вот эту публикацию по данной теме: medium.com/@jlouis666/erlang-dirty-scheduler-overhead-6e1219dcc7
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории