d라이브러리









메모리, 효과적으로 사용하려면

386을 386답게, 486을 486답게 쓰는 방법은 무엇인가. 많은 메모리가 달린 PC를 샀다해도 그 관리법을 모르면 XT에 불과하다. 도스 매뉴얼에서도 가르쳐주지 않는 메모리 활용법을 알아본다.

컴퓨터가 많은 사람들의 사랑을 받는 가장 큰 이유는 컴퓨터의 유연성과 사용의 용이성 때문일 것이다. 컴퓨터는 다양한 목적으로 사용이 가능하면서도 다루기 쉽다. 업무에 없어서 안될 중요한 사무기기인 동시에 통신을 위한 장비이기도 하고, 온 가족이 즐길 수 있는 오락기이기도 한 컴퓨터는 말 그대로 '만능'이다.

이렇듯 컴퓨터가 수많은 역할을 하면서도 사용이 편리하게 된 데는 '프로그램 내장방식'을 창안한 폰 노이만 박사의 공이 크다. 그래서 오늘날의 컴퓨터를 때로는 '폰 노이만 방식 컴퓨터'라 부르기도 한다. 폰노이만 방식의 컴퓨터 이전에는 컴퓨터가 해야 할 일을 사람이 일일이 배선(配線)해주거나, 역회전이 불가능한 종이 테이프나 천공카드에 계산 순서를 천공해 컴퓨터에 물려주는 방식을 사용했다. 이런 방식은 특수한 능력을 가진 프로그래머들과 이를 컴퓨터에 입력시켜 줄 오퍼레이터만 접근하는 한계를 가지고 있었다.

이에 비해 요즈음의 컴퓨터는 해야 할 모든 일을 프로그램 형태로 기억장치에 넣어 놓고 그것을 하나씩 꺼내어 실행하는 방식으로 운용된다. 따라서 사용자는 프로그램을 짤 필요도, 이를 일일이 컴퓨터에 입력시키지 않아도 된다. 또한 자신이 하고자 하는 일에 따라 그에 해당하는 프로그램을 구해 이를 실행시키면 된다.

컴퓨터의 중앙처리장치는 그 이름에서도 알 수 있듯이 속도나 성능이 고정돼 있다. 예컨대 인텔사에서 개발한 386-DX-33이라는 중앙처리장치는 32비트급 중앙처리장치로서 그 속도가 33Mhz다. 따라서 일단 컴퓨터를 구입하면 사용자가 어떻게 해볼 방도가 없다.

그러나 흔히 '메모리'라 불리는 주기억장치는 성능이나 속도 차원이 아닌, 크기가 문제다. 왜냐 하면 메모리는 중앙처리장치가 주기억장치의 외부(보조 기억장치인 플로피디스크나 하드 디스크)에 있는 프로그램이나 데이터를 불러다 쓰는 작업공간의 역할을 하기 때문이다. 따라서 메모리를 효율적으로 사용한다는 것은 그만큼 컴퓨터를 효율적으로 사용한다는 것과 통한다는 이야기다.

램 디스크로 286도 386 속도 가능

메모리는 어떤 정보를 기억할 수 있는 소자로 구성되는데, 기술의 발전에 따라 다양한 소재가 이용되었다. 컴퓨터 산업 초창기인 1940년대에는 진공관을 기억장치로 사용하였는데 진공관 하나가 겨우 하나의 비트(bit)를 기억할 수 있었으니 이 시절의 컴퓨터가 집채만큼 커질 수밖에 없었다.

한때 자기드럼이 진공관의 자리를 밀어내고 기억장치로 부상했으나 이 역시 사람들을 만족시킬 만큼은 못되었던 모양이다. 1950년대 중반 IBM 650 기종에 채택됐던 이 장치는 1960년대와 70년대를 풍미했던 자기코어 기억장치에 의해 쉽게 무대 뒤로 밀려났다.

그러나 실리콘이라는 반도체는 자기코어를 구식으로 만들고 기억장치의 왕좌를 차지했다. 오늘날까지 널리 쓰이는 이 반도체 기억장치는 집적도가 높고 크기가 매우 작으며 고속인데다 값도 싸서 오늘날의 퍼스널 컴퓨터를 가능하게 한 주역이기도 하다.

