정적 링킹 라이브러리는 기본적으로 해당 라이브러리의 코드, 데이터가 실행 파일에 모두 포함된다. 그래서 실행 파일이 무겁고 프로그램 시작과 동시에 모든 정적 링킹 라이브러리들이 메모리에 로드된다.
장점은 실행 파일만 있으면 프로그램을 실행시킬 수 있다는 것이다.
반면 단점은 사용하지 않을 라이브러리도 프로그램 시작과 동시에 모두 메모리에 로드가 되고, 똑같은 정적 링킹 라이브러리가 여러 프로그램에 포함이 되어도 같은 라이브러리 데이터가 각각의 프로그램마다 각각 하나씩 메모리에 중복되어 로드된다.
동적 링킹 라이브러리는 라이브러리 코드, 데이터가 실행 파일에 포함되지 않고 별개의 파일로 존재한다. 그리고 실행 파일을 실행 시킨 후 동적으로 메모리에 라이브러리 데이터가 로드된다.
이러한 특징들 덕분에 장점으로는 프로그램 실행 후 곧바로 사용하지 않을 라이브러리 데이터인 경우에는 로드하지 않고 프로그램 실행 도중 필요한 특정 시점에 라이브러리 데이터를 메모리에 로드할 수 있다는 장점이 있다. 또한 이 동적 링킹 라이브러리 데이터는 OS단에서 그 리스트를 관리하고 있기 때문에 서로 다른 별개의 프로그램이 같은 동적 링킹 라이브러리를 로드하려는 경우 이미 메모리에 라이브러리 데이터가 로드되어 있으면 중복하여 메모리에 로드하지 않고 기존에 메모리에 로드되어 있던 데이터를 활용한다.
조금 더 자세히 얘기하면 라이브러리의 코드 영역은 프로그램 ( 프로세스 )간 공유를 하고 데이터 ( 상수 데이터 등등… )는 프로그램간 공유를 하지 않고 각자 따로 관리한다. 또한 각각의 라이브러리 데이터들은 피지컬 메모리에 페이지 단위로 로드되어 관리되기 때문에 각각의 프로그램에서 Logical 주소 ( Virtual 주소 ), 페이지 테이블에서 피지컬 메모리 상의 페이지와 매핑 시켜주기만 하면 된다. ( Memory Mapped IO ). Memory Mapped IO를 덕분에 동일한 동적 라이브러리를 여러 프로그램에서 동시에 로드해도 실제 Physical하게 메모리 상에 올라온 데이터는 하나만 존재한다. 동적 라이브러리의 데이터는 해당 라이브러리를 로드한 각각의 프로세스에서 서로 다른 virtual address를 가지지만 실제로 매핑된 physical한 메모리 주소(정확히는 페이지)는 동일하다. 만약 로드한 라이브러리의 주소에 쓰기 동작을 수행하면 그제서야 physical한 라이브러리 데이터의 복사본을 만들어서 그 복사본으로 virtual address를 매핑시켜준다. ( Copy On Write )
그래서 똑같은 동적 링킹 라이브러리를 관리하는 모든 프로그램들이 모두 종료되기 전까지는 동적 링킹 라이브러리는 메모리에서 소멸되지 않는다.
references : https://m.blog.naver.com/PostView.naver?blogId=ya3344&logNo=222477134951&navType=tl