본문 바로가기
독서기록장

6. 운영체제 9장 메모리 (1) with redis..

by pon9 2025. 3. 28.

기본 하드웨어

CPU는 계산을 담당하는 놈이고, 계산하려면 데이터가 필요하다.

근데 이 데이터는 항상 CPU 내부에 있지는 않고, 보통 RAM에 있다.

 

CPU는 자기 내부에 Register라는 아주 빠른 공간에서만 직접 데이터를 꺼내 쓸 수 있다.

그래서 뭔가를 계산하려면 일단 메모리에 있는 데이터를 레지스터로 가져와야 하는데, 메모리에서 레지스터까지 데이터를 가져오는 건 시간이 꽤 걸린다.

 

CPU는 명령 하나를 1-3 Clock cycle에 처리 가능하다. 나노초 단위로 움직이며 굉장히 빠르다.

하지만 CPU가 연산하려면 데이터가 필요하고, 그 데이터는 RAM에 있고, CPU가 메모리에게 값을 요청한 사이 지연시간이 생긴다.

이 시간 동안 CPU는 계산을 못 하고 가만히 기다려야 하고, 이걸 Stall(지연) 이라고 한다.

특히 자주 쓰는 데이터가 자주 메모리에서 오고 가면 이 스톨이 자주 발생한다.

 

그래서 중간에 Cache라는 걸 둬서, 자주 쓰는 데이터는 미리 캐시에 복사해둔다.

이렇게 하면 CPU가 훨씬 빠르게 꺼내 쓸 수 있다.

캐시에 없으면? 메모리까지 내려가야 해서 느려진다 << 이게 OS에서의 캐시 미스

Redis는 모든 데이터를 RAM에 저장하고, 거기서 읽고 쓰므로 디스크 DB에 비해 훨씬 빠르다.
그런데 RAM에 있는 데이터를 그냥은 사용하지 못하므로 CPU가 꺼내와야 한다. 그래서 Redis에서 자주 사용되는 데이터는 자동으로 CPU캐시에 올라간다.
(L1: 굉장히 자주, 보통은 L2/L3, 이걸 Temporal locality 시간적 지역성? 최근에 접근했던 주소값을 다시 접근하는 경향 이라고 한다..)

OS에서의 캐시 미스와 Redis의 캐시 미스는 다르다.
OS 캐시 미스는 L1-L3캐시에 데이터가 없는 것이고,
Redis 캐시 미스는 Key가 없는 것
예를 들어 Redis에서 TTL이 무한대인 Key를 사용하면 OS레벨에서의 캐시 미스는 있을 수 있어도 Redis 캐시 미스는 없음

 

그리고 여러 프로그램이 메모리를 동시에 사용하면 안 되니까, 운영체제가 각 프로그램에게 허용된 메모리 영역을 나눠준다. (책에서는 Legal 메모리 주소 영역이라고 함)

예를 들어 "너는 300000부터 420947 까지만 써" 이런 식으로.. 이걸 위해 base 주소랑 limit이 있다.

base가 1이고 limit이 2면 1부터 3까지 사용할 수 있는거다.

 

만약 프로그램이 자기 영역 밖을 건드리면 운영체제가 감지해서 프로그램을 죽여버리고, 이게 메모리 보호

운영체제가 직접 메모리(시스템 자원)를 컨트롤 할 땐 Kernel 모드, 일반 프로그램이 돌 땐 User 모드 라고 한다.

 

 

주소 할당

프로그램은 원래 SSD, HDD등에 저장되어 있고, 실행할 때 운영체제가 그걸 RAM에 올려서 실행한다. 그리고 그 때 CPU가 명령을 하나 하나 실행하게 된다.

이 프로그램이 사용할 메모리 주소를 지정하는 과정을 Address Binding이라고 한다.

프로그램이 항상 메모리 주소 0번부터 차례로 적재되는 건 아니다. 운영체제가 알아서 빈 주소를 지정해준다.

그래서 원래 프로그램 내부에 있는 주소들도 고정된 실제 주소(물리 주소)가 아니라, 재배치 가능한 심볼 주소 같은걸로 표현되어 있다.

 

1. 컴파일 시간 바인딩(compile time)

프로그램을 만들 때 부터 주소값이 정해져있는 방식, 그래서 그 위치가 아니면 실행 불가능하며 유연성이 없다

 

2. 적재 시간 바인딩(load time)

프로그램을 실행할 때 운영체제가 "여기 올려야겠다" 하고 그 시점에 주소를 바꿔주는 방식이다

이걸 위해 프로그램은 재배치 가능하게 만들어야 하고, OS는 이 방식을 가장 많이 쓴다

 

3. 실행 시간 바인딩(execution time)

프로그램이 실행 중에도 메모리 주소를 옮길 수 있는 방식이다. 즉, 프로그램이 실행되는 도중에도 주소 위치를 바꿀 수 있다