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