라이브러리 (Library)

 

함수, 데이터, 타입 등 여러가지 프로그래밍 요소들의 집합이며 보통 lib 확장자를 가진다.

자주 사용되는 함수를 매번 직접 작성해서 사용하는 것은 비생산적인 작업이므로 표준화할 수 있는 함수를 미리 만들어서 모아 놓은 것이 라이브러리이다.

 

이 라이브러리를 프로그램에 링크시키는 방식에 정적 링크와 동적 링크가 있는데 동적 링크 방식을 사용하면 DLL이 된다.

 

 정적 링크 (Static Link)

 

  컴파일 시 라이브러리의 코드를 실행 파일에 복사한다. 때문에 실행 파일의 크기는 커지지만 실행 파일은 단독 실행 파일이 된다.

  컴파일이 끝나면 라이브러리 파일(.lib)이 없어도 프로그램을 실행시킬 수 있다.

 

 동적 링크 (Dynamic Link)

 

  실행 시에 라이브러리가 실행 파일에 연결된다.

  실행 파일에는 호출할 함수의 정보만 포함되고 실제 함수 코드는 복사되지 않으므로 실행 파일의 크기가 작아진다.

  실행 파일에는 실제 라이브러리 코드가 없기 때문에 프로그램 실행 시 DLL이 반드시 있어야 한다.

 

 동적 링크 장점

 

  여러 프로세스가 메모리에 있는 하나의 DLL 복사본을 공유하여 하나의 DLL을 동시에 사용할 수 있다.

  반면, 정적 연결 라이브러리를 사용하여 빌드된 응용 프로그램의 경우 Windows는 각 응용 프로그램에 대해 하나의 라이브러리 코드

  복사본을 메모리에 로드해야 한다.

 

  디스크 공간을 절약할 수 있다. 여러 응용 프로그램이 디스크에 있는 하나의 DLL 복사본을 공유할 수 있다.

  반면, 정적 연결 라이브러리를 사용하여 빌드된 응용 프로그램의 경우에는 각 응용 프로그램마다 별도의 복사본으로서 실행 가능한

  이미지에 링크되는 라이브러리 코드가 있다.

 

  DLL을 보다 쉽게 업데이트 할 수 있다. DLL의 함수가 변경되어도 이 함수의 인수 및 반환 값이 변경되지 않았으면 그 함수를 사용하는

  응용 프로그램을 다시 컴파일하거나 링크할 필요가 없다.

 

  반면, 정적으로 링크되는 개체 코드의 경우에는 함수가 변경되면 응용 프로그램을 다시 링크시켜야 한다.

 

DLL 관리

 

DLL은 가상 메모리에 한 번 로드되면 다시 로드 되지 않는다.

DLL이 메모리에서 삭제되어야 할 시기는 DLL을 사용하는 모든 응용 프로그램이 종료되었을 때이다.

윈도우즈는 DLL별로 사용 카운트(참조 카운트)라는 것을 이용하여 해당 DLL을 사용하는 응용 프로그램이 실행될 때마다 카운트를

1 증가시키고 응용 프로그램이 종료될 때마다 카운트를 1 감소시킨다.

그러다 카운트가 0이 되었을 때 메모리가 삭제된다.

 

DLL Export, Import

 

 Export

 

  함수를 제공하는 DLL에서는 자신이 제공하고자 하는 함수에 대한 정보를 밖으로 공개해야 하며 이 동작을 Export라 한다.

  __declspec은 함수에 대한 정보를 제공하는 선언문이며 Export할 함수 원형 앞에 집어넣으면 된다.

 