반도체 기억장치를 램(RAM, RANDOM ACCESS MEMORY)이라고 부르기도 하는데, 그 이유는 반도체칩의 어느 부분이든 임의로 명령이나 데이터를 써 넣을 수 있고 이를 읽어낼 수 있기 때문이다. 이와 같은 램은 속도는 다소 느리지만 덩치가 작고 값이 싼 다이내믹램, 즉 D-Ram과 그 반대인 스태틱 램, 즉 S-Ram으로 나뉜다. 보통 컴퓨터의 메모리와 함은 D-Ram을 말한다.

메모리가 주기억장치로 사용된다는 것은 잘 알고 있으면서도 컴퓨터 대부분의 주변장치나 심지어 중앙처리장치 내에도 메모리가 사용된다는 사실에 대해서는 모르는 수가 많다. 즉 메모리는 키보드에도 있고 프린터에도 있으며 모뎀에도 있다. 중앙처리장치 내의 메모리를 레지스터(register)라 하고 대부분의 주변장치에서 사용되는 메모리를 버퍼(buffer)라 부른다. 레지스터는 중앙처리장치가 연산을 하는 동안 임시로 사용하는 작은 칠판과 같은 역할을 한다. 주변장치의 메모리인 버퍼는 단어의 뜻 그대로 각 장치간의 데이터 전송과 처리에서 발생하는 속도차이를 극복하기 위해서 사용되는, 일종의 완충장치다.

프린터 내부에 있는 버퍼의 예를 들어 생각해보자. 컴퓨터의 중앙처리장치가 인쇄할 내용을 프린터에 보내면 프린터에는 매우 난감한 일이 벌어진다. 대부분의 프린터 인쇄속도는 중앙처리장치에 비해 굼벵이나 마찬가지인데 중앙처리장치는 이런 사정을 봐주지 않고 자신의 속도에 맞춰 데이터를 마구 보내기 때문이다. 마치 국민학교 1학년생이 아나운서의 뉴스내용을 받아쓰기하는 꼴이다.

이런 문제점을 극복하기 위해 프린터에 설치된 버퍼는 중앙처리장치가 보내온 내용을 빠른 속도로 받아들인다. 그리고 버퍼가 꽉 차면 중앙처리장치에게 '잠시 대기' 신호를 보낸다. 그러면 중앙처리 장치는 '전송재개' 신호를 받고 다시 일을 시작한다. 기계간 속도차를 해결하는 완충장치로서의 버퍼는 주변기기가 설계될 때 아예 그 기계에 붙박이로 설치돼 나오는데, 이 버퍼의 양이 얼마나 많은가에 따라 가격이 달라지기도 한다.

이외에도 특정한 프로그램을 이용해 주기억장치의 일부를 버퍼로 할당할 수도 있다. 가장 일반적인 경우가 바로 캐시(cache)라 불리는 또 다른 이름의 버퍼다. 캐시는 중앙처리장치가 플로피디스크나 하드디스크 등의 보조기억장치(사실 저장장치라고 해야 정확한 표현이다)에 있는 내용을 주기억장치로 읽어들일 때 사용된다.

디스크를 이용한 저장장치는 그 속도가 메모리에 비해 매우 느리므로 디스크에 저장된 내용을 빈번히 호출하는 프로그램을 사용할 경우 컴퓨터의 속도는 중앙처리장치의 처리속도가 아닌 디스크의 속도에 규정된다. 그래서 디스크상의 프로그램이나 데이터를 상대적으로 빠른 메모리의 영역중 일부를 할당해 기억시켜놓고 중앙처리장치가 디스크에 있는 내용을 참조해야 할 때 이곳을 참조하게 만드는 것이다. 이때 메모리는 주기억장치가 아닌 보조기억장치의 역할을 하게 된다. PC에서 이러한 일을 가능하게 하는 프로그램을 캐시 프로그램이라고 하는데, 도스나 윈도에서 제공하는 smartdrv.sys나 smartdrv.exe가 보편적으로 널리 쓰이며 피시툴즈에서 제공하는 피시캐시나 노턴유틸리티가 제공하는 노턴 캐시, DR-DOS가 제공하는 피시퀵 등이 있다.

