Как современные ОС достигают идемпотентных функций очистки от смертей процесса? - PullRequest
0 голосов
/ 09 мая 2018

Допустим, у меня есть ОС, которая реализует malloc, храня список сегментов, на которые указывает процесс, в блоке управления процессом. Я беру свою память из свободного списка и отдаю ее процессу.

Если этот процесс умирает, я просто удаляю ссылку на сегмент из блока управления процессом и перемещаю сегмент обратно в мой свободный список.

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

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

1 Ответ

0 голосов
/ 09 мая 2018

Я предполагаю, что ваш вопрос сводится к тому, как ОС отбирает память процесса в случае сбоя этого процесса.

Хотя я самоучка в этих вопросах, я дам вам два способа, которыми ОС может обеспечить восстановление любой памяти, используемой процессом, в случае сбоя процесса.

В типичном современном процессоре и современной ОС с виртуальной памятью:

У вас есть два уровня выделения. Всякий раз, когда процесс вызывает malloc, malloc пытается удовлетворить запрос от уже доступных страниц памяти, которые ядро ​​дало процессу. Если страниц недостаточно, malloc просит ядро ​​выделить больше страниц. В этом случае, когда происходит сбой процесса или даже если он нормально завершается, ядру все равно, что сделал malloc или какую память процесс забыл освободить. Нужно только освободить все страницы, которые он дал процессу.

В более простой ОС, которая не заботится о производительности, фрагментации памяти или виртуальной памяти и, возможно, даже не заботится о защите памяти:

Malloc / free полностью реализован на стороне ядра (например, системные вызовы). Всякий раз, когда процесс вызывает malloc / free, ядро ​​выполняет всю работу и поэтому знает обо всей памяти, которая должна быть освобождена. После сбоя или выхода из процесса ядро ​​может выполнить очистку. Поскольку ядро ​​никогда не должно аварийно завершать работу и вести учет всей выделенной памяти на процесс, это тривиально.

Как я уже сказал, я самоучка, и я не проверял, как, например, Linux или Windows реализуют это.

...