캐시와 메모리 할당

JoyJuhee·2022년 10월 7일
0

운영체제

목록 보기
8/10
post-thumbnail

1. 캐시(cache)

데이터를 미리 복사해 놓는 임시 저장소이자 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리

👉 이를 통해 데이터를 접근하는 시간이 오래 걸리는 경우를 해결한다.

1) 계산된 값을 저장해서 다시 계산하지 않게 하는 장치 또는 메모리로도 의미가 쓰인다.

2) 메모리와 CPU 사이의 속도 차이가 너무 크기 때문에 그 중간에 레지스터 계층을 둬서 속도 차이를 해결한다.
👉 이렇게 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층을 캐싱 계층이라고 한다. (캐시 메모리와 보조기억장치 사이에 있는 주기억장치를 보조기억장치의 캐싱 계층이라고 할 수 있다.)

3) 지역성의 원리
: 캐시 계층을 두는 것 말고 캐시를 직접 설정할떄는 어떻게 해야하나?
--> 이는 자주 사용하는 데이터를 기반으로 설정해서 "캐시히트"를 높여야 한다.
❓ 자주 사용하는 데이터? 시간지역성과 공간지역성을 근거로 자주 사용하는 데이터로 나눈다.

  • 시간 지역성(temporal locality) : 최근 사용한 데이터에 다시 접근하려는 특성
    ✅ 예시. for문에 있는 i변수에 계속 접근하는 것도 i가 최근에 사용한 데이터이기 때문에.

  • 공간 지역성(spatial locality) : 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성을 말한다.
    ✅ 예시. 배열 arr의 각 요소들에 i가 할당되며 해당 배열에 연속적으로 접근하는 것

2. 캐시히트와 캐시미스

👉 캐시히트를 하게 되면 해당 데이터를 제어장치를 거쳐 가져오게 된다. 

1) 캐시히트 : 캐시에서 원하는 데이터를 찾았을 때

  • 위치도 가깝고 CPU 내부 버스 기반으로 작동하기 때문에 빠르다.

2) 캐시미스 : 해당 데이터가 캐시에 없다면 주메모리로 가서 데이터를 찾아오는 것

  • 이는 시스템 버스를 기반으로 작동하기 때문에 느리다.

3. 캐시의 사례

1) 웹 브라우저의 캐시

  • 소프트웨어적인 대표적인 캐시로는 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세션 스토리지가 있다.

  • 보통 사용자의 커스텀한 정보나 인증 모듈 관련 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 아이덴티티나 중복 요청 방지를 위해 쓰인다.

2) 데이터베이스의 캐싱 계층

  • 데이터베이스 시스템을 구축할 때도 메인 데이터베이스 위에 레디스(redis) 데이터 베이스 계층을 '캐싱 계층'으로 둬서 성능을 향상시키기도 한다.

👉 먼저, 레디스를 본다. 레디스에 있으면 캐시히트, 그게 아니라면 메인 데이터베이스에서 찾는다. 

4. 메모리할당

메모리에 프로그램을 할당할 때는 시작 메모리 위치, 메모리의 할당 크기를 기반으로 할당하는데, 연속 할당과 불연속 할당으로 나뉜다.

1) 연속 할당
: 메모리에 연속적으로 공간을 할당하는 것을 말한다.

👉 A,B,C가 순차적으로 공간에 할당하는 것을 볼 수 있다. 고정 분할 방식과 가변 분할 방식으로 나눌 수 있다.

  • 고정 분할 방식(fixed partition allocation)
    : 메모리를 미리 나누어 관리하는 방식으로 메모리가 미리 나뉘어 있기 때문에 융통성이 없다. 내부 단편화가 발생하는 단점.
    내부 단편화(internal fragmentation) : 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상 (미리 정해진 크기에 프로그램이 들어갔는데, 프로그램 크기가 더 작아 메모리 공간이 조금씩 남는 현상.)

  • 가변 분할 방식(variable partition allocation)
    : 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용한다. 외부 단편화가 발생하는 단점.
    외부 단편화 : 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하는 현상.

    👉 최초적합 : 위쪽이나 아래쪽부터 시작해서 홀을 찾으며 할당
    ❓ 홀 : 할당할 수 있는 비어 있는 메모리 공간
    👉 최적적합 : 프로세스 크기 이상인 공간 중 가장 작은 홀부터 할당
    👉 최약적합 : 프로세스의 크기와 가장 많이 차이가 나는 홀에 할당

2) 불연속 할당
: 현대 운영체제가 쓰는 방법으로 메모리를 연속적으로 할당하지 않는다.

  • 페이징(paging)
    : 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당한다. 홀의 크기가 균일하지만, 주소 변환이 복잡해진다.
    👉 메모리 크기보다 프로세스의 크기가 크다면, 여러개의 메모리에 프로세스를 할당해야한다. 그러면 서로 다른 주소를 가지기 때문에 주소 변환이 복잡해진다.
  • 세그멘테이션(segmentation)
    : 페이지 단위가 아닌 의미 단위인 세그먼트로 나누는 방식이다.
    👉 프로세스는 코드 ,데이터, 스택, 힙으로 이루어져있는데 이를 기반으로 나눌 수도 있고, 함수 단위로 나눌 수도 있다. 공유와 보안 측면에서 좋으며 홀 크기가 균일하지 않은 문제가 발생된다.

  • 페이지드 세그멘테이션
    : 페이지드 세그멘테이션(paged segmentation)은 공유나 보안을 의미 단위의 세그먼트로 나누고, 물리적 메모리는 페이지로 나누는 것을 말한다.

출처 : 면접을 위한 CS전공지식 노트(책 / 강의)

0개의 댓글