공유 라이브러리는 응용 프로그램과 동일한 힙을 사용합니까?
프로그램이 Linux 에서합니다().so
파일). 제은 이러한 가 기본 인가 아니면 인가 하는 입니다.제 질문은 이러한 라이브러리의 코드가 메인 애플리케이션과 동일한 힙에 메모리를 할당할 것인지 아니면 자체 힙을 사용할 것인지입니다.
를 들면, 은, ..so
철통같이 걸려온 전화하다malloc
, 애플리케이션과 동일한 힙 관리자를 사용할 것인가 아니면 다른 힙 관리자를 사용할 것인가요?또한, 공유된 기억 속의 글로벌 데이터는 어떨까요?그것은 어디에 있습니까?애플리케이션의 경우 bss와 데이터 세그먼트에 있다는 것은 알고 있지만, 공유된 객체 파일에 대한 위치는 모릅니다.
제 질문은 이러한 라이브러리의 코드가 메인 애플리케이션과 동일한 힙에 메모리를 할당할 것인지 아니면 자체 힙을 사용할 것인지입니다.
도서관에서 동일한 것을 사용하는 경우malloc/free
프로그램:용예:에서)glibc
- - , 합니다.
라이브러리에서 사용하는 경우mmap
직접적으로는 프로그램 자체가 사용하는 메모리가 아닌 메모리를 할당할 수 있습니다.
예를 들어 .so 파일의 일부 기능은 malloc을 호출하는데, 애플리케이션과 동일한 힙 관리자를 사용할까요, 아니면 다른 힙 관리자를 사용할까요?
.so에서 malloc을 호출하면 이 malloc은 프로그램에서 호출한 malloc과 동일합니다.Linux/glibc(>2.1)에서 심볼 바인딩 로그를 볼 수 있습니다.
LD_DEBUG=bindings ./your_program
예, 여러 힙 관리자 인스턴스(기본 구성)는 서로에 대해 알지 못하면 공존할 수 없습니다(문제는 인스턴스 간에 brk 할당된 힙 크기를 동기화하는 것입니다).그러나 여러 인스턴스가 공존할 수 있을 때 구성이 가능합니다.
대부분의 고전적인 malloc 구현(ptmalloc*, dlmalloc 등)은 시스템에서 메모리를 가져오는 두 가지 방법을 사용할 수 있습니다.brk
그리고.mmap
할 수 Brk는 선형이며 성장하거나 축소할 수 있는 고전적인 힙입니다.Mmap을 사용하면 어느 곳에서나 많은 메모리를 얻을 수 있으며, 어떤 순서로든 이 메모리를 시스템에 반환(사용 가능)할 수 있습니다.
할 수 malloc 하면 brk 메서드 를.면 malloc.mmap
또는 고전적인 선형 힙을 비활성화하고 모든 할당은 불연속적인 mmaped fragmen으로 이루어집니다.
라이브러리에는 와 수 있습니다. 예를 들어.malloc
한으로 brk
비활성화 또는 비 malloc 메모리 관리자 와 함께.다 .malloc
그리고.free
,malloc1
그리고.free1
또는 이 이름을 동적 연결기에 표시/내보내지 않아야 합니다.
또한, 공유된 기억 속의 글로벌 데이터는 어떨까요?그것은 어디에 있습니까?애플리케이션의 경우 bss와 데이터 세그먼트에 있다는 것은 알고 있지만, 공유된 객체 파일에 대한 위치는 모릅니다.
프로그램과 .so 둘 다 ELF 파일로 생각해야 합니다.가 든을 들어 ELF에는 더"다(readelf -l elf_file
ELF에서 메모리로 데이터를 로드하는 방법은 프로그램 헤더의 종류에 따라 달라집니다.이 "이"인LOAD
으로 ", 입니다.mmap
에서 .edSic!)에서 memory.ed(Sic!)에서 memory.일반적으로 두 개의 LOAD 세그먼트가 있습니다. 첫 번째는 R+X(읽기+실행) 플래그가 있는 코드용이고 두 번째는 R+W(읽기+쓰기) 플래그가 있는 데이터용입니다.둘다요..bss
그리고..data
(글로벌 데이터) 섹션은 쓰기 활성화 플래그가 있는 LOAD 유형의 세그먼트에 배치됩니다.
실행 파일과 공유 라이브러리 모두 LOAD 세그먼트가 있습니다.일부 세그먼트에는 memory_size > file_size가 있습니다. 첫 두 합니다를 ,은 ELF고,분(memory_size-file_size)은 0우)다로 .*bss
),션) mmap(/dev/zero)
그리고.memset(0)
Kernel이나 Dynamic Linker가 ELF 파일을 메모리에 로드할 때, 그들은 공유를 생각하지 않을 것입니다.예를 들어, 같은 프로그램을 두 번 시작하려고 합니다.첫 번째 프로세스는 ELF 파일의 읽기 전용 부분을 mmap과 함께 로드합니다. 두 번째 프로세스는 동일한 mmap을 수행합니다(aslr이 활성화된 경우 - 두 번째 mmap은 다른 가상 주소로 들어갑니다).페이지 캐시(VFS 서브시스템)는 데이터의 단일 복사본을 물리적 메모리(COW라고도 함)에 보관하는 작업입니다. mmap은 각 프로세스의 가상 주소에서 단일 물리적 위치로의 매핑만 설정합니다.프로세스가 메모리 페이지를 변경하는 경우, 고유한 개인 물리적 메모리에 쓰기 시 복사됩니다.
적재코드가들어왔습니다glibc/elf/dl-load.c
(_dl_map_object_from_fd
용linux-kernel/fs/binfmt_elf.c
의 ELF더()elf_map
,load_elf_binary
합니다를 합니다.PT_LOAD
.
따라서 글로벌 데이터와 bss 데이터는 각 프로세스에서 항상 비공개로 mmap되며 COW로 보호됩니다.
힙과 스택은 brk+mmap(heap)으로 런타임에 할당되고 OS 커널은 brk와 유사한 프로세스(메인 스레드 스택의 경우)로 자동 할당됩니다.됩니다.mmap
인에pthread_create
.
심볼 테이블은 리눅스의 전체 프로세스에 걸쳐 공유됩니다.malloc()
공정의 어떤 부분도 다른 모든 부분과 동일하기 때문입니다.예를 ,,malloc()
그리고 나서 그들은 같은 더미를 공유할 것입니다.
언급URL : https://stackoverflow.com/questions/8866790/do-shared-libraries-use-the-same-heap-as-the-application
'programing' 카테고리의 다른 글
팝업에서 우커머스 체크아웃 (0) | 2023.10.20 |
---|---|
(Maria SQL + Node.js)에서 쿼리 문자열의 로그를 보는 방법은 무엇입니까? (0) | 2023.10.15 |
리퀴베이스가 있는 하나의 sqlFile에 PL/Sql 및 SQL 스크립트? (0) | 2023.10.15 |
을 가져옵니다.을 가져옵니다.을 가져옵니다. (0) | 2023.10.15 |
레코드가 없는 경우 MySQL SUM 쿼리 반환을 null이 아닌 0으로 만들려면 어떻게 해야 합니까? (0) | 2023.10.15 |