극단적 인 수준의 정적 연결이 응용 프로그램 및 시스템 성능에 막대한 영향을 줄 수있는 시스템이 엄청나게 증가하고 있습니다.
나는 종종 "임베디드 시스템 (embedded systems)"이라 불리는 것을 언급하는데, 그 중 다수는 현재 범용 운영 체제를 점점 더 많이 사용하고 있으며, 이러한 시스템은 상상할 수있는 모든 것에 사용됩니다.
매우 일반적인 예는 Busybox를 사용하는 GNU / Linux 시스템을 사용하는 장치 입니다. 커널과 루트 파일 시스템을 모두 포함하는 부팅 가능한 i386 (32 비트) 시스템 이미지를 빌드하여 NetBSD 를 사용 하여이를 최대한 활용 했습니다. 후자 crunchgen
는 하드 링크 가있는 단일 정적 링크 (by ) 바이너리를 포함합니다. 그 자체가 표준 전체 기능 시스템 프로그램 (대부분 툴체인 제외)을 모두 포함 하고있는 (최종적으로 274 개) 모든 프로그램을 포함 하며 크기 는 20 메가 바이트 미만 입니다. 루트 파일 시스템이 압축되지 않고 완전히 RAM에 있더라도 메모리를 테스트 할 수는 없었습니다.
정적 링크 바이너리의 시작 시간이 빠르며 훨씬 빠를 수 있다고 이전 포스트에서 언급 했지만, 특히 모든 객체 코드가 동일하게 연결된 경우에는 그림의 일부일뿐입니다 파일, 특히 운영 체제가 실행 파일에서 직접 코드 페이징을 요구하는 경우. 이 이상적인 시나리오에서 프로그램의 시작 시간은 문자 그대로 무시할 init
수 있습니다. 요청 된 프로그램이없는 경우에도 거의 모든 코드 페이지가 이미 메모리에 있고 셸 (및 실행중인 다른 백그라운드 프로세스)에서 사용 중이기 때문입니다. 프로그램의 런타임 요구 사항을 충족시키기 위해 한 페이지의 메모리 만로드하면되므로 부팅 이후로 실행 된 적이 있습니다.
그러나 그것은 여전히 전체 이야기가 아닙니다. 또한 일반적으로 모든 바이너리를 정적 링크하여 전체 개발 시스템에 NetBSD 운영 체제 설치를 빌드하고 사용합니다. 비록 디스크 공간이 엄청나게 더 많이 필요하지만 (툴체인과 X11 정적 링크를 포함한 모든 것을 가진 x86_64의 경우 총 ~ 6.6GB) (특히, 모든 프로그램에 대해 전체 디버그 기호 테이블을 ~ 2.5GB까지 사용할 수있는 경우) 결과는 여전히 전체적으로 더 빠르게 실행되며, 일부 작업의 경우 라이브러리 코드 페이지를 공유하려는 일반적인 동적 연결 시스템보다 적은 메모리를 사용합니다. 디스크는 상대적으로 저렴도하지만, CPU 사이클이 정말로, 그리고 지불 자주 디스크 파일을 사용하는 캐시에 도착하는 저렴한 (심지어 빠른 디스크), 및 메모리입니다 ld.so
시작하는 모든 프로세스에 대한 시작 비용 매를시작하는 데는 많은 프로세스를 시작해야하는 작업 (특히 개발 시스템의 컴파일러와 같은 동일한 프로그램을 계속해서 사용하는 경우)에서 몇 시간과 몇 시간 동안 CPU주기가 소요됩니다. 정적 링크 툴체인 프로그램은 내 시스템의 전체 OS 다중 아키텍처 빌드 시간을 몇 시간 단축 할 수 있습니다. 아직 툴체인을 단일 crunchgen
바이너리 로 빌드하지는 않았지만 CPU 캐시의 승리로 인해 빌드 시간이 더 오래 걸릴 것으로 생각됩니다.