[운영체제] 메모리

mainsain·2024년 2월 11일
0

CS

목록 보기
15/20
post-thumbnail

메모리

CPU는 그저 메모리에 올라와 있는 프로그램의 명령어들을 실행할 뿐.

1️⃣ 메모리 계층

레지스터, 캐시, 메모리, 저장장치로 구성되어있음

  • 레지스터
    • CPU안에 있는 작은 메모리
    • 휘발성
    • 속도 가장 빠름
    • 기억 용량 가장 적음
  • 캐시 (L1, L2 캐시)
    • 휘발성
    • 속도 빠름
    • 기억 용량 적음
  • 메모리(RAM) / 주기억장치
    • 휘발성
    • 속도 보통
    • 기억 용량 보통
  • 저장장치(HDD, SSD) / 보조기억장치
    • 비휘발성
    • 속도 낮음
    • 기억 용량 많음

위로 갈 수록 속도가 빨라지고 용량은 적어지기에 비싸진다. 경제성과 캐시때문에 계층을 구분시켰다.

캐시

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

→ 데이터 접근 시간이 오래걸리는 경우 해결, 다시 계산하는 시간 절약 가능

실제로 메모리와 CPU 사이의 속도 차이가 크기에, 중간에 레지스터 계층을 두어 속도 차이를 해결한다.
캐시 계층 : 속도 차이를 해결하기 위해, 계층사이에 있는 계층

지역성 : 캐시를 직접 설정 (캐시 계층을 두지 않음)

시간 지역성

  • 최근 사용한 데이터에 다시 접근하려는 특성
  • ex) for문의 변수 i

공간 지역성

  • 최근 접근한 데이터를 이루고 있는 공간이나 가까운 공간에 접근하는 특성
  • ex) arr배열에 i가 할당되며 해당 배열에 연속적으로 접근가능

캐시히트와 캐시미스

캐시히트 : 캐시에서 원하는 데이터를 찾음
캐시미스 : 원하는 데이터가 캐시에 없다면 주 메모리로 가서 데이터를 찾아옴 → 시스템 버스를 기반으로 작동하기에 느림

캐시매핑

  • 캐시가 히트되기 위해 매핑하는 방법
  • 레지스터가 캐시 계층의 역할을 잘 하려면 매핑을 어떻게 하느냐에 달림
매핑 유형설명
직접 매핑 (directed mapping)- 메인메모리와 캐시를 똑같은 크기로 나누고 순서대로 매핑하는 것
- 처리가 빠름
- 충돌 발생이 잦음
연관 매핑 (associative mapping)- 순서를 일치시키지 않고 관련있는 캐시와 메모리를 매핑하는 것
- 처리가 느림
- 충돌 적음
집합 연관 매핑 (set associative mapping)- 직접 매핑 + 연관 매핑
- 순서는 일치시키지만 집합을 둬서 저장
- 효율적인 매핑

웹 브라우저의 캐시

  • 쿠키 : 만료기한이 있는 key-value 저장소
  • 로컬 스토리지 : 만료기한이 없는 key-value 저장소, 브라우저를 닫아도 유지
  • 세션 스토리지 : 만료기한이 없는 key-value 저장소, 탭 닫을 시 해당 데이터 삭제

참고
메인 데이터베이스 위에 레디스(redis)를 캐싱 계층으로 둬서 성능을 향상시키기도 함

2️⃣ 메모리 관리

운영체제의 대표적인 할 일 중 하나가 메모리 관리이다. 한정된 메모리를 극한으로 활용해야함

가상 메모리 (virtual memory)

메모리 관리 방법 중 하나로, 메모리 자원을 추상화해 사용자들에게 매우 큰 메모리로 보이게 만드는 것

  • 가상 주소 : 가상적으로 주어진 주소
    • 메모리관리장치(MMU)에 의해 실제 주소로 변환됨
    • 따라서 실제 주소를 의식할 필요 없이 프로그램 구축 가능
  • 실제 주소 : 실제 메모리상에 있는 주소
  • 가상 메모리 : 페이지 테이블로 관리됨
    • 속도 향상을 위해 TLB를 사용
  • 페이지 테이블 : 가상 주소와 실제 주소가 매핑되어 있고 프로세스의 주소 정보가 들어있다.
  • TLB : 메모리와 CPU사이에 있는 주소 변환을 위한 캐시
    • 페이지 테이블에 있는 리스트를 보관하는 캐시계층

