이론/기초

OS - 라이브러리

tsyang 2023. 8. 20. 18:10

라이브러리

여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 파일을 의미한다.

 

다음 코드를 보자

#include <stdio.h>

int main()
{
	printf("Hello");
    return 0;
}

 

실행 가능한 printf 함수의 바이너리는 어디에 있을까?

 

stdio.h 있을까? 안에 존재하는 것은 printf함수의 정의가 아니라 선언이다.

 

그럼 어디에있음? "라이브러리" 있다.

 

 

라이브러리는 정적 라이브러리랑 동적 연결 (Dynamic link)라이브러리 나눌 있다.

 

 

.

 

 

정적 라이브러리(static library)

static library 만드는 상상을 해보자. 헤더에 함수를 선언하고, 적절히 정의도 해놨다.

 

foo.h / foo.cpp 이렇게하고 컴파일 돌리면 foo.lib 생겼다.

 

그래서 다른 프로젝트에서 #include "foo.h" 하고 foo() 호출한다. 잘 동작할까?

 

아니다. 링커가 foo()함수를 못찾았다고 오류를 발생시킬 것이다. 따라서 프로젝트한테 foo()함수는 foo.lib 있다고 알려줘야 한다. 이를 위해 프로젝트 빌드 시 foo.lib을 포함한다고 설정해줘야 한다. 프로젝트 속성에서 지정을 해 주거나 별도 코드로 지정이 가능하다.

 

여기서 중요한건 라이브러리가 실행파일 안에 포함된다 것이다. 이제 둘은 분리못함

 

 

.

 

 

동적 라이브러리(DLL)

동적은 말 그대로 실행파일 안에 라이브러리를 포함시키지 않고, 동적으로 포함시킨다는 것이다. 

 

이건 그럼 왜 쓸까? 우선 중복을 제거할 수 있다는 이점이 있다.

 

예를들어서 A,B,C 실행파일(.exe) 있고 이게 전부 foo.lib 쓴다고 해보자. 그러면 가지 실행파일에 모두 foo.lib 중복 포함되어있다. 세가지 프로그램을 실행한다 치면? 메모리의 Code영역에 foo.lib 내용들 중복해서 올라갈 것이다.

 

따라서 foo.lib을 외부 링크로 빼서 하나만 메모리 영역에 올려두고 있으면 더 효율적으로 메모리를 관리할 수 있다.

 

추가적으로 메모리 관리 측면에서도 이점이 있다.

 

A.exe 가상 메모리가 있다고 치자. 그러면 여기에는 정적 라이브러리도 포함된다. 이는 정적 라이브러리를 포함하여 가상 메모리를 구성한다는 뜻이다. 즉,  A 프로세스를 실행중일 메인메모리에 정적 라이브러리 영역이 포함될 있다는 뜻이다.

 

아무튼 CPU A,B 개의 프로세스를 실행한다. 프로세스 전환 시에 메인 메모리에 올라가 있는 A.exe와 B.exe의 가상 메모리 영역이 스왑되겠지?

근데 정적 라이브러리에서 동일한 메모리 영역을 A,B 공유한다면? A,B 전환될 공유함에도 불구하고 메모리 반환한다음, 각자의 라이브러리 영역을 새로 올려야 .

 

만약 DLL이라면? 어쩌피 사용하는 영역은 같을 태니까 그냥 놔두면 된다. 이 때 공유는 페이지 단위로 된다.

 

DLL만들때는 lib, dll 생기는데 여기서의 lib파일은 링크할때 필요한 정보들을 들고 있는거임.

 

 

.

 

dll extern 선언

네임 맹글링이라는 걸 알아야 하는데 컴파일러가 이름을 정해진 규칙에 의해 바꾸는 . 근데 이게 컴파일러마다 다름. 예를 들면 c에서는 네임 맹글링을 수행하지 않는데  cpp에서는 수행한다.

 

이걸 언급했냐? dll 하나가 있는데 이게 서로 다른 네임 맹글링 방식을 컴파일러가 생성한 코드들에서 같이 쓰고 있다고 해보자. 서로 다른 컴파일러는 서로 다른 이름으로 dll 있는 함수의 이름을 바꿀 것인데. 그럼 당연히 해당 함수를 못 찾게 된다.

 

따라서 "이 함수는 네임 맹글링 하지마~" 라고 지정해줄 필요가 있다. 그래서 extern "C" 이렇게 선언을 앞에 해주면 이름이 변경되지 않음. (IL2CPP에서 C# IL코드를 CPP로 바꿀때도 지정해줌)

 

아무튼 이렇게 가져다 쓰면 암묵적 연결이고.. 명시적으로 연결할 수도 있음. 코드 내에서 dll 연결하는 함수를 호출하면 .

 

'이론 > 기초' 카테고리의 다른 글

네트워크 - 레이턴시 및 신뢰성  (0) 2023.09.01
게임 네트워크 토폴로지  (0) 2023.08.27
OS - 메모리 관리 기초  (0) 2023.08.13
OS - 쓰레드  (0) 2023.08.06
OS - 프로세스  (0) 2023.07.30