printf() 같은 함수를 라이브러리에서 제공.
라이브러리를 링크 시 static 방식으로 할 지, dll 방식으로 할 지,
디버깅 정보를 넣을지, 배포용으로 할지
개발 완료 시 첫 번째 옵션으로 릴리즈하는게 일반적.

Multi-threaded debug library

라이브러리 링크 방식.
Static으로 링크를 걸면 실행 파일 안에 라이브러리가 들어감. 똑같은 라이브러리를 써도 3개의 실행 파일이 각기 다르기 때문에 자신만의 메모리 공간에 라이브러리를 별도로 저장

DLL은 실행 파일이 필요로 하는 라이브러리를 가지고 있지 않고, 하나의 라이브러리를 여러 실행 파일이 공유하는 방식.
프로그램이 메모리 공간에 올라와 실행이 될 때 링크가 걸림.
둘 중 어느 방식이 좋다고 할 수 없고, 일반적인 어플리케이션을 배포할 때는 정적 라이브러리를, 용량 상 문제가 있을 때는 DLL을 사용하기도 함.
DLL은 내부의 기능적인 부분을 수정할 수 있다는 장점이 있다.
보통 작은 DLL이 여러 개 있고, 하나의 실행 파일이 여러 DLL을 하나로 구성해서 사용되는데, 문제가 생긴 DLL을 패치 및 교체할 수 있음.


DLL의 경우 별도의 DLL 파일이 존재하고 필요할 때 가상 메모리에 맵핑시키는 구조.


DLL의 경우 이미 올라가 있는 영역을 사용.
실행 파일이 라이브러리의 실체를 가지고 있는게 아니고 별도의 DLL 파일에 있는 데이터를 가상 메모리에 맵핑을 한 것이기 때문.

물리 메모리 주소 = RAM의 주소
물리 메모리에 할당된 주소 = RAM + 캐쉬 + 하드 디스크까지 확장된 개념
가상 메모리와 RAM이 있을 때, 하드웨어 관점에서 DLL이건
RAM 입장에서는 DLL이건 프로세스건 필요로 하면 RAM에 올려서 실행하고, 사용 안 되고 있으면 페이지 알고리즘에 의해 RAM에서 내림.
DLL은 둘 이상의 프로세스가 동시에 활용할 수 있기 때문에 빈도수가 높아 RAM에 올라갔을 때 내려갈 확률이 비교적 낮음.
그러나 많이 사용되지 않는다면 DLL도 페이지 알고리즘에 의해 RAM에서 내려가고 하드 디스크에 임시 보관.
즉 DLL이 한 번 로드되면 물리 메모리에 계속 남겨는 두지만 계속 RAM에 남아있는 것은 아니다.
DLL은 물리 메모리에 한 번 올라가 가상 메모리 주소가 할당되면 해당 주소는 고정.
하나의 DLL을 사용하는 두 프로세스가 있을 경우 DLL을 위한 주소 범위는 일치.
주소가 같기 때문에 컨텍스트 스위칭이 일어나더라도 RAM에 올려둔 DLL 주소를 내릴 필요가 없다.
