{{위키데이터 속성 추적}}
컴퓨팅에서 '''오버레이'''({{lang|en|overlay}})란 ''데이터나 인스트럭션 [[블록 (컴퓨팅)|블록]]을 다른 블록으로 교체''<ref>{{웹 인용 |date= 2007년 2월 19일 |url= http://www.askoxford.com/concise_oed/overlay_1?view=uk |title= Oxford Dictionaries |확인날짜= 2014년 1월 28일 |archive-date= 2007년 9월 29일 |archive-url= https://web.archive.org/web/20070929082828/http://www.askoxford.com/concise_oed/overlay_1?view=uk |url-status=  }}</ref>하는 것을 의미한다. 오버레이는 컴퓨터의 [[기억 장치|메인 메모리]]보다 큰 프로그램을 실행할 수 있게끔하는 [[컴퓨터 프로그래밍|프로그래밍]] 방법이다. 주로 [[가상 메모리]]를 지원하지 않는 [[임베디드 시스템]]에서 많이 사용된다.

==사용법==
오버레이 방식을 사용하기 위해선 먼저 프로그램을 ''오버레이''라 불리는 독립적인 [[목적 파일|목적 코드]] 블록으로 나눠야 한다. 이 코드 블록들은 트리 구조로 배치되며, 같은 깊이에 있는 ''형제'' 블록들은 같은 메모리 영역을 공유한다. 이 메모리 영역은 ''오버레이 영역'' 혹은 ''대상 영역''이라 불린다. 오버레이 프로그램이나 [[운영 체제]]의 일부로 동작하는 오버레이 관리자는 외부 [[기억 장치]]에서 필요한 오버레이를 대상 영역으로 읽어들인다. 참고로 [[링커 (컴퓨팅)|링커]]에서 오버레이를 지원해 주는 경우가 많다.<ref>{{웹 인용|date= 2008년 6월 3일 | url = http://sourceware.org/binutils/docs/ld/Overlay-Description.html
 | title = The GNU Linker documentation: Overlay Description}}</ref>

==예제==
다음 예제는 OS/360 링크 편집기로 오버레이 프로그램을 링크할 때 사용하는 제어 명령들이다.

<pre>
 INCLUDE SYSLIB(MOD1)
 INCLUDE SYSLIB(MOD2)
 OVERLAY A
   INCLUDE SYSLIB(MOD3)
     OVERLAY AA
       INCLUDE SYSLIB(MOD4)
       INCLUDE SYSLIB(MOD5)
     OVERLAY AB
        INCLUDE SYSLIB(MOD6)
 OVERLAY B
    INCLUDE SYSLIB(MOD7)
</pre>

<pre>
                       +--------------+
                       | Root Segment |
                       | MOD1, MOD2   |
                       +--------------+
                               |
                    +----------+----------+
                    |                     |
             +-------------+       +-------------+
             |  Overlay A  |       |  Overlay B  |
             |  MOD3       |       |  MOD7       |
             +-------------+       +-------------+
                    |
           +--------+--------+
           |                 |
    +-------------+   +-------------+
    | Overlay AA  |   | Overlay AB  |
    | MOD4, MOD5  |   | MOD6        |
    +-------------+   +-------------+
</pre>

위의 예제에서 오버레이 A와 B는 같은 메모리 영역을 공유하고 오버레이 AA와 AB도 같은 메모리 영역을 공유한다. 오버레이 A의 코드가 모두 실행되면 이 메모리 영역에 오버레이 B의 코드가 덮어씌워진 뒤 오버레이 B의 코드가 실행되는 형태로 프로그램이 진행된다.

최상위 오버레이에서 어떤 주어진 오버레이 사이의 모든 오버레이들은 ''경로''라 불린다.

==활용==
2007년도 기준으로 대부분의 비즈니스 프로그램들은 [[가상 메모리]] 환경에서 동작하도록 만들어졌기 때문에 프로그램의 [[작업 세트]](working set)가 물리적인 메모리보다 크지 않는 이상 오버레이 방식을 사용하지 않아도 된다. 덕분에 대부분의 개발자들은 더 이상 오버레이 크기라는 제약 없이 프로그램이 해결하고자 하는 문제 자체에 집중할 수 있게 되었다. 또한 더 이상 프로그램 크기에 크게 구애받지 않기 때문에 [[자바 (프로그래밍 언어)|자바]]나 [[C++]]와 같은 고급 프로그래밍 언어를 편하게 사용할 수 있게 되었다.

하지만 [[임베디드 시스템]]에 자주 사용되는 저렴한 프로세서들은 [[메모리 관리 장치]](MMU)를 제공하지 않기 때문에 이와 같은 경우 오버레이 방법이 여전히 유용하게 사용된다.<ref name="Levine">{{서적 인용|last=Levine|first=John R.|title=Linkers & Loaders|year=2000|publisher=Morgan Kaufmann Publishers|isbn=1-55860-496-0|url=http://linker.iecc.com/|page=177}}</ref> 또한 오버레이 방식이 [[페이징]]보다 더 예측가능한 시간안에 동작하기 때문에 [[실시간 시스템]]에서도 여전히 많이 사용된다. 예를 들어 [[우주 왕복선]]의 ''Primary Avionics System Software (PASS, 항공 전자 시스템 소프트웨어)''는 오버레이 방식을 사용한다.<ref>{{웹 인용|title=An Assessment of Space Shuttle Flight Software Development Processes|url=http://www.nap.edu/openbook.php?record_id=2222&page=39|accessdate= 2012년 10월 29일}}</ref>

== 각주 ==
{{각주}}

== 같이 보기 ==
* [[가상 메모리]]
* [[페이징]]

[[분류:가상 메모리]]