프로세스가 종료될 때 Linux는 메모리 손상을 어떻게 처리합니까?

프로세스가 종료될 때 Linux는 메모리 손상을 어떻게 처리합니까?

스택 오버플로에는 시스템이 메모리 누수를 처리하는 방법과 비정상적으로 종료되면 어떤 일이 발생하는지 묻는 질문이 많이 있습니다. 예:

https://stackoverflow.com/questions/6727383/dynamically-allocation-memory-after-program-termination

https://stackoverflow.com/questions/10223677/when-a-program-terminates-what-happens-to-the-memory-allocation-using-malloc-that

https://stackoverflow.com/questions/2975831/is-leaked-memory-freed-up-when-the-program-exits

그런데 메모리 손상에 대해 묻는 글은 찾아볼 수 없습니다. Linux 커널은 메모리 누수와 메모리 손상을 동일하게 처리합니까? 프로세스가 종료되면 손상된 메모리 세그먼트가 해제되고 회수되며 다른 프로세스에서 사용해도 안전합니까?

또한 POSIX 공유 메모리(/dev/shm)를 사용하는 프로세스는 어떻습니까? 제가 이해한 바에 따르면 shm_unlink에 의해 삭제되지 않는 한 공유 메모리는 시스템에서 회수되지 않는 것 같습니다. (http://man7.org/linux/man-pages/man7/shm_overview.7.html) 이것은 공유 메모리 세그먼트가 어떤 식으로든 손상되면 시스템을 재부팅할 때까지 기본적으로 사용자가 망가진다는 것을 의미합니까? 아니면 모든 사용자 프로세스가 종료된 후 사용자가 재부팅하지 않고 로그오프할 때 커널이 shm_unlink를 통해 공유 메모리를 자동으로 지웁니까?

감사해요!

답변1

프로세스가 종료되면 운영 체제에서 해당 메모리를 회수합니다. 이는 사용 가능으로 표시되며 조만간 메모리가 필요할 때 다른 프로세스에 할당됩니다. 메모리는 프로세스에 할당되기 전에 항상 지워집니다.

이 과정에서 메모리 손상이 발생하더라도 문제가 되지 않습니다. 메모리 손상의 개념은 프로세스 실행과 관련이 있습니다. 이는 메모리 내용이 프로그래머가 의도한 것과 다르다는 것을 의미합니다. 프로세스가 종료되면 이 개념은 더 이상 의미가 없습니다. 메모리 누수의 경우에도 마찬가지입니다. 프로세스가 종료되면 모든 메모리가 회수됩니다.

공유 메모리는 단일 프로세스에 속하지 않기 때문에 예외입니다. 프로세스가 종료되면 공유 메모리에 대한 프로세스 핸들만 명시적으로 삭제될 때까지 공유 메모리 자체가 재활용됩니다. 공유 메모리 객체는 파일 시스템에 연결되지 않고 메모리에만 존재하는 파일로 생각하세요. 이름이 없는 임시 파일과 같습니다.

공유 메모리를 사용하는 프로세스는 종료하기 전에 이를 정리해야 합니다. 바람직하게는 프로세스가 공유 메모리를 사용하는 경우 해당 프로세스는 슈퍼바이저 프로세스에 의해 실행되어야 하며, 슈퍼바이저 프로세스는 메인 프로세스가 충돌할 때 공유 메모리, 임시 파일 등의 리소스를 정리해야 합니다.

답변2

이것은 공유 메모리 세그먼트가 어떤 식으로든 손상되면 시스템을 재부팅할 때까지 기본적으로 사용자가 망가진다는 것을 의미합니까?

거의, 그러나 완전히는 아닙니다. 사용자는 /dev/shm/blah 파일의 링크를 해제하고 공유 메모리를 사용하는 모든 프로세스를 종료할 수도 있습니다. 또는 잘 작성된 프로그램이 공유 메모리를 사용할 수 없게 된 것을 감지하고 이를 다시 생성하기로 결정할 수도 있습니다.

아니면 모든 사용자 프로세스가 종료된 후 사용자가 재부팅하지 않고 로그오프할 때 커널이 shm_unlink를 통해 공유 메모리를 자동으로 지웁니까?

사용자 로그아웃은 사용자 공간 개념입니다. 커널은 사용자 로그아웃에 대해 거의 아무것도 모르므로 사용자가 로그아웃할 때 특별한 작업을 수행하지 않습니다. 이것은 사용자가 "로그아웃"할 때(그게 무엇을 의미하든) 사용자의 로그인 세션 리소스를 지우는 역할을 담당하는 데스크탑 세션 관리자 프로세스이며, 사용자가 로그아웃할 때 모든 사용자의 shm을 지우도록 구성될 수도 있습니다. POSIX shm은 일반적으로 세션 리소스가 아닌 전역 리소스로 간주되기 때문에 세션 관리자 구현은 실제로 이를 수행합니다.

관련 정보