Что такое символ ___mac_get_pid в профиле node?

Я профилирую некоторый код нескольких процессов nodejs, запущенный на OSX.

Я вижу:

[C++]:
   ticks  total  nonlib   name
  23398   63.6%   63.8%  ___mac_get_pid

Что такое ___mac_get_pid? Это имя, безусловно, наводит на мысль, что это код, который "получает PID на Mac", но время кажется чрезмерным.

Googling не предоставил ничего полезного.

Ответ 1

__mac_get_pid - это syscall за функцией библиотеки mac_get_pid. Это описано в man-странице mac_get: http://man.cx/mac_get(3)

mac_get_pid.. получить метку файла, сокета, сокета или процесса сокета Системные вызовы mac_get_pid() и mac_get_proc() возвращают метку процесса, связанную с произвольным идентификатором процесса или текущим процессом.

Хранилище ярлыков для использования с этими вызовами должно быть сначала выделено и подготовлено с использованием функций mac_prepare (3). Когда приложение выполняется с использованием метки, память может быть возвращена с использованием mac_free (3).

"MAC" здесь не Mac OS X/macOS, но POSIX.1e Обязательный контроль доступа ( "был введен в FreeBSD 5.0 ​​как часть TrustedBSD Project "), mac_get_pid реализован в macOS/Dawrin/XNU как "Расширенные интерфейсы без POSIX.1e".

Возможно, есть несколько методов в используемых библиотеках nodejs, которые пытаются выполнить детальную работу с списками процессов (например, ps/top), но они не смогли ограничить скорость своих запросов. Получение нескольких stacktraces с помощью mac_get_pid либо с профилировщиком (не v8 profiler, в котором stacktraces только js, но какой-то внешний профилировщик подключен к процессу nodejs) или с помощью отладчика (gdb/lldb) вручную, останавливая и проверяя обратную линию, пока не найдете, кто звонит mac_get_pid (продолжайте и остановите снова, когда вы не находитесь в mac_get_pid) - это необходимый шаг, чтобы узнать, кто его назвал.