스와핑(swapping)

가상 메모리엔 존재하지만 실제 메모리(RAM)엔 없는 데이터나 코드에 접근하면 페이지 폴트가 발생한다.
이때 메모리에서 사용하지 않는 영역을 하드디스크로 옮긴다.
이후 하드디스크의 일부분을 마치 메모리처럼 불러와 사용하는데, 이를 스와핑이라고 한다.
→ 마치 페이지폴트가 일어나지 않은 것처럼 만든다.

  • 페이지 : 가상 메모리를 사용하는 최소 크기 단위
  • 프레임 : 실제 메모리를 사용하는 최소 크기 단위

스레싱(Thrashing)

메모리에 너무 많은 프로세스가 동시에 올라가면 메모리의 페이지 폴트율이 높아져 스와핑이 많이 일어나서 발생하는 심각한 성능 저하 초래 현상

  • 메모리를 늘리거나 HDD를 SSD로 바꿔 해결할 수 있다.
  • 운영체제에선 작업 세트와 PFF로 해결 가능하다.
  • 작업 세트 : 지역성을 통해 결정된 페이지 집합을 만들어 미리 메모리에 로드한다.
    • 미리 로드하면 탐색에 드는 비용, 스와핑을 줄일 수 있다.
  • PFF(Page Fault Frequency)는 상한선과 하한선을 반들어 프레임을 관리한다.

메모리 할당

메모리에 프로그램을 할당할 때, 시작 메모리 위치메모리의 할당 크기를 기반으로 할당한다. 이는 두가지로 나뉜다.

연속 할당

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

  • 고정 분할 방식(fixed partition allocation) : 메모리를 미리 나누어 관리하는 방식
    • 미리 나누기에 융통성이 없다.
    • 내부 단편화가 발생한다.
  • 가변 분할 방식(variable partition allocation) : 동적으로 프로그램에 맞게 메모리를 나눠 사용한다.
    • 외부 단편화가 발생할 수 있다.
    • 가변 분할 방식은 아래 3가지가 있다.
할당 전략설명
최초 적합위쪽이나 아래쪽부터 시작해서 홀을 찾으면 바로 할당한다.
최적 적합프로세스의 크기 이상인 공간 중 가장 작은 홀부터 할당한다.
최악 적합프로세스의 크기와 가장 차이가 많이 나는 홀에 할당한다.

내부 단편화(internal fragmentation) : 메모리를 나눈 크기보다 프로그램이 작아서 공간이 남는 현상
외부 단편화(external fragmentation) : 메모리를 나눈 크기보다 프로그램이 커서 못들어가는 공간이 발생하는 현상

불연속 할당

메모리를 연속적으로 할당하지 않는다.

  • 페이징(paging) : 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당한다.
    • 홀의 크기가 균일해진다.
    • 주소 변환이 복잡해진다.
  • 세그멘테이션(segmentation) : 세그먼트로 나누는 방식
    • 프로세스를 이루는 메모리 : 코드 영역, 데이터 영역, 스택영역, 힙 영역
    • 코드와 데이터로 나누거나 작은 함수를 세그먼트로 놓고 나눌 수도 있음
    • 공유와 보안 측면에서 강점을 가짐
    • 홀의 크기가 균일하지 않음
  • 페이지드 세그멘테이션(paged segmentation) : 두 장점을 결합한 방식
    • 프로그램을 의미 단위인 세그먼트로 나눔
    • 동일한 크기의 페이지 단위로 나누는 것

페이지 교체 알고리즘

메모리는 한정되어 있기에 스와핑이 자주 일어난다. 스와핑이 많이 일어나지 않도록 설계해야한다.

  • 오프라인 알고리즘(offline algorithm) : 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘
    • 가장 좋은 방법이지만, 미래의 프로세스를 알 수 없기에 실현 불가능함
    • 성능의 상한 기준
  • FIFO(First In First Out) : 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법
  • LRU(Least Recently Used) : 참조가 가장 오래된 페이지를 교체
    • 오래된 것을 파악하기 위해, 페이지마다 계수기, 스택을 두어야함
    • 해시테이블 + 이중연결리스트로 구현
  • NUR(Not Used Recently) : LRU를 개선한 clock이라고도 불리는 알고리즘
  • LFU(Least Frequently Used) : 가장 참조 횟수가 적은 페이지를 교체한다.
profile
새로운 자극을 주세요.

0개의 댓글