d라이브러리









흔히 PC의 메모리 관리는 초보자와 중급자를 구분하는 기준점이 비유된다. 자신의 PC를 최상의 상태로 활용하기 위해서는 그만큼 메모리 관리가 필수적이란 말이다. 즉시 활용할 수 있는 메모리 관리법에 대해 알아보자.

며칠 전 친구에게서 전화가 왔다. 중고 컴퓨터를 한대 마련했는데 '한글' 2.5를사용하다보니 수시로 에러가 나면서 도스로 빠져나온다는 것이었다. 어떤 메시지가 뜨느냐고 했더니 메모한 것을 난수표 읽듯 더듬거리며 불러주었다.

Abnormal program termination:memory protection fault
cs:eip=0000ch:0002f191h
도대체 이 난해한 문장을 어떻게 해독해낼 것인가?

왜 640kB의 한계가 생겼는가?

사람의 두뇌는 판단 중추와 기억 중추가 하나로 통합되어 있지만 컴퓨터에서는 CPU와 메모리가 서로 다른 부품으로 떨어져 있다. 따라서 CPU가 메모리에 기억돼 있는 것을 토대로 연산하기 위해서는 CPU와 메모리 사이에 선(line)이 연결되어 있지 않으면 안된다. 이 선은 크게 데이터선과 주소선(address line)으로 나뉘어진다.

데이터선은 실제로 메모리에 기억된 데이터가 CPU와 메모리 사이에서 왔다 갔다 하는 선이라고 생각하면 된다. 이 선이 많으면 많을수록 컴퓨터는 속도가 향상될 것이다.

메모리는 일정한 용량을 가지고 있다. 그런데 메모리에 데이터들이 쌓여있을때 지금 필요한 데이터가 메모리의 어디쯤에 있는지를 알 수 없다면 CPU는 메모리의 특정 번지에 있는 데이터를 불러들일 수 없다. 그래서 CPU와 메모리 사이에는 주소선이라는 것이 있는 것이다. 예를 들어 CPU는 메모리 '100번지'에 있는 데이터가 필요할때 메모리와 연결된 주소선을 통해 '100번지'를 전송해 주어야만 하는 것이다.

한개의 주소선마다 0 아니면 1이 갈 수 있다고 했을 때 주소선이 20개이면 몇개의 번지를 표현할 수 있을까? 그것은 2의 20승에 해당하는 1백4만8천5백76가지의 주소를 관리할 수 있다는 뜻이 된다. 컴퓨터에서 이 수치는 1MB(1천2kB)를 의미한다. 그래서 주소선이 20개인 8086(XT컴퓨터)이나 80286은 1MB까지의 메모리만을 관리할 수 있다는 결론에 이르게 되는 것이다. 즉 286컴퓨터에 메모리가 4MB라고 할지라도 CPU는 1MB 이상의 메모리를 직접적으로 관리할 수 없는 것이다(물론 남는 3MB의 메모리는 연장메모리 관리자나 확장메모리 관리자를 이용하면 다른 용도로 써먹을 수는 있지만 여기서는 논외로 한다).

그런데 1MB면 1MB지 왜 1MB의 절반이 약간 넘는 6백40kB밖에 관리하지 못한다는 말인가? CPU는 메모리뿐만 아니라 본체 내에 장착된 비디오 카드나 각종 롬(ROM) 등도 관리해야 한다. 우리가 사용하는 IBM PC는 비디오카드나 롬 등에 6백40-1천24kB사이의 번지수를 고정적으로 대응시켜 놓았다. 그래서 CPU가 관리할 수 있는 번지수 1MB 중에서 이 영역(상위메모리라고 한다)을 빼고 나면 6백40kB까지의 영역만 남게 되고, 이는 사용자가 쓸 수 있는 메모리 영역이 된다. 이를 '기본메모리'라고 한다.

그러나 이 6백40kB의 용량 조차도 컴퓨터가 부팅되면서 도스 파일들이 자리를 잡고, HWP 등의 응용프로그램을 실행시키면 다시 이들 프로그램들이 자리잡게 되므로 실제로 사용자에게 남는 메모리는 6백kB 전후가 된다. 한글 등을 사용하다가 데이터가 커지면 어떻게 될까? 데이터들도 메모리를 차지하게 될 것이고 이것이 만일 6백kB를 넘게 되면 컴퓨터는 다운되게 된다.
 