1
2
3
4
extern "C" __declspec(dllexportint Add(int a, int b)
{
    return a+b;
}
cs

 

 Import

 

  반대로 DLL을 사용하는 응용 프로그램에서는 어떤 DLL에 있는 어떤 함수를 사용하겠다고 선언해야 하는데 이 동작을 Import라고 한다.

  응용 프로그램에서 사용할 DLL 함수를 아래와 같이 Import하여 사용할 수 있다.

 

1
extern "C" __declspec(dllimportint Add(intint);
cs

 

Import Library

 

DLL을 사용할 프로그램은 자신이 Import할 함수가 어느 DLL에 있는지 알아내기 위해 Import Library를 사용한다.

Import Library는 DLL에서 Export 되는 함수에 대한 정보는 물론 이 함수의 코드가 어떤 DLL에 정의되어 있는지에 대한 정보를 가지고 있다.

단, 함수에 대한 정보만 가지고 있을 뿐 함수의 코드는 가지고 있지 않다.

그래서 응용 프로그램은 링크 시에 Import Library(.lib)를 링크해야 하며 Import Library가 지정하는 DLl 파일을 실행시에 읽어와야 한다.

 

Import Library는 함수에 대한 위치 정보만 가지고 있으므로 컴파일 할때만 필요하며 프로그램 실행과는 아무 상관이 없다.

그래서 DLL 배포시에는 .dll File만 배포하면 된다.

 

MyProject 라는 DLL 생성 프로젝트를 컴파일하면 MyProject.dll (DLL)과 MyProject.lib (Import Library) 두 개의 파일이 생긴다.

 

참고 자료

http://stdesignstar.tistory.com/tag/dll

 

 

'Programming > Knowledge' 카테고리의 다른 글

컴퓨터에 수가 저장되는 방법.  (0) 2017.04.20

컴퓨터가 메모리에 데이터를 저장하는 방법.

 

메모리에 Data가 적재되는 방법으로는 Little Endian 방식과 Big Endian 방식이 있다.

 

Big Endian 방식.

 · 사람과 동일하게 앞에서부터 순차적으로 데이터를 저장하는 방식.

 · 모토롤라 관련 CPU, IBM or 썬마이크로시스템즈의 컴퓨터들이 사용하는 방식.

 · Java의 자바 가상 머신은 운영체제나 하드웨어 상관없이 항상 Big Endian을 사용.

 

 

 ex) 0x12345678 값을 저장한다면 하기와 같은 방식으로 메모리에 저장된다.

 

주소

0x0001

0x0002

0x0003

 0x0004

Data

0x12

0x34

0x56

0x78

 

 

Little Endian 방식.

 

 · Big Endian 방식과 반대로 메모리에 역순으로 데이터를 저장하는 방식

 · Intel 사의 칫셋과 호환이 되는 컴퓨터들이 사용하는 방식.

 

 ex) 0x12345678 값을 저장한다면 하기와 같은 방식으로 메모리에 저장된다.

 

주소

0x0001

0x0002

0x0003

 0x0004

Data

0x78

0x56

0x34

0x12

 

현재 사용중인 컴퓨터에서 어떤 방식으로 저장되는지 확인해보기.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0x12345678;
 
    int* p = &i;
    
    char* p1 = (char *)&i;
    char* p2 = (p1 + 1);
    char* p3 = (p2 + 1);
    char* p4 = (p3 + 1);
 
    printf("%p : %x\n", p, *p);
    printf("%p : %x\n", p1, *p1);
    printf("%p : %x\n", p2, *p2);
    printf("%p : %x\n", p3, *p3);
    printf("%p : %x\n", p4, *p4);
 
    return 0;
}
cs

 

<결과>

 

주소

0x002DF928

0X002DF929

0X002DF92A

 0x002DF922B

Data

0x78

0x56

0x34

0x12

 

현재 사용중인 lenovo T530 노트북은 Little Endian 방식임을 알 수 있다.

(결과 주소는 PC마다 다르게 나올 수 있음.)

 

 

컴퓨터가 음수를 처리하는 방법.

 

컴퓨터는 첫 번째 비트를 부호 표현을 위해 따로 배정한다.

이를 부호 비트(signed bit)라 부르며 부호 비트가 0이면 양수, 1이면 음수를 나타내게 된다.

 

논리 회로가 음수를 표현하는 방법은 대표적으로 3가지가 있다.

 

 1. 부호 절대값 방법.

  부호 비트를 제외한 수를 양수 값으로 읽고, 마이너스를 붙이는 방법.

  +3 = 00000011₂

  -3 = 10000011₂

  사람이 사용하기에는 편하지만, 이진수 계산이 안되기 때문에 컴퓨터에선 사용할 수 없다.

 

 2. 1의 보수 방법.

  양수 값의 비트를 반전시켜 음수를 표현하는 방법.

  +3 = 00000011₂

  -3 = 11111100₂

  값이 0인 경우에는 00000000₂ 과 11111111₂ 두 값이 모두 0을 나타낼 수 있기 때문에 컴퓨터에선 사용하지 않는다.

 

 3. 2의 보수 방법.

  1의 보수 방법에서 1을 더하는 방법.

  +3 = 00000011₂

  -3 = 11111101₂

  1의 보수 방법과 다르게 11111111₂이 -1 값을 의미하므로 0과 구분된다.

 

위와 같은 이유로 컴퓨터는 2의 보수 방법으로 음수를 표현한다.

'Programming > Knowledge' 카테고리의 다른 글

DLL (Dynamic Link Library) 1  (0) 2017.05.26

+ Recent posts