동적 링크 및 정적 링크를 사용하는 경우
운영 체제는 동적으로 링크된 공유 라이브러리를 작성하고 사용하는 기능을 제공합니다. 동적 링크를 사용할 경우 사용자 코드에서 참조되고 공유 라이브러리에 정의된 외부 기호는 로드 시 로더에 의해 해석됩니다. 공유 라이브러리를 사용하는 프로그램을 컴파일하면 공유 라이브러리는 기본적으로 프로그램에 동적으로 링크됩니다.
공유 라이브러리의 개념은 공통으로 사용되는 루틴의 사본은 한 개뿐이며, 이 공통 사본을 고유한 공유 라이브러리 세그먼트에 유지하는 것입니다. 이러한 공통 루틴을 사용하면 실행 가능 프로그램의 크기가 상당히 줄어들 수 있으므로 디스크 공간이 절약됩니다.
동적 링크를 사용하면 프로그램의 크기를 줄일 수 있지만, 이 경우 보통 성능 면에서 장단점이 있습니다. 공유 라이브러리 코드는 디스크의 실행 가능 이미지에 존재하지 않고, 별도의 라이브러리 파일에 보관됩니다. 공유 코드는 공유 라이브러리 세그먼트에서 한 번 메모리로 로드되고 이를 참조하는 모든 프로세스에서 공유됩니다. 따라서 동시에 실행 중인 여러 애플리케이션(또는 동일한 애플리케이션의 사본)이 공유 라이브러리에 제공된 프로시저를 사용할 경우, 동적으로 링크된 라이브러리는 프로그램에 사용되는 가상 스토리지의 양을 줄여줍니다. 지정된 시스템에 저장된 서로 다른 여러 애플리케이션이 라이브러리를 공유할 경우에는 프로그램에 필요한 디스크 공간의 양도 줄어듭니다. 공유 라이브러리의 기타 이점은 다음과 같습니다.
- 공유 라이브러리 코드가 이미 메모리에 있으므로 로드 시간이 줄어듭니다.
- 운영 체제가 단일 애플리케이션에서만 사용되는 코드가 아닌 여러 애플리케이션 또는 애플리케이션 사본에 사용되는 공유 라이브러리 코드를 페이지 아웃할 가능성이 적으므로 실행시간 성능이 향상될 수 있습니다. 따라서 페이지 부재가 덜 발생합니다.
- 애플리케이션 로드될 때 루틴이 애플리케이션에 정적으로 바인드되는 것이 아니라 동적으로 바인드됩니다. 따라서 애플리케이션이 재컴파일 또는 재바인드 없이 공유 라이브러리에 대한 변경사항을 자동으로 상속할 수 있습니다.
동적 링크의 단점은 다음과 같습니다.
- 성능 관점에서, 공유 세그먼트에 액세스하기 위해 실행 가능 프로그램에 필요한 "글루 코드"가 있습니다. 참조당 약 8번의 머신 순환을 수행하는 공유 라이브러리 루틴에 대해 성능 비용이 발생합니다. 공유 라이브러리를 사용하는 프로그램은 일반적으로 정적으로 링크된 라이브러리를 사용하는 프로그램보다 더 느리게 수행됩니다.
- 더 민감한 영향은 "참조 지역 특성"의 감소입니다. 사용자가 라이브러리 내에 있는 소수의 루틴에만 관심이 있는데, 이 루틴이 라이브러리의 가상 주소 공간에 넓게 분산되어 있을 수 있습니다. 따라서 모든 루틴에 액세스하기 위해 접촉해야 하는 총 페이지 수는 이러한 루틴이 실행 가능 프로그램에 직접 바인드된 경우보다 훨씬 더 많습니다. 이 상황이 미치는 한 가지 영향은 사용자만 이 루틴을 사용하는 경우, 모든 루틴을 실제 메모리로 가져오기 위해 더 많은 페이지 부재가 발생한다는 점입니다. 또한 더 많은 페이지에 접촉하므로 명령어 변환 색인 버퍼(TBL) 누락이 더 많아질 수 있습니다.
- 프로그램이 라이브러리에서 제한된 수의 프로시저를 참조할 경우, 참조된 프로시저가 포함되어 있는 라이브러리의 각 페이지는 실제 메모리에 개별적으로 페이징되어야 합니다. 정적 링크를 사용하여 다른 라이브러리 페이지에 있는 여러 프로시저를 단일 페이지에 링크할 수 있을 만큼 프로시저가 작은 경우, 동적 링크를 사용하면 페이징이 증가하고 성능이 저하됩니다.
- 동적으로 링크된 프로그램은 호환 가능한 라이브러리를 사용하는지에 따라 달라집니다. 라이브러리가 변경된 경우(예: 새 컴파일러 릴리스가 라이브러리를 변경할 수 있는 경우), 애플리케이션이 새 라이브러리 버전과 호환 가능하도록 재작업해야 할 수 있습니다. 시스템에서 라이브러리가 제거되면 해당 라이브러리를 사용하는 프로그램은 더 이상 작동하지 않습니다.
정적으로 링크된 프로그램에서 모든 코드는 하나의 실행 가능 모듈에 포함되어 있습니다. 라이브러리 프로시저는 프로그램에 정적으로 링크되므로 라이브러리 참조가 더 효율적입니다. 정적 링크가 있으면 프로그램의 파일 크기가 증가하며, 다른 애플리케이션 또는 애플리케이션의 다른 사본이 시스템에서 실행 중인 경우 메모리에서 코드 크기가 증가할 수도 있습니다.
cc xxx.c -o xxx.noshr -O -bnso -bI:/lib/syscalls.exp이 옵션을 사용하면 링크 프로그램이 사용자 프로그램에서 참조하는 라이브러리 프로시저를 프로그램의 오브젝트 파일에 강제로 배치합니다. /lib/syscalIs.exp 파일에는 시스템에서 프로그램으로 반입되어야 하는 시스템 루틴의 이름이 포함되어 있습니다. 이 파일은 정적 링크용으로 지정해야 합니다. 이름이 지정된 루틴은 동적 링크를 위해 libc.a에 의해 자동으로 반입되므로, 동적 링크 중 이 파일을 지정할 필요가 없습니다. 이러한 옵션에 대한 자세한 내용은 ld 명령의 효율적인 사용 및 Id 명령을 참조하세요.