Open longlivedrgn opened 3 months ago
과학적인 접근은 책을 다시 들여다보지 않으면 솔직히 잘 기억이 나지 않는데요. 일단 아는 선에서, 원할한 설명을 위해, 캐시 메모리에 앞서 캐시가 무엇인지 설명을 할 필요가 있을 것 같습니다. 캐시란 데이터를 읽는 시간을 줄이기 위해, 데이터를 읽는 주체와 가까운 곳에 데이터를 저장, 위치시켜놓는 것을 이야기합니다. 예를 들어 원래라면 100m를 왔다갔다 해야할 것을 1m만 왔다갔다 하게 함으로써 전체적인 속도를 향상시키는 것에 그 목적이 있습니다. 캐시 메모리란 이러한 기법에 사용되는 장치 및 공간을 이야기합니다.
앞서 데이터를 읽는 주체라고 표현했는데, 데이터를 읽는 주체 중에 대표적인 것은 CPU입니다. 즉 당연히 CPU 캐시가 존재하며, CPU 캐시 내에서도 CPU와 얼마나 가까운지에 따라 레벨이 존재하고, 크기와 속도가 상이합니다. CPU는 일반적으로 이러한 CPU 캐시에서 먼저 데이터를 찾고 만약 발견하지 못한다면, 미스가 난다면, 메모리에 접근하게 됩니다.
이러한 맥락으로 GPU와 디스크에도 캐시가 존재합니다. 또 거시적인 차원에서, 이렇게 장치 내에서만 캐싱이 이루어지는 게 아니라, 캐싱을 위한 컴퓨터도 존재하곤 합니다. 말그대로 캐싱이 곧 서비스인 캐싱 서버인데요. 유튜브처럼 동일한 데이터에 대한 IO 작업이 매우 빈번하고, 또 거대한 콘텐츠 플랫폼은 이를 하나의 아키텍처로 만들어 엣지 컴퓨팅이라는 이름으로 사용하는 것으로 알고 있습니다.
1-a) 캐싱이 좋다면 항상 사용하는 게 좋나요?
결론부터 말하면 쓰면 좋긴 합니다. 다만 이는 개발비용을 증가시킬 수 있기 때문에, 개발 상황에 맞추어 사용할 필요성이 있습니다. 그래서 저는 보통 고도화 작업에 캐싱을 도입하는 편입니다. 앞서 말씀드린 개발비용이 증가하는 부분은 크게 두 가지 입니다.
하나는 캐싱을 할 수 있는 공간이 유한하다는 것입니다. 이에 따라 캐싱하는 자원들의 가치를 비교해서 어떤 것은 남기고 어떤 것은 버릴지를 결정할 필요성이 생깁니다. 자원의 성격에 따라 이러한 비교 알고리즘도 종류가 나뉘는데 가장 최근에 사용된 것, 가장 빈번하게 사용되는 것 등 다양한 교체 방법이 있습니다.
또 하나는 캐싱을 한 자원이 다른 맥락에서 수정될 수 있다는 것입니다. 수정된 자원이 캐시 메모리에 바로바로 적용이 된다면 모르겠으나, 서버-클라이언트 구조로 개발이 되는 일반적인 앱의 경우 그 유효성을 어느 한 곳에서만 결정하기는 어려울 수 있습니다. 특히 빈번하게 바뀌는 자원의 경우 캐싱을 하는 것보다 오히려 이를 검증하는 오버헤드가 낭비로 이어질 수 있습니다. HTTP 메소드 중에는 특히 이런 검증에 유용한 HEAD라는 메소드를 지원하기도 합니다.
프로세서가 어떤 명령어셋을 사용하는지에 따라 나뉘는 것으로 알고 있습니다. x86 명령어가 상대적으로 더 많고, 이를 처리하기 위해 더 많은 유닛과 에너지가 필요한 것으로 알고 있습니다. 엣날에는 상대적으로 x86 하드웨어와 ARM 하드웨어의 성능격차가 매우 심해서 보통 x86으로 만들어졌는데, 최근에는 기술이 매우 좋아지고 하드웨어도 싸게 나와서, 그 차이가 심하지 않고 오히려 ARM이 더 좋은 부분도 많아지고 트렌드가 된 것으로 알고 있습니다.
잘 모르겠네요. 공부했던 '운영체제'라는 학문이나 하드웨어들이 대부분 기준이 데스크톱 컴퓨터였는데. 생각해보니까 모바일 기기의 구성 유닛은 한번도 제대로 관심을 안가졌네요
아 찾아보니까 SoC를 AP라고도 부르나보네요.
Image1 | Image2 |
---|---|
질문의 의도는 아닌 것 같지만, iOS 에서의 캐시 내용도 함께 알아보며 정리합니다.
- iOS에서는 메모리캐시, 디스크캐시 방식을 통해 앱 사용자들에게 더 빠릿빠릿한 앱 경험을 제공 해 주고, 서버 비용을 절감 해 주기도 합니다.
- 메모리 캐시 방식으로는 주로
NSCache
를 사용하는데, 단순히 Dictionary를 통해 캐싱을 구현할 시 스레드세이프, 캐시 메모리 제한 등의 문제를 내부적으로 잘 처리하도록 구현 해 놓은 방식입니다.- 디스크 캐시 방식으로는 주로
FileManager
를 사용하며, 디바이스 앱 용량에 남는 방식이기 때문에.. 만료 정책 같은 것들을 잘 수립해서 아주 오랫동안 사용하지 않는 캐시 파일이 무한정 남아있지 않도록 해주는 것이 좋습니다.
CPU는 메모리에 있는 데이터를 가져와서 명령어를 실행하고, 해석한다. 근데, CPU는 보조기억장치에 바로 접근이 불가능하다.
따라서, RAM에는 실행할 대상을 지정하고, 보조기억장치에는 저장할 대상을 지정해놓는다.
그리고, CPU가 실행하고 싶은 프로그램이 보조기억장치에 있다면 이를 RAM으로 복사하여 저장한 뒤 실행한다.
기본적으로 CPU가 메모리에 접근하는 시간은 CPU의 연산속도보다 느리다.
따라서 캐시 메모리가 필요한 것이다
저장 장치 계층 구조
이렇게 CPU가 메모리에 접근하는 속도는 매우 느린데, 그럼에도 CPU는 메모리에 빈번하게 접근을 해야된다. 그래서 캐시 메모리가 등장하였다.
캐시 메모리는
그렇다면 캐시 메모리는 어떤 식으로 CPU에서 사용할 데이터를 예측해서 메모리에서 빼와서 가지고 있을까?
iOS에서의 캐시 전략은?
그리고 Memory Cache 뿐만 아니라, Disk Cache 또한 존재한다.
Memory Cache
Disk Cache
간단하게 정리
컴퓨터는 크게 세 가지로 나눌 수 있다.
실제 계산을 처리하는 컴퓨터 부품이다. 즉, 연산장치이다. 프로그램에 속해있는 명령어들을 수행하는 역할이다.
CPU가 하나의 명령(Operation)을 처리하기 위해서 메모리에서 명령을 가져오고 산술/논리 연산하여 명령을 수행한다. 수행된 명령어를 메모리에 돌려주고 다음 명령어를 가져온다.
메모리라고 부르는 것으로 실행할 명령어와 데이터를 저장한다.
지금 실행되고 있는 프로그램의 명령들을 작업에 필요한 작업대 역할이다.
데이터를 저장하는 short-term memory
로 사용된다.
CPU 입장에서는 메모리가 아닌 것은 전부 I/O이다.
저장장치 DISK는 RAM과 다르게 비휘발성 메모리이다. 전력이 없어도 데이터는 반영구적으로 저장된다.
실제 메모리와 CPU 사이에서 빠르게 전달을 위해 미리 데이터들을 저장해주는 좀 더 빠른 메모리이다. 일반적으로 CPU 칩에 직접 통합되거나 별도의 BUS 상호 연결이 있는 별도의 칩에 배치되기 때문에 CPU 메모리라고도 한다. 따라서 프로세서에 대한 접근성이 더 좋고, 프로세서와 물리적으로 가깝기 때문에 효율성을 높일 수 있다.
프로세서에 가깝기 위해서 메인 메모리보다 훨씬 작다. 결과적으로 저장 공간이 적다. 대신 캐시 메모리는 RAM보다 10~100배 빠르게 작동한다.
일반적인 세 가지 캐시 수준이 있다.
매우 빠르지만 상대적으로 작으며 일반적으로 프로세서 칩에 CPU 캐시로 내장된다.
자주 사용되는 명령어와 데이터를 저장하여 CPU가 빠르게 액세스할 수 있도록 하는 것이다. Central Processing Unit
CPU 가 자주 액세스하는 명령어와 데이터의 숨겨진 캐시라고 생각하면 된다.
L1보다 용량이 더 큰 경우가 많다. CPU에 내장될 수도 있고 별도의 칩이나 보조 프로세서에 있을 수도 있고 캐시와 CPU를 연결하는 고속 대체 시스템 버스가 있을 수도 있다. 이렇게 하면 메인 시스템 버스의 트래픽으로 인해 속도가 느려지지 않는다.
자주 요청되는 데이터와 명령어를 위한 더 많은 저장 공간을 제공하여 CPU가 메인 메모리에 액세스해야 하는 필요성을 최소화한다. 일부 멀티코어 아키텍처에서는 L2 캐시를 CPU 코어 간에 공유할 수 있다.
L1 및 L2의 성능을 향상시키기 위해 개발된 특수 메모리이다. L1과 L2는 L3보다 훨씬 빠를 수 있지만, 일반적으로 L3는 DRAM의 2배 속도이다.
멀티 코어 프로세서에서 L3 캐시는 모든 CPU 코어의 공유 리소스이다. 일반적으로 사용되는 데이터와 명령어를 위한 공유 캐시 공간을 생성하여 코어 간에 데이터를 효율적으로 공유할 수 있도록 한다. 이는 멀티 스레드 및 멀티 코어 프로그램에서 CPU 성능을 높게 유지하는 데 매우 중요하다.
CPU는 데이터를 처리할 때 캐시 메모리를 먼저 살펴보고 캐시 메모리에서 데이터를 찾으면 시간이 많이 걸리는 데이터 읽기를 수행할 필요가 없다.
캐시 메모리는 데이터 Locality(지역성)의 원리를 사용한다.
또한, CPU가 데이터를 요청했을 때, 캐시 메모리가 해당 데이터를 가지고 있다면 이를 Cache Hit
라 부르고, 데이터가 없어 DRAM에서 가져와야 한다면 Cache Miss
라고 부른다. 캐시 미스 발생 시, 처리 방법은 캐시 정책에 따라 다르며, 데이터를 읽어 오는 시점으로 사용하기도 한다.
근래에는 아래 그림과 같은 형태이다.
출처: https://www.researchgate.net/figure/L1-and-L2-cache-memories_fig5_322420547
출처: https://www.insidetheiot.com/cache-in-multicore-systems/
시간 지역성은 어떤 메모리 주소에 접근했을 때, 잠시 후에 이와 동일한 주소에 접근할 확률이 높으면 시간 지역성이 좋다고 표현한다. 반복문에서 사용하는 조건 변수처럼 한 번 참조된 데이터를 또 참조하게 될 가능성을 의미한다.
공간 지역성은 어떤 메모리 주소에 접근했을 때, 잠시 후 그 근처의 메모리 주소에 접근할 확률이 높으면 공간지역성이 좋다고 표현합니다. 배열에 있는 데이터를 연속으로 접근할 때 근처에 있는 데이터를 잠시 후 사용될 가능성을 의미한다.
이름 그대로 시간과 공간
을 기준으로 다음번 메모리 접근 때 접근할 가능성이 높은 메모리 주소를 지역성이 좋다라고 표현한다.
[번외] 참조의 지역성의 효율성 가장 유명한 예시로 배열 곱셈이 있다.
for i in 0...n { for j in 0...m { for k in 0...p { C[i][j] = C[i][j] + A[i][k] * B[k][j] } } }
배열의 마지막 차원에 원소를 연속적으로 정렬하는 언어에서는 루프 순서인 j와 k의 위치를 바꾸는 것만으로도 엄청난 속도 증가한다. 특히, 원소가 10만 개가 넘거나 L1, L2 캐시가 감당하지 못할 만큼 큰 배열의 경우 엄청난 효율을 자랑한다.
첫 번째 코드는 A[i][k] 배열이 캐시에 있다. k가 마지막 차원에서 연속적으로 증가하기 때문이다. 하지만 B[k][j]는 첫 번째 차원에서 k가 증가하므로 캐시 미스가 나게 된다.
// Cache Hit를 올리는 구조의 반복문 for i in 0...n { for k in 0...p { for j in 0...m { C[i][j] = C[i][j] + A[i][k] * B[k][j] } } }
Intel은 16비트 8086 마이크로프로세서를 출시하면서 86을 사용한 여러 후속 제품이 출시되었다. x86은 일반적으로 32비트 아키텍처를 나타낸다. x86 CPU에는 많은 명령어 집합이 존재한다. 단일 명령으로 전체 계산(ex: 곱하기)을 완료하거나 데이터 청크를 메모리의 한 위치에서 다른 위치로 직접 이동할 수 있는 것들이다. 별 것 아닌 것처럼 느껴져도 곱하고 이동하려면 낮은 수준에서 많은 명령이 필요하다. 이러한 유형의 명령 집합이 있는 처리장치는 CISCComplex Instruction Set Computing라고 한다. 강력한 명령어는 공간과 전력을 차지하는 더 많은 트랜지스터가 필요하다는 것을 의미한다.
에너지 효율성과 CPU 아키텍처의 명령어 세트를 단순화하는 방법을 모색하다가 RISCReduced Instruction Set Computer 프로세서의 설계로 이어졌다. 어셈블리 언어 프로그래머의 작업이 더 복잡해지지만 프로세서의 작업이 간소화되는 효과가 있다. RISC 프로세서와 고급 RISC 시스템을 사용하면 CPU 코어가 아닌 컴파일러로 복잡성을 푸시하여 복잡한 작업을 수행한다.
x86은 매우 빠른 컴퓨팅 성능을 갖는 경향이 있으며 프로그래밍 및 명령 수에서 더 명확하거나 단순하지만 트랜지스터가 많은 더 크고 더 비싼 칩을 희생해야 한다. ARM은 특정 유형의 작업에 대해 매우 빠를 수 있지만 작업이 더 복잡하고 작업을 정의하고 실행하는 데 더 많은 노력이 명령 집합이 아닌 프로그래밍에 푸시되기 때문에 개별 명령에 대한 반복적인 주기로 인해 속도가 느려질 수 있다.
위와 같은 차이로 ARM은 오랫동안 낮은 에너지 소비와 낮은 열 발생을 포함한 전반적인 리소스 관리에 중점을 두었다. ARM 아키텍처에는 단순화된 냉각 시스템이 없는 경향이 있다. 배터리 수명, 크기, 냉각 요구 사항 제거 그리고 중요한 비용에 초점이 맞춰진다.
수년 동안 데스크탑 또는 고성능 컴퓨팅에서는 x86이 적합하고 모바일 장치에는 ARM 칩이 적합하다고 이어졌다. 2020년 Apple의 M1 칩이 출시하고 2022에 M2 시리즈를 출시하면서 인식이 바뀌었다. 그러나 ARM 칩에서는 x86 아키텍처용으로 작성된 소프트웨어를 단순히 실행할 수는 없다. Apple이 이를 가능하게 한 이유는 실행할 수 있도록 수천 명의 개발자가 도구를 만들었기 때문이다.
Application Processor 스마트폰, 태블릿 등 전자기기에 장착되어 명령을 해석하고 시스템을 제어하는 두뇌 역할을 하는 시스템 반도체이다. 일반적으로 PC는 CPU, 메모리, 그래픽 카드, 하드 디스크 등 연결되어 있는 반면 모바일에서는 CPU처럼 작동할 수도 있고 모든 칩셋 기능을 수행할 수도 있다. 기본적으로 SoCsystem on chip 이다.
[!import] SoC 완전 구동이 가능한 제품과 시스템이 한 개의 칩에 들어있는 것을 말한다. 즉, 하나의 칩 내에서 CPU, GPU, RAM, ROM, 컨트롤러 등의 다양한 역할을 구현하는 체제이다. 우리의 뇌와 같은 존재라고 생각하면 된다.
OMAP4470 이라는 AP를 보더라도 GPU, CPU 그 외 다양한 기능이 집약되어 있다.
Apple에서는 Apple Silicon 은 ARM 호환 CPU 아키텍처를 설계해 사용하고 있다. GPU 아키텍처가 차지하는 부분도 타 AP보다 큰 사이즈로 그래픽 성능이 좋다.
iOS 운영 체제와의 통합으로 원활한 호환성과 최적의 성능을 제공하면서 뛰어난 사용자 경험으로 이어지게 된다. 에너지 효율에 중점을 맞춰 성능과 전력 소비의 균형을 맞추도록 최적화되어 있어 배터리 수명이 연장된다.
: 빠른 응답 시간을 위해 자주 액세스하는 정보를 저장하는 데 사용되는 데이저 저장소 유형이다.
L1 (Level 1 cache)
각 CPU 코어마다 독립된 L1 cache memory를 갖는다.
I-Cache(Instruction Cache)와 D-Cache(Data Cache)가 따로 존재한다.
Instruction cache(명령어 캐쉬)는 공간 지역성이 높다.
❓ 공간 지역성
CPU가 요청한 주소 지점에 인접한 데이터들이 앞으로 참조될 가능성이 높은 현상
데이터 캐쉬는 시간 지역성이 높다.
❓ 시간 지역성
최근 사용된 데이터, 변수가 재사용될 가능성이 높은 현상
CPU에서 L1부터 접근하며, 속도가 빠르다.
: 프로그램이 실행되는 동안 필요한 정보를 저장하는 컴퓨터 메모리이다. 저장된 데이터를 순차적이 아닌 임의의 순서로 액세스 할 수 있는 데이저 저장소이다.
프로그램 실행 과정
저장장치 계층 분류
: iphone, mac 등 디바이스의 프로세서를 가리키는 용어이다.
↘︎ Application Processor ↘︎
- iOS 기기에서 사용되는 프로세서
- 주로 애플이 자체적으로 설계하고 제조하는 칩셋인 A시리즈 칩을 가리킴
- 보안 기능이 통합되어 있음
- ⇒ iOS 기기의 보안 강화
- Secure Enclave, Touch ID, Face ID 등
- iOS 운영 체제와 밀접하게 통합됨
- ⇒ 효율적인 메모리 관리
- 애플은 하드웨어와 소프트웨어를 같이 개발하기 때문
캐시 메모리의 개념과 종류, 역할
↘︎ 효율적인 메모리 관리 ↘︎
- AP가 iOS에게 캐시 메모리를 요청하면 iOS는 AP가 필요로 하는 캐싱 작업을 수행(적절한 메모리 공간을 할당하고 관리)
- iOS는 AP와 협력하여 메모리를 효율적으로 관리하고, 캐시된 데이터를 적절히 활용하여 성능을 최적화
- (이제부터 위 두 문장의 'AP'를 'cpu'로, 'iOS'를 '운영체제'로 치환하여 읽어보자)
- '캐시 메모리'란, cpu가 자주 액세스하는 데이터나 명령어를 저장한 것으로, 주기억장치와 부기억장치 간의 속도차이를 극복하기 위해 사용됨
- 'cpu ~ 주기억장치' 중 어느 지점에 위치하는지(와 그에 따른 속도차이)에 따라 3종류로 나뉨(L1, L2, L3)
- 시스템 성능 향상과 메모리 효율성 향상에 지대한 역할을 하며, 이를 어떻게 구성하고 활용하느냐에 따라 앱(프로세스)의 성능과 사용자 경험이 달라짐
CPU 아키텍처의 종류와 특징
↘︎ AP는 CPU ↘︎ ↘︎ '운영체제'는 'CPU'와 협력하여 메모리를 ... ↘︎
- 예시로 든 arm, x86을 보면 arm64, x86_64가 떠오름
- 뒤의 '64'는 운영체제의 '00비트'를 말함
- 운영체제와 cpu 각각의 성능과 구조는 서로의 것과도 밀접한 관련
- 32비트와 64비트는 컴퓨터 시스템이 한 번에 처리할 수 있는 데이터의 크기
- x86 아키텍처 키워드
- Intel, AMD 등
- 16bit → 32bit → 64bit
- Windows, macOS, Linux 등 데스크탑·노트북 운영체제에서 주로 지원
- ARM 아키텍처 키워드
- 32bit → 64bit
- Acorn RISC Machine
- 에너지 효율성 ⇒ 배터리 수명 ⇒ 모바일 운영체제나 임베디드 시스템에서 주로 지원
- 참고) ARM의 종류
- ARMv7
- 이전 세대의 arm 아키텍처
- 32비트 명령어 세트 지원
- 초기 iPhone 및 iPad
- ARMv8
- 최신 arm 아키텍처로
- 64비트 명령어 세트 지원
- 높은 성능과 향상된 보안 기능
- 최근 iOS 기기에서 사용(arm64가 여기에 해당)
- 애플의 A시리즈 칩은 이를 기반으로 하고 있음
- ARMv9
- 미래에 사용될 arm 아키텍처
DUE DATE: 4/16 23:59