도스의 6백40kB장벽은 상위 메모리영역을 사용하기 위한 여러가지 방법들을 고안하게 했지만, 여전히 문제점을 안고 있다. 설계 당시부터 계속되고 있는 이 장벽이 지금까지 없어지지 않은 것은 다른 버전의 도스와 호환성을 유지하기 위함이다.


상위 메모리를 최대한 이용하자

도스가 관리할 수 있는 1MB의 메모리 번지에는 상위메모리(6백40-1천24kB)가 있다. 이미 언급했듯이 이 영역은 비디오 카드나 롬 바이오스 등에 할당돼 있는 번지다. 그러나 3백84kB 용량의 메모리에는 다른 장치에 의해 쓰이지 않는 빈 영역들이 숨어 있다. 우리는 이 낭비되고 있는 메모리 영역을 찾아내 기본메모리로 적재되는 도스 파일 등을 이곳으로 적재함으로써 기본메모리의 크기를 늘릴 수 있다.

상위메모리의 비어있는 영역을 사용하기 위해서는 config.sys 파일 안에 다음과 같은 행이 추가되어야 한다.
device=c:\dos\himem.sys
device=c:\dos\emm386.exe highscan ram

이렇게 한 후 dos=high, umb 행을 넣으면 도스 파일이 상위메모리에 위치하게 된다. 또 이같이 상위메모리를 쓸 수 있게 해 두었으면 config.sys 파일의 나머지 행들 앞에 있는 device를 devicehigh로 바꾸어준다. 그러면 부팅시 원래 기본메모리로 올라가던 파일들이 상위메모리의 비어있는 영역으로 올라가게 되는 것이다.

autoexec.bat 파일에서도 각종 실행 명령들 앞에 lh(Loadhigh)를 넣어 메모리 상주 프로그램들이 기본메모리 대신 상위메모리로 적재되도록 한다. 예를 들어 마우스 드라이브를 상위메모리로 올리려면 다음과 같이한다.
lh c:\windows\mouse.com

원래 emm386이라는 프로그램은 1MB이상의 메모리를 확장메모리로 쓸 수 있게 관리해 주는 프로그램이다. 옵션으로 붙은 highscan은 상위메모리에 여분의 메모리 영역이 있는지를 스스로 검사하여 이를 사용할 수 있게 하는 기능을 하며 ram은 상위메모리의 빈 영역을 사용할 수 있게 만들면서 동시에 1MB이상의 확장메모리로 사용할 수 있게 한다. 이 위치에 ram 대신 noems를 넣으면 상위메모리만 사용할 수 있게 하고 확장메모리 에뮬레이션은 하지 않도록 한다. 1MB 이상의 메모리를 연장 메모리로만 사용하고 확장메모리로 사용할 필요가 없는 사람은 이 위치에 noems를 넣는 것이 유리하다. 확장메모리를 사용하면 이를 구동하기 위해 상위메모리 영역중 64kB가 따로 할당되어야 하기 때문에 그만큼 상위메모리를 빼앗기기 때문이다.
 

메모리를 구입해 빈 뱅크에 꼽는다고 성능이 좋아지는 것은 아니다. 이 반도체가 제 구실을 하기 위해서는 autoexec.bat와 config.sys파일을 적정하게 설정하는 과정이 필요하다.


에러 메시지와 그 해결책

이제 도스 환경에서 자주 나타나는 메모리 관련 에러 메시지들을 살펴보자.

▶ Abnormal program termination
서두에서 나왔던 난수표같은 이 무뚝뚝한 에러는 한글을 구동하는 프로그램이 상위메모리 중 비디오카드가 사용하는 번지를 침범하기 때문에 주로 생기는 현상이다. 가장 손쉽게 해볼 수 있는 조치는 config.sys파일에 다음 행을 추가해 보는 것이다.
device=c:\dos\emm386.exe noems x=c000-cOff 또는 x=c000-c7ff

