운영체제 - 정적 라이브러리 / 동적 라이브러리

rizz·2024년 2월 3일
0

운영체제

목록 보기
1/3

📒 정적 라이브러리 / 동적 라이브러리

📌 라이브러리(Library)란?

  • 소프트웨어를 만들 때 쓰이는 서브 루틴들이나 함수들의 집합을 의미한다.
  • 반복적인 코드 작성을 하지 않고 필요한 곳에서 호출하여 사용할 수 있다.
  • 링크될 수 있도록 컴파일된 형태인 목적 코드(object code) 형태로 존재한다.
  • 미리 컴파일되어 있어, 시간을 단축할 수 있다.
  • 프로그램 빌드 시에 실행 바이너리에 포함되는 정적 라이브러리와 실행 파일과 분리되어 사용되는 동적 라이브러리로 분류된다.

📌 라이브러리를 사용하는 이유

  • 코드 재사용을 위해 조직화한 초창기 방법의 하나이다.
  • 많은 다른 프로그램들에서 사용할 수 있도록 운영체계나 소프트웨어 개발 환경 제공자들에 의해 제공되는 경우가 많다.
  • 라이브러리 내에 있는 루틴들은 범용적으로 사용이 가능하다.
  • 사용자의 프로그램과 링크되어 실행이 가능한 완전한 프로그램을 이룬다.

📌 정적 라이브러리(Static Library / LIB)란?

  • 링킹 단계에서 라이브러리(*.lib 파일)를 실행 바이너리에 포함한다.
  • 컴파일의 링킹 단계에서 실행 파일에 결합한다.
  • 즉, 링킹 단계에서 라이브러리의 내용이 실행 바이너리에 포함된다.

📌 정적 라이브러리의 장점

  • 라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 포함되기 때문에 별도의 추가 작업이 없고 독립적으로 라이브러리의 함수들을 사용할 수 있다.
  • 실행 파일에 라이브러리의 내용이 포함되어 있기 때문에 실행 시에 라이브러리가 필요하지 않다.
  • 이식성이 좋다.
  • 시스템 환경이 변해도 애플리케이션에 아무런 영향이 없고 완성된 애플리케이션을 안정적으로 사용할 수 있다.
  • 런타임 시점에 외부를 참조할 필요가 없기 때문에 속도 면에서는 동적 라이브러리보다 빠르다.

📌 정적 라이브러리의 단점

  • 정적 라이브러리를 사용할 때, 소스 코드가 복사되는 것이기 때문에 필요하지 않은 부분 또한 복사되기 때문에 메모리를 낭비하게 된다.
  • 이러한 코드가 많아질수록 코드 중복이 늘어나게 된다.
  • 라이브러리 파일을 다시 만들었을 시, 이 라이브러리를 사용하는 모든 실행 파일은 새로 만든 라이브러리 파일을 사용하여 다시 컴파일해야 한다.
  • 라이브러리에 변경 시, 파일 전체를 다시 컴파일하여 재배포해야 한다.

  • DLL을 컴파일하고 나면 2개의 파일이 생성된다.
  • *.lib과 *.dll 파일이다. (여기에서의 *.lib 파일은 정적 라이브러리의 *.lib 파일과는 전혀 다르다.)
  • *.lib 파일 : 라이브러리 전체 코드를 포함하는 바이너리이며, DLL이 제공하고자 하는 함수 정보(함수명)를 가지는 정보 파일이다.
  • DLL에 포함되어 있는 함수들은 실행 파일에 포함되지 않고 별도의 파일로 존재하게 된다.
  • 실행 파일에서 사용하고자 하는 경우에만 필요한 DLL을 선택적으로 사용할 수 있다.
  • 프로그램이 실행될 때 실행 파일에 포함된다.
  • 실행 바이너리를 링킹 단계에서 실행 바이너리의 *.obj 파일들과 DLL의 *.lib 파일과 함께 링크하여 이 정보를 토대로 runtime에 DLL의 함수 코드를 참조하게 된다.
  • 즉, *.lib 파일은 링킹 시에 필요하고, *.dll 파일은 실행 시에 필요하다.
  • DLL을 링킹하는 방법은 암시적 링킹(Implicit Linking)과 명시적 링킹(Explicit Licking) 방식이 존재한다.

암시적 링킹(Implicit Linking)

  • 실행 파일 자체에 어떠한 *.dll 파일의 함수를 호출하겠다는 정보를 포함시키고 프로그램 실행 시에 해당 함수들을 초기화한 후 사용하는 방식이다.
  • 프로그램 시작 시점에 *.dll이 로딩되고 프로그램 종료 시점에 메모리에서 해제된다.
  • *.lib 파일에 사용할 함수의 정보를 포함하고 동적 링킹된다.
  • 실행 파일이 실행되면 자동으로 DLL을 로드하기 때문에 프로그래머가 DLL을 사용하기 위해 별도의 작업을 하지 않아도 된다.
  • 해당 경로에 DLL 파일이 존재하지 않으면 응용 프로그램 또한 동작하지 않는다.
  • 프로그램이 실행될 때 *.dll 파일이 로드되기 때문에 실행 시 연결이라고 한다.

명시적 링킹(Explicit Licking)

  • 프로그램이 실행 중일 때 *.dll 파일이 있는지 검사하고 동적으로 원하는 함수만 호출하는 방식이다. (호출할 함수의 포인터를 얻어 호출하는 방법)
  • 링킹 과정에서 *.dll의 함수 정보가 필요하지 않기 때문에 *.lib 파일이 필요하지 않다.
  • 직접 코드를 통해 원하는 함수만 불러와서 사용할 수 있다.
  • 프로그램 실행 중에 *.dll 파일이 메모리에 읽히기 때문에 실행 중 연결 이라고 한다.

📌 동적 라이브러리의 장점

  • 정적 라이브러리는 빌드 시에 라이브러리를 함께 컴파일이 이루어져아 하기 때문에 프로그램마다 라이브러리의 코드를 갖고 있지만, 동적 라이브러리는 메모리에 올라와 있는 DLL을 참조하여 사용하기 때문에 하나의 코드만 존재하면 된다.
  • 정적 라이브러리보다 실행 파일의 크기가 작아지고 여러 프로그램이 동적 라이브러리를 메모리에 올려놓고 공유하며 사용하기 때문에 메모리를 효율적으로 사용할 수 있다.
  • 라이브러리 수정 시, 실행 파일을 새로 컴파일할 필요 없이 동적 라이브러리만 다시 컴파일하여 재배포할 수 있다.
  • DLL의 함수가 변경되었어도, 함수의 인수 또는 반환 값이 변경된 것이 아니라면 그 함수를 사용하는 응용 프로그램을 다시 컴파일 하거나 링킹하지 않아도 된다.
  • 서로 다른 프로그래밍 언어로 작성된 프로그램인 경우에도 함수의 호출 규약을 따르기만 한다면 여러 프로그램에서 동일한 DLL 함수를 호출할 수 있다.

📌 동적 라이브러리의 단점

  • 외부 의존도가 생기기 때문에 이식성이 떨어진다.
  • 매번 프로그램 영역에서 라이브러리가 저장된 주소로 이동하는 과정에서 오버헤드가 생긴다.
profile
복습하기 위해 쓰는 글

0개의 댓글