free()
공유 라이브러리 SIGKILL
의 내부 등에 대해 자문하기 시작했을 때 저는 C 코드를 작성하고 있었습니다. 그러다가 몇 번 읽고 다시 생각한 끝에 나는 이 간단한 질문을 떠올렸습니다.
문맥: 로더가 일부 libA.so 공유 객체를 가리키는 ELF 파일을 읽고 라이브러리를 로드할 때 전체 세그먼트를 프로그램의 메모리 주소 공간에 매핑합니까? 공유 메모리로 할당되나요?
내가 아는 한, 커널은 죽은 프로세스의 공유 메모리를 차지하지 않습니다. 따라서:
- 공유 객체가 로드되고 메모리가 할당된 다음 주 프로그램이 이를 수신하면 어떻게 됩니까
SIGKILL
? 할당된 메모리가 공유 메모리로 처리되어 유출되나요? - 동일한 공유 라이브러리를 로드하는 두 개의 프로그램이 있는데 그 중 하나가 이를 해제하지 않고 종료되면 어떻게 됩니까?
둘 다 결국 다음과 같습니다.공유 라이브러리 객체가 프로그램의 공유 메모리로 로드됩니까?
내 질문은 매우 일반적입니다. 나는 다른 커널/로더를 비교하고 싶습니다.
답변1
모든 현대 운영 체제는 SunOS-4.0(1988)의 기본 개념을 따르고 심지어 SunOS의 코드(Sun은 1990년 초에 FreeBSD에 소스 코드를 제공했으며 복사되었습니다...)를 기반으로 하기 때문에 큰 차이가 있습니다. .
공유 라이브러리 파일은 쓰기 중 복사 공유를 통해 프로그램 메모리에 매핑되므로 필요한 RAM의 대부분이 공유됩니다.
malloc()
"라이브러리"가 아닌 프로세스에 의해 호출되며 관련 메모리는 프로세스와 연결됩니다.신호는 라이브러리가 아닌 프로세스로 전송됩니다.
프로그램/프로세스가 종료되면 커널에 의해 할당된 메모리가 해제되고 매핑된 라이브러리의 참조 카운트가 0이면 전체 라이브러리가 메모리에서 제거됩니다.