[기본원리] 메모리 절약 프로그래밍
- 프로그래밍 정보
- 2010. 7. 25.
반응형
윈도우는 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' 을 함수 앞에 두면 스택을 청소가 가능하게 됩니다.
스택의 클린업을 함수마다 해야하는 것을 통합하여 하나로 한다고 생각하면 될듯 하네요,
그래서 결국 프로그램의 크기가 줄어들고 메모리를 절약하고, 파일을 보존하는 디스크도 절약되는 효과가 잇겠습니다.
반응형