플로피 디스크나 하드디스크가 너무 느려 답답하다고 생각하는 사용자는 캐시 프로그램을 사용하기 보다는 아예 메모리를 디스크인 것처럼 만들어주는 램드라이브 프로그램을 사용할 수도 있다. 메모리만 넉넉하다면 1~2메가바이트 정도를 디스크처럼 만들어 사용해보길 권한다. 하드디스크보다 최소 5배정도 빠른 램디스크를 이용하면 제 아무리 느린 프로그램이라 하더라도 휙휙 날아갈 정도로 빠를 것이다. 286기종의 컴퓨터에서 램디스크를 설정해서 느리기로 유명한 그래픽 프로그램을 486의 속도로 사용하는 경우도 있다. 도스에서 제공하는 ramdrive.sys나 vdisk.sys 등이 바로 이런 데 쓰는 프로그램이다.

램드라이브를 사용할 때는 컴퓨터 사용을 끝내고 반드시 원래의 디스크, 즉 플로피 디스크나 하드디스크에 작업 내용을 저장해 두어야 한다. 메모리를 이용해 디스크로 사용한다 해도 메모리의 휘발성, 즉 컴퓨터를 끄면 메모리의 내용이 지워진다는 사실은 어쩔수 없기 때문이다.


메모리는 본체뿐 아니라 프린터나 키보드에도 있다.


XT의 망령이 지배하는 도스와 메모리

많은 사람들은 컴퓨터의 하드웨어와 소프트웨어의 발전속도는 빠른 것이 좋다고 생각한다. 그러나 지나치게 빨라도 문제는 있다. 예를 들어 IBM 호환기종의 컴퓨터에는 XT부터 286, 386, 486까지 다양한 스펙트럼이 있다. 그런데 이 모두를 만족시켜주는 소프트웨어를 만들어야 각 컴퓨터간에 호환성이 생기는 것이다.

특히 컴퓨터 운영체제로서의 도스는 각 하드웨어의 성능과 관계없이 호환성을 가져야 한다. 그래야 XT로 작성한 문서를 486컴퓨터에서도 읽어들일 게 아닌가. 하지만 이것은 마치 국민학생과 대학생을 같은 교실에 몰아넣고 한 선생님이 강의하는 것과 마찬가지다.

컴퓨터의 호환성은 특히 메모리 사용과 관련해 심각한 양상을 띈다. 컴퓨터의 메모리를 가지고 어떤 작업을 하려면 각 메모리의 바이트들을 서로 구별하기 위해서 번호를 붙여 관리한다. 이 번호를 메모리 번지(memory address)라고 하며 메모리 번지를 지정하는 작업을 메모리 어드레싱이라고 한다. 컴퓨터에서 메모리에 번지를 지정하는 일은 중앙처리장치에 부착된 어드레스 라인(address line)이 담당한다. 이 어드레스 라인의 갯수는 CPU에 따라 각기 달라, 8비트 컴퓨터의 경우는 어드레스 라인이 16개, XT는 20개, AT와 386SX는 24개, 386DX와 486은 32개다. 어드레스 라인의 개수에 따라서 CPU는 각각 64kb, 1Mb, 16Mb, 4Gb의 메모리를 관리할 수 있다.

도스라는 운영체제는 XT는 물론 486컴퓨터에서도 사용된다. 즉 서로 호환성이 있다는 말이다. 그런데 이러한 호환성은 XT를 제외한 모든 상위기종의 메모리 관리 방식을 XT수준에 국한시켜야 한다는 것을 의미한다(XT와 호환가능한 이런 상태를 리얼모드라고 한다). 이때 XT가 최대로 접근할 수 있는 메모리의 번지가 1메가바이트이기 때문에 이 이상의 메모리는 있으나마나한 것이 되고 만다. 더구나 1메가바이트(정확히 말하면 1024kb)중 640kb를 제외한 나머지, 즉 384kb는 위에서 말한 컴퓨터 각 구성부품이 가지고 있는 메모리의 번지를 할당하기 위해 사용자에게 사용이 허락되지 않은 영역이다.

