QNX RTOS: 1-7. Shared Objects
2025. 11. 25. 17:08ㆍ운영체제/QNX
Shared Object는 컴파일 시점이 아니라, 프로세스가 실행되는 런타임(Run-time)에 프로세스 내부로 반입되는 코드를 말함. 정적 라이브러리(Static Library)가 실행 파일 안에 완전히 포함되는 것과는 대조적임.

1. 두 가지 로딩 방식
Shared Object를 프로세스에 가져오는 방법은 크게 두 가지가 있음.
1.1. 링킹 시점의 의존성 해결 (Implicit Linking)
- 프로그램 빌드 시 -l 옵션 등을 사용해 libc.so나 lib-tcpip.so 같은 라이브러리를 링크함.
- 이 경우, 컴파일된 프로그램 파일 헤더에 "이 프로그램이 실행될 때 이 라이브러리들도 같이 로딩해줘"라는 정보가 기록됨.
- 시스템 로더(Loader)가 프로세스를 생성할 때, 이 정보들을 보고 자동으로 해당 라이브러리 코드를 메모리로 가져옴.
1.2. 명시적 로딩 (Explicit Loading)
- 코드 내부에서 필요할 때 직접 함수를 호출해 라이브러리를 로드함. 흔히 DLL(Dynamic Link Library) 방식이라 부르는 형태임.
- dlopen(): 라이브러리 파일을 염.
- dlsym(): 라이브러리 내부의 함수 심볼 주소를 찾음.
- 이 방식은 플러그인 시스템을 만들거나, 필요할 때만 메모리를 쓰고 싶을 때 유용함.
2. 메모리 효율성: One Copy 전략
Shared Object를 사용하는 가장 큰 이유는 시스템 메모리 절약임.
- 만약 5개의 프로그램이 libc.so를 사용한다고 해서, 물리 메모리에 libc.so가 5개 올라가는 것이 아님.
- 물리 메모리(System Memory)에는 단 하나의 사본만 로드됨.
- 각 프로세스의 가상 주소 공간에는 이 물리 메모리 영역이 Read-Only로 매핑됨.
- 즉, 코드는 공유하되 누구도 그 코드를 수정할 수는 없게 하여 안전성을 확보함.
3. 핵심 주의사항: 데이터의 독립성 (Process Private)
임베디드 개발자들이 가장 자주 착각하여 버그를 만드는 지점이 바로 여기임.
"라이브러리 코드가 공유되니까, 라이브러리 안에 선언된 전역 변수(Global Data)도 프로세스끼리 공유되겠지?" -> 절대 아님.
- 코드(Text Section): 공유됨 (Read-Only).
- 데이터(Data Section): 각 프로세스마다 별도의 사본을 가짐 (Process Private).
예를 들어, Shared Object 안에 int count = 0;이라는 전역 변수가 있다고 가정해보자. 프로세스 A가 count를 10으로 바꿔도, 프로세스 B에서 보이는 count는 여전히 0임. 각 프로세스는 자신만의 데이터 영역을 가지고 있기 때문임.
해결책: 명시적 데이터 공유
만약 프로세스 간에 데이터를 정말로 공유해야 한다면, Shared Object의 변수를 이용하는 것이 아니라, 앞선 챕터나 OS 기능인 Shared Memory(공유 메모리) 객체를 명시적으로 생성해서 사용해야 함.
요약
- Shared Object는 런타임에 로드되는 코드이며, 시스템 로더가 자동으로 가져오거나 개발자가 dlopen으로 직접 가져올 수 있음.
- 물리 메모리에는 단 한 카피만 존재하며 여러 프로세스가 이를 공유해 메모리를 절약함.
- 코드는 공유되지만, 라이브러리 내부의 데이터(변수)는 프로세스마다 독립적임. 데이터 공유를 원하면 별도의 IPC(공유 메모리 등)를 써야 함.
'운영체제 > QNX' 카테고리의 다른 글
| QNX RTOS: 1-9. Boot Sequence (0) | 2025.11.25 |
|---|---|
| QNX RTOS: 1-8. OS Service (0) | 2025.11.25 |
| QNX RTOS: 1-6. System Library (0) | 2025.11.25 |
| QNX RTOS: 1-5. Resource Managers (0) | 2025.11.25 |
| QNX RTOS: 1-4. Process Manager (0) | 2025.11.25 |