Windows Confidential알려진 DLL 균형 조정 작업

Raymond Chen

흔히 "알려진 DLL"이라고도 하는 이 Windows 기능은 커널의 모듈 로더가 특별하게 처리하는 DLL(동적 연결 라이브러리) 목록을 의미합니다. 로드 시 알려진 DLL에 동적으로 연결되는 프로그램을 로더가 발견하면 모듈 로드에 일반적으로 적용되는 검색 알고리즘이 무시되고 알려진 복사본이 즉시 사용됩니다. 이것을 다소 약한 보안 기능으로 간주하는 사람들도 있지만, 사실 이 기능의 본래 목적은 보안이 아닙니다. 알려진 DLL은 성능을 목적으로 개발된 것입니다.

알려진 DLL 기능의 메커니즘은 시간에 따라 변경되었습니다. 일부 Windows® 버전의 커널에서는 알려진 DLL 목록을 시작 지점으로 사용한 다음 이러한 알려진 DLL이 연결되는 모든 DLL을 찾은 후 다시 이 DLL이 연결되는 모든 DLL을 찾는 방식으로 작업을 실행합니다. 이러한 프로세스를 통해 모든 종속성의 이행적 폐쇄(Transitive Closure)가 구성되고 모두 알려진 것으로 처리됩니다. 다른 Windows 버전에서는 이러한 이행적 폐쇄가 구성되지 않으며, 대신 알려진 것으로 명시적으로 나열된 DLL만 알려진 것으로 처리됩니다. 일부 Windows 버전에서 알려진 DLL은 시스템 시작 시 커널을 통해 미리 로드됩니다. 다른 버전에서는 이러한 미리 로드가 실행되지 않고 커널이 목록만을 사용하여 DLL 경로를 검색하는 작업을 처리합니다.

알려진 DLL 목록에 대한 해석 외에도 버전에 따라 몇 가지 사항에 차이가 있습니다. 알려진 DLL 레지스트리 키의 내용도 이러한 변경의 영향을 받습니다. Windows 성능 팀은 응용 프로그램이 Windows를 사용하는 방식에 대한 이해를 바탕으로 알려진 DLL 목록과 이 목록이 DLL 집합으로 변환되는 규칙을 변경했습니다. 엔지니어링 분야에서 흔히 볼 수 있듯이 이러한 작업에는 절충이 필요합니다. 시스템 시작 시 알려진 DLL을 미리 로드하면 해당 DLL을 사용하는 응용 프로그램의 시작 속도가 빨라지는 이점이 있지만 그에 따른 단점도 있습니다. 즉, 해당 DLL이 실제로 사용되는지 여부에 관계없이 메모리에 남아 있기 때문에 시스템 시작 시간이 길어지고 메모리 소비가 증가합니다. 따라서 이 작업은 다른 어떤 것을 희생하고 일부 구성 요소의 성능을 향상시키는 것입니다. 이 두 가지 사이에서 균형을 유지하는 것은 쉽지 않으므로, 사용 패턴이 변화함에 따라 끊임없이 조정해야 합니다.

알려진 DLL에서 눈에 잘 띄지 않을 수 있는 한 가지 중요한 것은 알려진 DLL이 로컬에서 리디렉션된 DLL보다 높은 우선 순위를 가진다는 점입니다. 로컬에서 리디렉션된 DLL에 대해서는 필자의 2007년 1월호 칼럼에서 살펴보았습니다. 잘 생각해 보면 이것은 특이한 것이 아니라 실제로 예상되는 동작임을 알 수 있습니다. 결국 알려진 DLL 목록의 목적은 검색 경로를 우회하고 이를 통해 DLL 로드 속도를 높이는 것입니다. 커널이 로컬에서 리디렉션된 DLL을 찾아야 한다면 속도는 느려질 것입니다. 검색 경로에 디렉터리 하나를 추가한다고 해서 큰 문제가 되지는 않을 것으로 생각할 수도 있겠지만, 이 하나의 디렉터리가 지구 반대편의 네트워크 서버라고 가정한다면 심각한 성능 저하를 야기할 수도 있습니다.

사실 우리는 알려진 특정 DLL을 사용하는 프로그램을 본 적이 있습니다. 응용 프로그램 디렉터리에 있는 Version.dll이라는 파일을 사용하는 프로그램 하나가 있었습니다. 일반적인 규칙에 따르면 Version.dll의 이 복사본은 시스템 디렉터리의 해당 dll 파일을 무시하지만 Windows XP에서 Version.dll은 알려진 DLL로 나열됩니다. 즉, 응용 프로그램 디렉터리에 있는 복사본이 무시되고 시스템 디렉터리에 있는 버전이 사용됩니다.

Windows Vista®에서 Version.dll은 더 이상 알려진 DLL이 아닙니다. 아마 응용 프로그램에서 이 파일을 사용하는 데 따른 성능상의 이점이 이에 관련된 희생을 상쇄하지 않기 때문일 것입니다. 결과적으로 응용 프로그램 디렉터리에 설치된 DLL을 무시하는 커널을 응용 프로그램이 실제로 사용하기 때문에 이 프로그램은 Windows Vista에서는 작동하지 않습니다. 이 프로그램은 자의적으로 DLL을 해당 검색 경로에 설치한 다음 Windows가 이 DLL 파일을 무시하도록 합니다. Windows가 파일을 무시하도록 하는 것보다는 애초에 파일을 설치하지 않는 편이 오히려 효율적인 메커니즘일 것입니다. 문제는, 이 프로그램을 작성한 회사에서 보안상의 문제가 되는 버그를 발견했다고 주장한다는 점입니다.

Raymond Chen은 The Old New Thing 웹 사이트와 동명의 저서(Addison-Wesley, 2007)에서 Windows의 역사와 Win32 프로그래밍에 대해 다루고 있습니다. 그는 이제 자신의 티셔츠 치수를 더 이상 모른다고 합니다.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..