이러다 보니 도스와 도스를 운영체제로 하는 대부분의 프로그램은 기본 메모리인 640kb밖에는 사용할 수 없다. <;한글>; 1.52판까지만 해도 이러한 제약에서 벗어나질 못했다. 그 결과 사용자들은 걸핏하면 "메모리가 부족합니다"라는 지긋지긋한 메시지에 시달리지 않을 수 없었던 것이다. 제 아무리 난다 긴다하는 486컴퓨터라 해도, 아무리 메모리를 16메가바이트나 장착했다 해도 도스를 운영체제로 채택하고 리얼모드에서 운용되는 소프트웨어를 사용하는 한, 640kb이상의 메모리는 그림의 떡일 뿐인 것이다.

물론 위에서 말한 램드라이브나, 캐시 등의 용도로 기본메모리 위의 영역을 사용할 수 있는 방법은 일찍부터 개발됐지만 메모리의 주된 용도는 워드프로세서니 데이터베이스니 하는 응용 프로그램의 사용에 있는 것이지 몇몇 유틸리티를 사용하는 것이 주목적이 될 수는 없는 것이다.

컴퓨터를 업무에 사용하다보면 아무래도 데이터의 크기가 갈수록 늘어날 수밖에 없다. 이때 1메가바이트의 메모리, 그중에서도 실제 사용자에게 배당된 640kb는 협소하기만 하다. 그래서 XT 시절부터 1메가바이트가 넘는 더 큰 메모리에 접근할 수 있는 방법을 모색한 결과 이를 위한 첫번째 방법으로 확장메모리(expanded memory)가 고안됐다. 이 방법은 컴퓨터의 최초 1메가바이트 가운데 기본메모리 640kb를 제외한 상위메모리 영역(Upper Memory Area)에서 비디오 롬 등 시스템에서 사용하는 부분을 제외한 예비영역(UMB, upper memory block)이 사용되진 않고 있다는 점에 착안한 것이다. 이 방법은 우선 추가의 메모리를 확장 슬롯에 카드형식으로 뽑고 UMB중 한 부분을 더 큰 메모리, 즉 1메가바이트가 넘는 메모리를 관리하기 위한 관문(이 부분, 즉 16kb의 4개 조각 64kb를 Page Frame이라고 한다)으로 삼아 메모리를 관리한다. 그러나 추가의 메모리 보드를 확장하는 방식은 돈도 많이 들 뿐더러 1메가바이트 이상의 영역을 접근할 때 항상 이 페이지프레임을 거쳐야 하며 속도도 느려 이에 대한 개선책을 찾아야 했다.

시간이 갈수록 반도체의 가격은 떨어졌고, CPU의 기능은 향상돼 수십메가까지 관리가 가능해졌다. 사정이 이렇다면 누가 386이나 486 등의 컴퓨터에서 도스를 운영체제로 사용하겠는가? 이래서 XT와의 호환성을 희생시키고서라도 향상된 CPU의 능력을 최대한 발휘할 수 있는 방식이 개발되었다(이러한 운영방식을 보호모드 protected mode라고 한다). 추가로 확장메모리 보드를 설치하지 않고도 메인보드에 1메가바이트 이상의 메모리를 장착해 여기에 쉽게 접근하도록 개발된 방식이 바로 연장메모리(Extended memory)관리 방식이다.

 


필시툴즈의 SI. EXE(System information)로 알아본 메모리상황. 노텉에서 제공하는 같은 이름의 프로그램으로도 상세한 메모리 할당을 알 수 있다.


호환성과 효율성사이에서의 딜레마

따라서 연장메모리를 사용하려면 도스에 포함된 HIMEM.SYS라는 프로그램을 CONFIG.SYS에 등록시켜야 한다. 그런데 메모리의 번지와 실제적인 메모리의 갭 때문에 많은 혼동이 일어났다. 예를 들어 1MB의 메모리를 가지고 있는 286 사용자의 경우 메모리는 640kb의 기본메모리와 컴퓨터의 주변장치들이 차지하는 384kb의 상위메모리(upper memory), 그리고 384kb의 연장메모리로 이해되어야 하는 것이다. 즉 사용자가 실제로 장착하고 있는 램 1mb중 640kb를 제외한 나머지 384kb는 메모리 번지상으로는 1024kb부터 1408kb의 메모리 번지로 어드레싱된다는 말이다.

