본문 바로가기
Boaz/Computer Science

[CS 전공지식 #9] 챕터3-2. 메모리

by 남디윤 2025. 2. 17.

 

목차

2. 메모리

3.2.1 메모리 계층

3.2.2 메모리 관리

 

 

챕터3. 운영체제

 

2. 메모리

  • CPU는 “메모리”에 올라와있는 프로그램의 명령어들을 실행
  • 메모리 계층과 메모리 관리

 

3.2.1 메모리 계층

Image

  • 메모리 계층 구성
    • 레지스터: CPU 안에 있는 작은 메모리. 휘발성, 속도 가장 빠름, 기억 용량 가장 작음
    • 캐시: L1, L2 캐시. 휘발성, 속도 빠름, 기억 용량 적음 (L3 캐시도 있음)
    • 주기억장치: RAM. 휘발성, 속도 보통, 기억 용량 보통
    • 보조기억장치: HDD, SSD. 비휘발성, 속도 낮음, 기억 용량 많음
  • RAM: 하드디스크로부터 일정량 데이터 복사, 임시 저장, 필요시 CPU에 빠르게 전달
  • 계층 위로 올라갈수록 가격 비싸짐. 용량 작아지고 속도 빨라지는 특징
  • 계층 존재 이유: 경제성, 캐시
  • 캐시 cache
    • 데이터를 미리 복사해 놓는 임시 저장소
    • 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리
    • 메모리와 CPU 속도 차이 너무 커서 → 중간에 레지스터 계층을 둬서 속도 차이 해결
  • 지역성의 원리
    • 캐시 계층을 두는 것 말고 캐시를 직접 설정하는 것
    • → 자주 사용하는 데이터를 기반으로 설정
    • → 근거: 지역성 (시간 지역성, 공간 지역성)
      • 시간 지역성: 최근 사용한 데이터에 다시 접근하려는 특성
      • 공간 지역성: 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성
  • 캐시히트와 캐시미스
    • 캐시히트:
      • 캐시에서 원하는 데이터 찾음
      • 데이터를 제어장치를 거쳐 가지고 옴
      • 위치가 가깝고 CPU 내부 버스를 기반으로 작동 → 빠름
    • 캐시미스:
      • 캐시에서 원하는 데이터가 없어서 주 메모리로 가서 데이터를 찾아오는 것
      • 메모리에서 가져옴
      • 시스템 버스를 기반으로 작동 → 느림

Image

  • 캐시매핑
    • 캐시가 히트되기 위해 매핑하는 방법
    • CPU의 레지스터와 주 메모리(RAM) 간에 데이터를 주고 받을 때 기반으로 설명
    • 레지스터는 주 메모리에 비해면 매우 작고, 주 메모리는 크기 때문에
    • → 작은 레지스터가 캐시 계층 역할을 잘 하려면 → 매핑 잘 해야 함
    • 캐시매핑 분류: 직접 매핑, 연관 매핑, 집합 연관 매핑
  • 웹 브라우저의 캐시
    • 소프트웨어적인 대표적인 캐시: 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세션 스토리지
    • 사용자의 커스텀 정보, 인증 모듈 관련 사항을 웹 브라우저에 저장
    • 쿠키:
      • 만료기한이 있는 키-값 저장소
      • 4KB까지 데이터 저장 가능
      • 클라이언트 또는 서버에서 만료기한 등을 정할 수 있음 (보통 서버가)
    • 로컬 스토리지
      • 만료기한이 없는 키-값 저장소
      • 10MB까지 저장 가능
      • 웹 브라우저 닫아도 유지
      • 도메인 단위로 저장, 생성
      • HTML5 지원하지 않는 웹 브라우저에서 사용 불가
      • 클라이언트에서만 수정 가능
    • 세션 스토리지
      • 만료기한이 없는 키-값 저장소
      • 탭 단위로 세션 스토리지 생성, 탭 닫을 때 해당 데이터 삭제됨
      • 5MB까지 저장 가능
      • HTML5 지원하지 않는 웹 브라우저에서 사용 불가
      • 클라이언트에서만 수정 가능
  • 데이터베이스의 캐시 계층
    • 메인 데이터베이스 위에 레디스 redis 데이터베이스 계층을 “캐시 계층”을 둬서 성능 향상

Image

 

3.2.2 메모리 관리

  • 컴퓨터 내의 한정된 메모리를 극한으로 활용
  • 가상 메모리 virtual memory
    • 메모리 관리 기법의 하나
    • 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화 → 사용하는 사용자들에게 메우 큰 메모리로 보이게 만드는 것
    • 가상 주소, 실제 주소
      • 가상 주소는 메모리관리장치(MMU)에 의해 실제 주소로 변환
      • 실제 주소를 의식할 필요없이 프로그램 구축 가능
      • 페이지 테이블로 관리: 가상 주소, 실제 주소 매핑, 프로세스 주소 정보
      • 속도 향상을 위해 TLB 사용 (TLB: 메모리와 CPU 사이에 있는 주소 변환 캐시)
    • 스와핑
      • 페이지 폴트: 가상 메모리에 존재하지만 실제 메모리인 RAM에 없는 데이터나 코드에 접근할 때 발생
      • 스와핑: 메모리에서 당장 사용하지 않는 영역을 하드 디스크로 옮기고, 하드디스크의 일부분을 마치 메모리처럼 불러와 쓰는것
      • → 페이지 폴트가 일어나지 않은 것처럼 만듦
  • 스레싱 thrashing
    • 메모리의 페이지 폴트율이 높은 것을 의미
    • 컴퓨터의 심각한 성능 저하 초래
    • 메모리에 너무 많은 프로세스가 동시에 올라가면 스와핑이 많이 일어나서 발생
    • 구체적으로)
      • 악순환: 페이지 폴트 → CPU 이용률 낮아짐 → 운영체제는 가용성을 더 높이기 위해 더 많은 프로세스를 메모리에 올림 → 스레싱
    • 해결 방법: 메모리 늘리거나, HDD가 아닌 SSD를 사용하는 것, 작업 세트와 PFF
      • 작업세트: 프로세스의 과거 사용 이력인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드하는 것
      • PFF: 페이지 폴트 빈도 조절하는 방법, 상한선과 하한선 만드는 방법
  • 메모리 할당
    • 메모리에 프로그램 할당 시, 시작 메모리 위치, 메모리의 할당 크기를 기반으로 할당
    • 연속 할당, 불연속 할당
    • 연속 할당
      • 메모리에 연속적으로 공간을 할당하는 것 (순차적으로)
      • 고정 분할 방식: 메모리를 미리 나누어 관리
      • 가변 분할 방식: 매 시점 프로그램의 크기에 맞게 메모리를 분할하여 사용 (최초적합, 최적적합, 최악적합)
    • 불연속 할당
      • 페이징, 세그멘테이션, 페이지드 세그멘테이션
      • 페이징 paging: 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당
      • 세그멘테이션 segmentation: 페이지 단위가 아닌 의미 단위인 세그먼트로 나누는 방식
        • 프로세스를 이루는 메모리: 코드 영역, 데이터 영역, 스택 영역, 힙 영역
        • 코드와 데이터로 나누거나
        • 코드 내의 작은 함수를 세그먼트로 놓고 나누기 가능
        • (장점) 공유, 보안 측면
        • (단점) 홀 크기 균일 X
      • 페이지드 세그멘테이션: 프로그램을 의미 단위인 세그먼트로 나누고, 임의의 길이가 아닌 동일한 크기의 페이지 단위로 나누는 것
  • 페이지 교체 알고리즘
    • 메모리 한정 → 스와핑 다수 발생 → 일어나지 않도록 설계 필요 → 페이지 교체 알고리즘
    • 오프라인 알고리즘
      • 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘
      • 가장 좋은 알고리즘이지만, 미래 사용하는 프로세스 모름 → 사용 불가한 알고리즘
      • 다른 알고리즘과의 성능 비교에 대한 상한 기준 upper_bound을 제공
    • FIFO First In First Out: 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법
    • LRU Least Recentle Used: 참조가 가장 오래된 페이지를 바꿈
      • 구현 시, 두 개의 자료 구조로 구현 = 해시 테이블, 이중 연결 리스트
      • 해시 테이블: 이중 연결 리스트에서 빠르게 찾을 수 있게
      • 이중 연결 리스트: 한정된 메모리
    • NUR Not Used Recently
      • LRU 에서 발전
      • 일명 clock 알고리즘
      • 0과 1을 가진 비트 사용, 1은 최근 사용, 0은 참조되지 않음을 의미
      • 시계 방향으로 돌면서 0을 찾고 0을 찾은 순간 해당 프로세스를 교체, 해당 부분을 1로 바꾸는 알고리즘
    • LFU Least Frequently Used: 가장 참조 횟수가 적은 페이지를 교체