▶ Memory Allocation Error
버그가 있는 프로그램을 구동시킬 때 자주 나타나는 메시지이다. '메모리 할당이 잘못되었다'는 것인데, 프로그램의 구동파일이 다른 메모리 상주 프로그램과 충돌하는 경우에 생긴다. 이런 에러가 자주 일어난다면 config.sys나 autoexec.bat 등에서 메모리에 상주하는 프로그램들을 하나씩 교대로 지운 다음 계속 실행하는 방식으로 어떤 프로그램과 충돌하는지를 알아낼 수 있을 것이다. 예를 들어 마우스 드라이브와 충돌한다면 마우스 드라이브를 다른 것으로 교체해볼 수 있을 것이다. 그러나 교체해도 같은 문제가 발생한다면 그 프로그램은 과감히 폐기처분하는 것이 낫다.

▶ Not enough memory
기본메모리가 부족하다는 메시지이다. 간혹 한글 등의 프로그램을 사용하다가 도스나들이로 도스로 빠져나온 다음 다시 한글을 실행하는 경우가 있는데, 이런 경우에는 반드시 이 메시지를 만날 것이다. 물론 이런 경우에는 exit 명령으로 한글로 돌아가면 그뿐이다. 그러나 실제로 어떤 프로그램을 실행하는데 메모리가 부족하다면 다음과 같이 해보라.

부팅시 메모리에 적재되는 메모리 상주프로그램들을 최대한 상위메모리로 적재한다. mem/c 명령을 내리면 어떤 프로그램이 어디에 적재되었는지를 화면상에서 확인할 수 있다. 만일 상위메모리에 아직도 남아있는 영역이 있다면 메모리의 최적화를 위해 도스에 있는 memmaker 명령을 써서 기본메모리를 최대한 확보한다. 그래도 해결되지 않는다면 다소 불편하지만 config.sys 파일 등에서 꼭 필요하지 않은 프로그램이 등록된 행 앞에 rem을 써서 그 기능만 잠시 중지시키는 방법도 있다. 이런 일이 자주 반복되어야 한다면 도스 6.0 이후부터 제공하는 멀티부팅 기능을 이용하는 것이 좋을 것이다.

▶Out of environment space
config.sys에 설정된 값이 너무 많아 저장할 수 없다는 메시지다. 부득이 config.sys에 많은 내용이 들어가야 한다면 다음과 같이 공간을 확보해 주면 된다.
shell=c:\dos\command.com c:\dos/p/e:1024

▶ Program too big to fit in memory
어떤 응용프로그램을 실행시키기에 현재 남아있는 메모리가 부족하다는 메시지다. 현재 실행중인 프로그램중 사용되고 있지 않은 것을 종료시킨 후 다시 실행하면 되는 경우가 많다. 자주 쓰지 않는 메모리 상주 프로그램은 없애는 것이 좋을 것이다. 예를 들어 v3res같은 메모리 상주 바이러스 체크프로그램은 반드시 메모리에 상주시킬 필요는 없다. v3.com 등으로 자주 체크하는 습관을 들이면 되기 때문이다.

▶ A bad UMB number has been specified
상위메모리에 남아있는 영역이 없는데 lh(Loadhigh) 명령을 내렸을 때 나타나는 메시지다. autoexec.bat파일에서 lh를 지우면 된다.

▶ Bad or Missing command interpreter
도스가 명령어 처리기인 command.com을 찾지 못하였을 때 발생하는 메시지로 config.sys안에 shell 명령을 이용하여 command.com의 위치를 넣으면 된다.

▶ Cannot load command, System halted
도스가 command.com을 읽으려고 하나 command.com이 적재되어 있는 메모리 영역이 파괴되었거나 또는 shell 명령으로 지정된 경로에서 command.com을 찾을 수 없을 때 발생하는 메시지다. 부팅 디스켓으로 부팅한 후 sys명령으로 하드디스크를 부팅 가능하게 한 후 재부팅한다.

▶ Internal stack overflow, system halted
컴퓨터는 부팅될 때 메모리의 일정 영역에 CPU의 일처리를 보조하는 스택을 만든다. 이 영역은 CPU가 어떤 일을 처리하던 도중 더 급한 다른 일을 처리하게 될 때 먼저 하던 일을 저장해 두기 위한 영역이다. 물론 급한 일을 처리하고 나면 CPU는 스택에 들어있는 일을 꺼내 계속 처리하게 된다. 스택 오버플로우란 인터럽트가 많이 걸려 처리하던 일들이 과도하게 스택에 쌓여 넘친다는 뜻이다. 이런 일이 자주 발생한다면 config.sys파일의 stacks=9,256을 늘려본다(9는 스택의 개수이고 256은 스택 하나의 크기이다). 스택의 개수는 0에서 64까지 정할 수 있고 크기는 0에서 5백12바이트까지다.