연장메모리가 개발된 초기에 이곳은 그냥 자료저장이나 램디스크 등으로 쓰일 뿐 도스가 제어하지 못하는 구역이었다. 그래서 특수하게 설계된 프로그램만이 이 연장 메모리를 자유롭게 사용할 수 있었다. 이러한 프로그램의 대표적인 것중 하나가 윈도 프로그램이다.

그러던 중에 도스(리얼모드)에서도 1MB 바로 위 64kB, 즉 연장메모리의 가장 처음 64kB에 접근하는 방법을 찾아냈다. 이것은 A20 Handler라는 어드레스 라인을 이용해 도스가 제어할 수 있도록 만든 것이다. 이 작은 영역에 버퍼 등의 시스템을 올려둠으로써 64kb 만큼의 기본메모리의 여유를 갖게 됐다. 이곳을 HMA(High Memory Area) 즉 윗쪽 메모리라고 한다.

하드웨어의 성능향상으로 연장메모리의 사용이 일반화되기는 했지만 대부분의 프로그램들, 예를 들면 로터스사의 로터스 1-2-3라든가 애시톤테이트사의 디베이스 시리즈 등은 확장메모리를 지원하도록 설계됐기 때문에 여전히 문제가 생겼다.

그래서 연장메모리를 설치하고도 이를 확장메모리인 것처럼 CPU를 속이는(이를 에뮬레이트라고 한다) 프로그램이 생겨났다. 바로 이를 위한 프로그램이 도스 유틸리티에 포함되어 있는 EMM386.SYS(또는 EMM386.EXE)이다. 파일 이름에서도 알 수 있듯이 EMM386.SYS는 386컴퓨터 이상에서만 작동된다. 만약 286사용자가 확장메모리를 사용하려면 EMS40.SYS 등 286용 프로그램을 사용해야 한다. 도스에서 제공하는 EMM386.EXE 이외에도 386이상의 컴퓨터용 확장메모리 관리자로는 QEMM386.SYS라든가 386MAX.SYS 등이 있는데, 이런 프로그램들은 하나의 프로그램으로 연장메모리와 확장메모리 모두를 사용할 수 있게 해주므로 사용이 매우 편리하나 윈도 사용시 충돌하는 경향이 있다.

그러나 도스의 메모리 확장자(MEMORY EXTENDER)를 사용하지 않는 보통의 프로그램, 예를 들면 <;한글>; 1.52이하 버전에서는 기본메모리만을 사용하기 때문에 만성적인 메모리 부족 사태를 면할 수 없다. 그래서 궁여지책으로 고안된 것이 바로 UMB(Upper Memory Block)를 활용하는 방식이다.

이 곳은 원래가 비디오 램 등으로 사용되어지는 곳이다. 그러나 모든 구역이 다 사용되지는 않고 몇개의 사용되지 않는 블록이 있다는 것이 발견됐다. 이러한 곳을 내버려 두기란 아까운 일이 아닐 수 없다. 왜냐하면 리얼모드에서 접근할 수 있는 메모리 번지는 1024kb뿐인데 실제로는 전혀 사용되지도 않는 영역이 이 번지를 차지하고 있기 때문이다. 그래서 여기에 디바이스 드라이버 등 램상주 프로그램을 올리는 방법을 찾아냈다.

그렇지만 여기에는 한가지 복잡한 문제가 따른다. UMB에는 연장(exTeded) 메모리가 아닌 확장(exPanded) 메모리만이 접근할 수 있다는 점이다. 확장메모리 보드 없이 메인보드상에 640kb가 넘는 메모리를 장착한 대부분의 사람들은 이 부분을 사용하기 위해서 연장메모리 관리자를 먼저 실행시키고 이를 다시 확장메모리로 에뮬레이트한 다음 config.sys에서 램상주 디바이스 드라이버 앞에 devicehigh명령을 사용해야 한다.


도표로 살펴본 메모리 영역


기본메모리 절약의 실례

