[기본원리] 메모리 절약 프로그래밍

반응형



윈도우는 GUI 기반의 거대한 OS 입니다.
또 윈도우는 멀티태스킹 기능 덕분에 여러개의 프로그램을 동시에 실행할 수가 있어서, 언제나 메모리 부족에 시달리는 OS 라고도 할 수 있죠.

읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥



그래서 가상 메모리 기법을 사용하여 어느정도의 메모리 부족을 해결할 수는 있었습니다.
2010/07/25 - [Programing/기본원리] - 디스크가 메모리처럼! 가상메모리

하지만 가상 메모리는 속도가 느린 디스크에 페이지인-페이지아웃 작업을 하게되기 때문에 디스크가 작동하는 동안에는 프로그램이 정지되어 버리게 되요.
 가끔 하드 디스크의 LED에 불이 들어 올때 [ 이때 페이지인-아웃이 실행] 잠시동안 PC가 먹통이 되어 버리는 신기한 경험을 할때가 있지요

즉, 가상 메모리는 메모리 부족의 보완책일뿐, 궁극적인 해결책은 될 수 없습니다.
따라서 메모리 부족을 해결하려면 실제 메모리의 용량을 늘리거나 프로그램의 크기를 줄여야 하겠는데, 실제 메모리는 개인 지갑을 열어야 되기 때문에 선택의 몫이겠죠.

그렇다면 프로그램의 용량을 줄이는 ( 개발자 입장에서 ) 방식을 두가지 적어볼까 합니다.

DDL 파일로 함수 공유

DDL ( Dynamic Link Library ) 파일이란 프로그램이 실행될 때 라이브러리(함수, 데이터 등) 가 동적으로 연결되는 것을 말하는데요, 또한 복수의 프로그램이 DDL 파일을 공유할 수 있기 때문에 메모리를 절약할 수가 있게 됩니다.

예를들어, getIns() 라는 함수(메소드)를 작성했다고 하죠.
이것을 어플리케이션 A, B 모두에서 사용하려 한다면 각 어플리케이션의 실행 파일에 getIns() 를 포함시키게 되고 [ 이것을 정적 링크 라고 부릅니다 ] , 두개의 A, B 어플리케이션을 동시에 실행하게 되면 메모리 내부에는 getIns() 라는 소스코드가 중복되어 존재하게 됩니다.





이번에는 어플리케이션의 getIns() 를 실행파일이 아닌 별도의 DLL 파일에 내장했다고 가정해 보겠습니다. 여러개의 어플리케이션이 실행될 때 같은 DLL 파일의 내용이 공유되기 때문에 메모리 안에 있는 getIns() 의 소스 코드는 단 하나만 있으면 됩니다.



이처럼 DLL 을 이용하면, 메모리의 이용 효율이 향상되며 메모리를 절약할 수 있게 됩니다.

OS인 윈도우도 그 자체가 수많은 DLL 파일을 모아서 작성된 것인데요, 어플리케이션은 이 DLL 파일들의 기능을 이용하여 작동하게 되죠.
이처럼 어플리케이션에서 이용되는 기능이 DLL로 만들어져 있는 이유는 메모리를 절약할 수 있기 때문입니다.

또한,
DLL 의 내용이 변경되어도 그것을 참조하고 있는 어플리케이션을 다시 컴파일 하지 않아도 된다는 장점이 있습니다.



_stdcall 호출을 통하는 방법

_stdcall 를 사용하는 기법은 C언어로 프로그래밍 할때만 해당됩니다.
현재 자바를 기준으로 글을 포스팅 하고 있기 때문에 꼭 언급할 필요는 없겠지만 비슷하게 응용될 수도 있기 때문에 간단하게 적어볼까 하는데요,

C언어에서는 함수 호출 뒤 스택을 청소( Clean - Up ) 하는 명령을 실행해야 되는데 이것은 메모리의 스택에서 더이상 필요치 않는 데이터를 삭제하는 기능입니다.
이것은 프로그램이 컴파일 될때에 컴파일러가 자동으로 함수를 호출하는 쪽에 추가해 줍니다.

2010/07/15 - [Programing/기본원리] - 프로그래머가 본 메모리의 내부.
2010/07/18 - [Programing/기본원리] - 메모리의 스택과 큐의 이용.

스택은 프로그램이 이용하는 메모리의 영역이며, 함수 사용이 끝나면 원래 상태로 되돌리는 처리가 필요한데 이것이 바로 스택의 청소가 되겠습니다. 즉, 이런 역할을 하는 ' _stdcall' 을 함수 앞에 두면 스택을 청소가 가능하게 됩니다.

스택의 클린업을 함수마다 해야하는 것을 통합하여 하나로 한다고 생각하면 될듯 하네요,
그래서 결국 프로그램의 크기가 줄어들고 메모리를 절약하고, 파일을 보존하는 디스크도 절약되는 효과가 잇겠습니다.




반응형

댓글(2)

  • 2010.07.25 23:51 신고

    글 잘 읽었습니다.
    그런데 마지막에 함수 호출 형식을 stdcall로 하면 메모리상으로 절약은 되는데.. 궁금한 점이 있습니다.
    VS컴파일러를 보면 디폴트로 개발자가 만든 함수는 cdecl방식으로 호출이 됩니다.
    그런데 OS도 stdcall형식으로 작동하는데 아직도 C에서 cdecl을 쓰는 이유는 가변인자를 사용하기 위해 씁니다.
    그러면 개발자가 함수를 만들 때 가변인자를 쓰지 않는다면 stdcall을 쓰는게 무조건적으로 좋은건가요??

    • 2010.07.26 09:24 신고

      안녕하세요 ^^ 반갑습니다~
      제가 C 계열은 자세히 몰라서, 정확한 답변은 어렵겠지만 우선 아는 한도내에서만 말씀드리겠습니다.

      우선, cdecl 방식은 기억이 가물가물하긴 한데,
      호출되는 함수를 부를때마다 스택을 정리하는 방식으로 알고 있습니다. stdcall 은 함수가 직접 스택을 정리하는것이지요. 따라서 stdcall 은 이런 이유때문에 가변인수를 지원하지 않는것인데,

      여기에서 가변인자를 사용하지 않는 함수는 단연 stdcall 을 하셔야 될것 같습니다.
      왜냐하면 cdecl 은 호출원이 직접 스택을 정리하기 때문에 미묘한 차이지만 프로그램의 크기가 조금 커지겠지요, 즉, 호출할때마다 정리 코드가 중복되어 있다는 점 때문입니다 ^^

      이상이 제가 아는 한도내의 답변이었는데...
      도움 되실런지 모르겠네요;;;

Designed by JB FACTORY