▶ Too many files open
데이터베이스 같은 응용프로그램들은 동시에 여러 개의 파일을 열어놓고 작업을 하는 경우가 많다. 사용자는 자신의 컴퓨터가 동시에 열어놓고 처리할 수 있는 파일의 개수를 정의해 둘 수 있는데 config.sys파일에 있는 'files=숫자'행의 숫자를 늘리면 된다. 물론 이 숫자를 늘리면 늘릴수록 사용자가 쓸 수 있는 기본메모리의 용량이 줄어들기 때문에 자신의 업무를 잘 파악하여 선택해야 한다.

▶ 윈도우에서 'system resource'가 부족하다는 메시지가 자주 등장한다
버그가 있는 일부 응용프로그램들은 프로그램을 종료해도 자신이 사용하던 시스템 자원을 비워주지 않는다. 이런 경우에는 시스템 자원을 강제로 비워주는 유틸리티를 구해 윈도우에 설치하는 수밖에 없다. 대표적인 유틸리티로는 '태스크 킬러'(Task Killer)가 있는데 PC 통신망에서 쉽게 구할 수 있다.

▶ 윈도우에서 'General Protection Fault' 또는 '메모리 부족' 메시지가 자주 나온다
브레이크 포인터의 숫자를 늘린다. 윈도우 디렉토리에 있는 system.ini 파일을 열어 [386Enh] 섹션에 다음 행을 추가한다.
MaxBPs=716
 

메모리 상태를 알아볼 수 있는 프로그램으로는 도스의 mem.exe외에도 pctools의 si.exe나 노턴유틸리티의 sysinfo.exe등이 있다.


텍스트 파일 편집하기

컴퓨터의 환경을 설정하는 config.sys와 autoexec.bat, 윈도우의 환경을 설정해 놓는 win.ini system.ini 파일 등을 자신의 구미에 맞게 편집하려면 도스의 edit.com 명령을 이용한다.
c:\,edit config.sys
이같이 명령을 내리면 config.sys파일이 화면 가득 불러들여지고 커서를 움직여 원하는 행을 삽입하거나 필요없는 행을 지울 수 있다. 이 편집기를 이용하여 텍스트 파일을 편집했으면〈Alt+F〉 글쇠를 눌러〈Save〉를 한 다음, 다시 〈Alt+F〉글쇠를 눌러〈Exit〉로 빠져나가면 된다.

share 대신에 vshare.386을

윈도우3.1을 하드디스크에 설치하면 autoexec.bat에 share.exe가 추가된다. 이 파일은 도스에서는 거의 사용되지 않고 윈도우에서 OLE(객체의 연결 및 포함) 기능을 쓸 때만 이용되는 파일이다. share.exe는 네트워크 환경이나 윈도우처럼 두개의 프로그램이 동시에 하나의 파일에 접근할 가능성이 있는 환경에서 파일참조를 중재하는 역할을 한다.

따라서 share.exe는 도스 환경에서는 불필요하게 메모리를 차지하고 있는 셈이고 최대한의 기본메모리를 확보해야 하는 우리에게는 곤혹스런 존재다. 이 문제를 해결하는 방법이 하나 있다. 즉 이 기능을 아예 윈도우에 내장시키는 것인데 PC통신 등을 통해서 vshare.386 이라는 파일을 받아 윈도우의 system 디렉토리에 복사해 넣는 것이다.

vshare.386은 32비트 드라이브로 더욱 빠른 성능을 가지고 있으며 share.exe보다 기본메모리를 많이 절약할 수 있다. 뿐만 아니라 윈도우가 실행중일 때에만 작동하기 때문에 도스 환경에서는 확실하게 사용자 메모리를 늘릴 수 있게 되는 것이다. 그러므로 이제 autoexec.bat파일에서 share.exe를 지워버리고 윈도우 디렉토리의 system.ini파일에 있는 [386Enh]섹션에 다음 행을 추가한다.

device=vshare.386

1995년 09월 과학동아 정보

  • 유해룡 컴퓨터 칼럼니스트

🎓️ 진로 추천

  • 컴퓨터공학
  • 정보·통신공학
  • 소프트웨어공학
이 기사를 읽은 분이 본
다른 인기기사는?