다음과 같은 CONFIG.SYS파일의 예를 보자
.
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE 1024
buffers=10
files=40
dos=high, UMB
LASTDRIVE=D
FCBS=16, 0
DEVICEHIGH=C:\DOS60\SETVER.EXE
DEVICEHIGH=C:\STACKER STACKER.COM C:\STACVOL.000D:
DEVICEHIGH=C:\STACKER SSWAP.COM
DEVICEHIGH=C:\MOUSE.SYS


첫줄에 연장메모리 관리자가 등록돼 있다. 첫줄에 등록돼 있는 HIMEM.SYS는 사용자가 가지고 있는 640KB 이외의 모든 메모리를 연장메모리로 관리해준다. 그 다음 줄에는 EMM386.EXE가 있는데 뒤에 1024라는 숫자가 적혀 잇다. 이는 연장메모리 중에서 1024kB, 즉 1mb 만큼을 확장메모리로 에뮬레이트한다는 것을 의미한다. 이로써 마지막 네개의 행에 DEVEICEHIGH 명령을 사용할 수 있게 되었다. 즉 4개의 디바이스 드라이버를 기본메모리가 아닌 상위메모리블록(UMB)에 올려놓음으로써 그만큼의 기본메모리가 절약된 것이다. 여기에 DOS=HIGH,UMB를 사용함으로써 도스의 시스템 파일조차도 상위메모리 블록에 올라갈 수 있게 된다.

이때 명심해야 할 것은 디바이스 프로그램들은 EMM386.EXE가 실행되지 않고 HIMEM.SYS만이 실행된 환경(연장메모리만을 사용할 수 있는 환경)에서는 64kB의 HMA밖에 활용할 수 없다는 것이다. 따라서 1088kB(리얼모드의 제한 1024kB+HMA 64kB)보다 상위에 있는 메모리 번지를 사용할 수 없기 때문에 별 수 없이 기본메모리만 사용하게 되어 있다. 만약 디바이스 드라이버의 크기가 128k라면 DEVICEHIGH 명령을 사용하지 않을 경우 모두 기본메모리로 들어가기 때문에 사용자가 접근할 수 있는 기본메모리는 500kB 정도밖에 안된 것이다. 왜냐하면 HIMEM.SYS나 EMM386.EXE 자체는 UMB로 올려 놓을 수 없기 때문이다.

이러한 상황은 AUTOEXEC.BAT에서도 마찬가지다. 다음의 AUTOEXEC.BAT의 예를 보자.

C:\ndw\image
C:\STACKER\CHECK/WP
LH C:\dos60\smartdrv.exe2048@ECHO OFF
PROMPT $p$g
PATH C:\DOS;D:\WIN;C:\;C:\NU;C:\HANME;C:\NDW;C:\util;C:\STACKER;D:\ZIP
SETNU=C:\NU
set temp=c:\temp
LH C:\DOS60\share.exe


위에서 SMARTDRV.EXE라는 캐시프로그램과 SHARE.EXE라는 램상주 프로그램 앞에 LH가 붙었는데, 이는 LOADHIGH의 약어로써 램상주프로그램을 UMB에 올려놓기 위한 명령어다. 이로써 CONFIG.SYS 파일에서는 DEVICE 대신 DEVICEHIGH를 사용하고, AUTOEXEC.BAT 파일에서는 LH를 사용함으로써 도스의 기본메모리를 절약할 수 있음을 알 수 있다. 이를 위한 전제조건은 CONFIG.SYS 파일의 첫행과 둘째행에 HIMEM.SYS와 EMM386.EXE를 차례로 등록시켜 두어야 한다는 것이다.

컴퓨터가 발달할수록 주변장치나 램상주 프로그램은 늘어나고 있는데, 이런 프로그램들이 모두 기본메모리만 사용한다면 기본메모리의 크기가 너무 작아진 나머지 대부분의 프로그램들은 실행조차 되지 않을 수도 있다. 그러므로 EMM386.EXE와 DEVICEHIGH를 이용해서 기본메모리 영역을 비켜가는 이 방식은 메모리 관리에 많은 도움을 준다.

이 기사의 내용이 궁금하신가요?

기사 전문을 보시려면500(500원)이 필요합니다.

1993년 06월 과학동아 정보

  • 이형열 대표

🎓️ 진로 추천

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