주소·참조·메모리 계층
호텔 객실번호 1203은 방 안의 손님이 아니라 방을 찾는 위치 식별자다. 메모리 주소도 값이 놓인 위치를 가리키며, 참조는 코드가 그 위치나 객체를 찾아가게 한다. 같은 값을 복사할 수도 있고 같은 객체를 두 이름이 함께 가리킬 수도 있어, 이 차이는 프로그램 변경과 오류에 직접 영향을 준다.
값과 값이 있는 곳은 다르다
호텔 객실번호 1203은 방 안의 손님이 아니라 방을 찾는 위치 식별자다. 메모리 주소도 값이 놓인 위치를 가리키며, 참조는 코드가 그 위치나 객체를 찾아가게 한다. 같은 값을 복사할 수도 있고 같은 객체를 두 이름이 함께 가리킬 수도 있어, 이 차이는 프로그램 변경과 오류에 직접 영향을 준다.
한편 CPU와 큰 저장장치의 속도 차이는 매우 크다. 모든 데이터를 가장 빠른 저장공간에 둘 수 없으므로 작고 빠른 층과 크고 느린 층을 결합한 메모리 계층을 사용한다.
먼저 되짚기: CPU는 바이트로 표현된 값과 명령을 가져온다
바이트는 저장과 주소의 기본 묶음이고, CPU는 명령어 사이클마다 필요한 명령과 값을 가져온다. 이번 절은 CPU가 “어디에서” 값을 찾고, 가까운 작은 저장공간과 먼 큰 저장공간을 어떻게 함께 쓰는지 설명한다.
CPU가 값을 찾으려면 위치와 계층을 함께 본다
주소는 바이트가 놓인 위치를 구별하고, 메모리 계층은 그 위치의 접근 비용을 설명한다. CPU는 참조·주소 계산과 캐시 적중 분기를 거쳐 값을 전달받는다. 가까운 층에 없으면 아래층을 기다린다.
주소는 위치를, 계층은 그 위치의 접근비용을 설명한다.
메모리 주소
메모리 주소(memory address)는 메모리의 저장 위치를 구분하는 식별값이다. 바이트 단위로 주소를 매기는 시스템이라면 연속된 바이트는 연속 주소를 가진다. 여러 바이트 값은 시작 주소와 길이, 자료형 규칙을 함께 알아야 올바르게 읽는다.
참조 전에 주소의 의미를 다시 잇는다
메모리 주소는 저장 위치를 구분하는 식별값이다. 참조는 코드가 값 자체 대신 객체나 위치를 가리키는 관계이므로 주소·수명·객체 이동을 같은 개념으로 보지 않는다.
주소와 참조는 구현 경계가 다르다
물리·가상 주소는 위치 식별에 가깝고 고수준 참조는 실행환경이 이동·수명을 숨길 수 있다. 참조값을 숫자 주소라고 가정하지 않는다.
메모리 계층
메모리 계층은 속도·용량·가격이 다른 레지스터·캐시·메모리·저장을 층으로 결합한 구조다. CPU에 가까울수록 일반적으로 빠르고 작으며 단위 용량당 비용이 높다. 자주 필요할 것으로 예상되는 데이터의 복사본을 가까운 층에 두어 평균 접근시간을 줄인다.
참조
참조(reference)는 값 자체가 아니라 값이 있는 객체나 위치를 가리키는 관계다. 참조의 구현이 언제나 물리 주소를 그대로 노출하는 것은 아니다. 실행 환경이 객체 이동과 유효성을 관리하면서 안정적인 논리 참조를 제공할 수 있다. 핵심은 참조를 복사하면 대상 값 전체가 아니라 같은 대상을 가리키는 관계가 복사될 수 있다는 점이다.
배열 원소를 읽을 때
캐시에 있으면 전달하고 없으면 아래층에서 가져온다 · 상태 따라가기
배열의 두 번째 값 주소는 1000+1×4=1004다. 모든 단계에서 주소·레지스터·캐시·메모리의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
고수준 참조가 대상의 논리 위치를 찾으면 이 연속 배열 모형에서 주소 1000+1×4=1004를 계산한다. 캐시에 적중하면 읽은 값을 바로 CPU 레지스터에 전달하고, 실패하면 주 메모리의 한 묶음을 캐시에 복사한 뒤 전달한다. 참조가 물리 주소를 직접 노출한다는 뜻은 아니다. 캐시 복사본의 최신성은 별도 계약이다.
이 예의 조건
- 고수준 참조가 대상의 논리 위치를 찾으면 이 연속 배열 모형에서 주소 1000+1×4=1004를 계산한다. 캐시에 적중하면 읽은 값을 바로 CPU 레지스터에 전달하고, 실패하면 주 메모리의 한 묶음을 캐시에 복사한 뒤 전달한다. 참조가 물리 주소를 직접 노출한다는 뜻은 아니다. 캐시 복사본의 최신성은 별도 계약이다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 프로그램 참조 | 대상 논리 위치 |
| 주소 계산 | 1000 + 1×4 = 1004 |
| 캐시에 있음? | 원그림의 대상 |
| 아래층에서 가져오기 | 주 메모리 한 묶음 / 캐시에 복사 |
| CPU 레지스터 | 네 바이트를 규칙대로 읽음 |
| 연결 | 원 라벨·방향 |
|---|---|
| 프로그램 참조 → 주소 계산 | 라벨 없는 연결 / 정방향 / 실선 |
| 주소 계산 → 캐시에 있음? | 라벨 없는 연결 / 정방향 / 실선 |
| 캐시에 있음? → CPU 레지스터 | 적중 / 정방향 / 실선 |
| 캐시에 있음? → 아래층에서 가져오기 | 실패 / 정방향 / 실선 |
| 아래층에서 가져오기 → CPU 레지스터 | 복사 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 주소 계산 배열의 두 번째 값 주소는 1000+1×4=1004다. |
|
|
| 캐시 조회 같은 주소의 캐시 값이 있는지 확인한다. |
|
|
| 실패 시 가져옴 miss이면 메모리에서 필요한 내용을 가져와 읽기 경로를 완성한다. |
|
|
| 레지스터 결과 확인한 주소의 값을 레지스터에 전달한다. |
|
|
캐시에 있으면 전달하고 없으면 아래층에서 가져온다 · 상태 따라가기
배열의 두 번째 값 주소는 1000+1×4=1004다. 모든 단계에서 주소·레지스터·캐시·메모리의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
고수준 참조가 대상의 논리 위치를 찾으면 이 연속 배열 모형에서 주소 1000+1×4=1004를 계산한다. 캐시에 적중하면 읽은 값을 바로 CPU 레지스터에 전달하고, 실패하면 주 메모리의 한 묶음을 캐시에 복사한 뒤 전달한다. 참조가 물리 주소를 직접 노출한다는 뜻은 아니다. 캐시 복사본의 최신성은 별도 계약이다.
이 예의 조건
- 고수준 참조가 대상의 논리 위치를 찾으면 이 연속 배열 모형에서 주소 1000+1×4=1004를 계산한다. 캐시에 적중하면 읽은 값을 바로 CPU 레지스터에 전달하고, 실패하면 주 메모리의 한 묶음을 캐시에 복사한 뒤 전달한다. 참조가 물리 주소를 직접 노출한다는 뜻은 아니다. 캐시 복사본의 최신성은 별도 계약이다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 프로그램 참조 | 대상 논리 위치 |
| 주소 계산 | 1000 + 1×4 = 1004 |
| 캐시에 있음? | 원그림의 대상 |
| 아래층에서 가져오기 | 주 메모리 한 묶음 / 캐시에 복사 |
| CPU 레지스터 | 네 바이트를 규칙대로 읽음 |
| 연결 | 원 라벨·방향 |
|---|---|
| 프로그램 참조 → 주소 계산 | 라벨 없는 연결 / 정방향 / 실선 |
| 주소 계산 → 캐시에 있음? | 라벨 없는 연결 / 정방향 / 실선 |
| 캐시에 있음? → CPU 레지스터 | 적중 / 정방향 / 실선 |
| 캐시에 있음? → 아래층에서 가져오기 | 실패 / 정방향 / 실선 |
| 아래층에서 가져오기 → CPU 레지스터 | 복사 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 주소 계산 배열의 두 번째 값 주소는 1000+1×4=1004다. |
|
|
| 캐시 조회 같은 주소의 캐시 값이 있는지 확인한다. |
|
|
| 실패 시 가져옴 miss이면 메모리에서 필요한 내용을 가져와 읽기 경로를 완성한다. |
|
|
| 레지스터 결과 확인한 주소의 값을 레지스터에 전달한다. |
|
|
연속 배열의 다음 원소는 가까운 주소에 있어 함께 가져온 묶음 안에 있을 가능성이 높다. 최근 쓴 값이나 가까운 값이 곧 다시 사용되는 경향을 이용하는 것이다. 가까운 층에서 찾으면 빠르지만 없으면 더 아래층을 기다린다. 캐시는 원본과 별개인 복사본이므로 여러 처리장치가 같은 값을 바꿀 때 어느 값이 최신인지 맞추는 규칙도 필요하다.
배열은 항목을 차례대로 놓고 위치번호로 찾는 목록이며, 여기서는 항목마다 4바이트를 차지하는 연속 저장 모형을 쓴다. 시작 주소가 1000이면 위치번호 0의 네 바이트는 1000~1003, 다음 항목은 1004~1007이다. 위치번호 1을 읽으려면 1000+1×4=1004로 시작점을 구하고 네 바이트를 같은 자료형 규칙으로 읽는다. 캐시에서 찾으면 적중(hit), 없으면 실패(miss)라 부르며 실패 때 아래층의 데이터를 가져오는 시간이 추가된다. 최근 쓴 값이 다시 필요하거나 주변 항목을 연속해 읽는 경향을 지역성이라고 부른다.
MH-1: 평균 접근시간과 공유 참조를 따로 판정한다
가상 계층에서 90%는 1ns 캐시 hit, 10%는 캐시 확인을 포함해 총 101ns가 걸리는 miss라고 하자. 평균 접근시간은 0.9×1 + 0.1×101 = 11ns다.
ns는 나노초로 1초의 10억분의 1이다. 100번 접근한다고 펼치면 90번은 각각 1ns로 총 90ns, 10번은 각각 101ns로 총 1010ns가 든다. 총 90+1010=1100ns를 100번으로 나누면 접근 한 번당 11ns다. 이처럼 각 경우의 시간에 그 경우의 비율을 곱해 더한 평균을 가중평균이라 읽는다. 101ns가 캐시 확인을 이미 포함한 총시간이라는 가정 때문에 실패마다 1ns를 다시 더하지 않는다.
hit 비율이 99%로 올라가고 miss 시간은 같다면 평균은 0.99×1 + 0.01×101 = 2ns다. 큰 메모리 하나를 추가했다는 사실보다 실제 hit/miss 비율과 비용이 중요하다.
별도로 변수 a와 b가 같은 변경 가능한 주문 객체를 참조한다고 하자. a.status="PAID" 뒤 b.status도 같은 객체를 본다면 바뀔 수 있다. 캐시 복사와 프로그램 참조 공유는 둘 다 “복사”라는 단어가 등장해도 다른 문제다.
설계 연습에서는 주문 100만 건을 매번 순차 집계하며, 별도 업무 요청이 일부 주문 상태를 변경한다고 가정한다. 집계용 연속 배열은 주문번호·수량·금액처럼 꼭 필요한 고정 크기 필드만 담은 읽기 전용 스냅숏으로 선택한다. 큰 설명 문자열이나 여러 객체를 따라가는 참조는 반복 집계 경로에서 분리한다. 목적은 가까운 데이터를 함께 읽는 것이며 특정 CPU에서 hit율 99%가 자동 달성된다는 뜻은 아니다.
정합성은 성능과 별도로 정한다. 업무 상태의 원천 소유자는 주문 처리 모듈 하나이고 다른 소비자는 판본이 고정된 집계 스냅숏을 읽는다. 여러 이름이 원천 객체를 공유한 채 자유롭게 상태를 바꾸는 대안은 기각한다. 집계가 최신 상태와 1분 차이까지 허용되는 자체 조건이라면 스냅숏 생성시각·판본을 표시하고 초과 시 현재 집계 제공을 제한한다. 최신성이 즉시 필요해지면 이 선택을 재검토한다.
복사와 참조, 빠름과 큼의 교환관계
| 선택 | 장점 | 대가 |
|---|---|---|
| 값 복사 | 이후 변경이 서로 독립적 | 큰 값은 시간·공간 비용 |
| 참조 공유 | 큰 객체를 복사하지 않고 함께 사용 | 뜻밖의 변경·수명·동시성 관리 |
| 가까운 빠른 층 | 접근 지연이 작음 | 용량 작고 비용 높음 |
| 먼 큰 층 | 많은 데이터를 저렴하게 보관 | 접근 지연이 큼 |
성능을 개선할 때 저장공간 하나만 빠르게 바꾸기보다 접근 패턴을 본다. 반복해서 쓰는 작은 데이터는 가까운 층의 이익을 얻기 쉽고, 매번 멀리 흩어진 큰 데이터를 한 번씩 읽으면 캐시 이익이 작다. 참조 공유는 동일한 상태를 보여 줘야 할 때 선택하고, 독립 변경이 필요하면 명시적으로 복사한다.
실패조건과 방어
잘못된 주소·범위를 사용하면 대상 밖의 바이트를 읽거나 쓰게 된다. 길이와 경계를 검사하고 안전한 참조 규칙을 사용한다.
유효기간이 끝난 참조는 이미 해제되거나 이동한 대상에 접근한다. 대상 수명과 참조 수명을 실행 환경 또는 명시적 소유권 규칙으로 맞춘다.
공유 참조의 별칭 문제는 서로 다른 이름이 같은 객체를 가리킨다는 사실을 놓칠 때 생긴다. 변경 가능성과 소유자를 드러내고 불필요한 공유를 줄인다.
캐시를 원본으로 오해하면 복사본 갱신과 무효화 규칙을 빠뜨릴 수 있다. 최신성 요구와 쓰기 반영 시점을 정한다.
용량만 보고 선택하면 큰 메모리를 추가해도 접근 패턴과 병목은 그대로일 수 있다. 캐시 적중, 메모리 대기, 저장장치 입출력을 분리해 측정한다.
자체 10점 문제
주소·참조·메모리 계층의 관계와 성능·정합성 고려사항을 설명하시오.
요구어는 설명이다. 위치, 가리킴, 계층별 접근비용과 공유 변경을 구분한다.
10점 풀이 방향과 모범답안 보기
10점 답안 목차
- 메모리 주소
- 참조와 대상 수명
- 메모리 계층
- hit/miss·지역성
- 공유 참조·최신성
10점 답안 도식
배열 읽기 분기를 따라 참조의 대상·수명·별칭, 주소의 길이·경계, 캐시의 hit/miss 비용을 각각 설명한다. 참조가 숫자 물리 주소와 같다고 단정하지 않는다.
모범답안 축약본: 위치·가리킴·속도 계층을 구분한다
문제: 주소·참조·메모리 계층의 관계와 성능·정합성 고려사항을 설명하시오. 메모리 주소는 바이트 같은 저장 위치를 구별하는 값이고, 참조는 값 자체를 복사하는 대신 특정 위치나 객체를 가리키는 관계다. 메모리 계층은 레지스터·캐시·주 메모리·저장장치처럼 작고 빠른 층과 크고 느린 층을 결합해 자주 쓰는 데이터를 가까이 두고 평균 접근시간을 낮춘다. 중앙처리장치가 주소를 계산해 캐시를 찾고 없으면 아래층에서 블록을 가져오는 과정 때문에 접근 패턴과 지역성이 성능을 좌우한다. 여러 참조가 같은 변경 가능한 객체를 가리키면 한곳의 변경이 다른 이름에서도 보이므로 소유권·수명·동기화를 정해야 한다. 캐시는 원본의 복사본이므로 최신성 요구, 쓰기 반영 및 무효화 규칙이 필요하다. 용량만 늘리지 말고 캐시 적중률, 메모리 대기와 저장 입출력을 나눠 측정한다.
자체 25점 문제
대용량 주문배열의 접근 성능과 공유 객체 정합성을 함께 개선하는 설계를 제시하시오.
요구어는 설계, 제시다. 접근패턴·계층·참조 공유를 한 문제로 뭉개지 않고 각각 통제한다.
25점 풀이 방향과 모범답안 보기
25점 답안 목차
- 배열 크기·접근패턴
- 주소 연속성과 지역성
- hit/miss 측정
- 객체 참조·별칭
- 변경 소유권
- 수명·유효성
- 정합성/동기화
- 변경 후 지연 재측정
25점 답안 도식
| 설계 축 | 선택·검증 |
|---|---|
| 접근 성능 | 순차 접근 필드의 연속 스냅숏; 같은 패턴의 hit/miss·지연 재측정 |
| 상태 정합성 | 원천 단일 변경 소유자; 스냅숏 판본·시각·허용 1분·충돌 검증 |
성능과 정합성이 모두 통과해야 채택한다.
25점 모범답안
먼저 주문배열의 순차·임의 접근 비율과 캐시 hit/miss 시간을 측정한다. MH-1처럼 hit율 변화가 평균 접근시간에 미치는 영향을 계산하고, 큰 메모리 추가만으로 해결된다고 가정하지 않는다.
변경 가능한 주문 객체를 여러 이름이 공유한다면 참조 소유자와 변경 경계를 정한다. 독립 변경이 필요하면 복사하고, 공유가 필요하면 수명·동기화·최신성 규칙을 둔다.
성능 개선 뒤 같은 데이터와 접근패턴으로 지연을 다시 측정하고, 참조 최적화가 데이터 정합성을 깨지 않았는지 별도로 테스트한다.
구체적 선택은 앞의 100만 건 순차 집계에 필요한 필드의 연속 읽기 전용 스냅숏과 단일 원천 변경 소유자다. 참조를 여러 단계 따라가는 구조보다 순차 접근을 단순화하되, 설명 데이터 전체를 복제해 메모리만 늘리는 안은 기각한다.
같은 데이터·접근패턴의 교육용 측정이 hit 90%에서 99%로 바뀌고 각 hit/miss 비용이 1/101ns로 유지됐다면 평균 접근시간은 11→2ns다. 실제 서비스 지연은 CPU 연산·스냅숏 생성·동기화까지 포함하므로 이 비율을 전체 처리속도 5.5배 보장으로 바꾸지 않는다. 시험은 집계 합계·판본 일치, 원천 상태변경 시 옛 스냅숏 불변, 허용 1분 초과 시 제한, 동시 갱신 충돌을 포함한다. 결과가 정확해도 성능목표를 못 맞추거나 성능이 좋아도 상태가 섞이면 채택하지 않는다.
출처와 적용 경계
본문은 안정된 주소·참조·메모리 계층 개념과 자체 latency 예를 사용한다. 실제 캐시 단계·주소 변환·참조 구현은 CPU·운영체제·언어 런타임에 따라 다르다.
30초 정리
- 주소는 저장 위치의 식별값이고 참조는 값 자체가 아니라 대상 위치나 객체를 가리키는 관계다.
- 메모리 계층은 작고 빠른 층과 크고 느린 층을 결합해 평균 접근시간을 줄인다.
- 참조 공유에는 변경·수명·동시성 비용이, 캐시 복사에는 최신성 비용이 따른다.
자기교정과 조건 변경
| 잘못 쓴 답 | 수정 | 복습 |
|---|---|---|
| 참조는 항상 물리 메모리 주소다 | 고수준 런타임은 논리 참조를 제공할 수 있다 | 참조 |
| 캐시 hit 90%면 평균시간도 1ns에 가깝다 | miss 비용까지 가중평균한다 | MH-1 |
| a와 b는 이름이 다르니 객체도 다르다 | 같은 변경 가능한 객체를 참조할 수 있다 | MH-1 |
| 큰 메모리만 추가하면 캐시 문제는 해결된다 | 접근패턴·hit율·대기시간을 측정한다 | 판단 |
| 캐시는 원본이므로 최신성 규칙이 필요 없다 | 복사본 갱신·무효화 규칙을 본다 | 실패 |
hit율이 80%라면? 평균은 0.8×1+0.2×101=21ns로 다시 계산한다.
a와 b가 값 복사라면? a 변경이 b에 보이지 않는 독립성 계약인지 확인한다.
접근이 완전 순차로 바뀌면? 공간 지역성 이익이 커질 수 있으므로 실제 hit율과 prefetch 효과를 다시 측정한다.