운영체제 - 메모리 : 메모리의 계층, 메모리 관리

Dohyeon Kong·2024년 9월 29일
0

OS🏷️

목록 보기
2/4
post-thumbnail

2. 메모리

CPU는 단지 메모리에 올라와 있는 프로그램들의 명령어들을 실행하는 역할을 수행한다. 그렇기 때문에 우리는 메모리에 대해서 조금 더 자세히 알 필요가 있다!! 😲
이번 포스트에서는 메모리가 어떠한 계층으로 구성이 되어있는지 또한 메모리를 어떻게 관리하는지에 대해서 알아보도록 하자!

2-1. 메모리의 계층(Memory hierarchy)

메모리의 계층은 다음과 같이 레지스터, 캐시, 주기억장치, 보조기억장치로 구성되어 있다.
계층 위로 올라갈수록 가격은 비싸지지만 용량은 작아지고 속도가 빨라지며, 계층 아래로 내려갈 수록 가격은 저렴해지고 용량은 커지는 반면에 속도가 느려지는 점이 있다.

레지스터, 캐시, 주기억장치(RAM), 전력이 공급되지 않으면 내용이 저장되지 않는 휘발성의 특성을 가지고 있지만 보조기적장치는 비휘발성의 특성을 가지고 있다.

캐시(Cache)

캐시(Cache)는 데이터를 미리 복사해 놓는 임시 저장소이자 빠른 장치와 느린장치에서의 속도 차이에 따른 병목 현상을 줄여주는 메모리

  • 데이터를 접근하는 시간이 오래 걸리는 경우를 해결해주며 무언가를 다시 계산하는 시간을 절약해준다.

메모리와 CPU 사이의 속도 차이가 너무 크게 나기 때문에 중간에 레지스터 계층을 둬서 속도 차이를 해결하려고 한다. 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층을 캐싱 계층이라고 한다. 예를 들어, 캐시 메모리와 보조기억장치 사이에 있는 주기억장치를 보조기억장치의 캐싱 계층이라고 한다.

지역성의 원리(Locality)

캐시 계층을 두는 것 말고 캐시를 직접 설정할 때는 자주 사용하는 데이터를 기반으로 설정하는데, 자주 사용하는 데이터를 구분할 때는 지역성을 기반으로 설정한다.

지역성(Locality)는 크게 시간 지역성(temporal locality)공간 지역성(spatial locality)로 나뉘어 진다.

  • 시간 지역성(temporal locality)은 최근 사용한 데이터에 다시 접근하려는 특성을 의미한다.
  • 공간 지역성(spatial locality)은 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성을 의미한다.

캐시히트(Cache Hit)와 캐시미스(Cache Miss)

캐시 메모리에서 원하는 데이터를 찾아오는 것을 캐시히트(Cache Hit), 원하는 데이터를 찾이 못하여 주기억장치로 가서 데이터를 찾아오는 것을 캐시미스(Cache Miss)라고 한다.

캐시히트를 하게 되면 해당 데이터를 제어장치를 거쳐서 가져오게 되는데 위치도 가깝고 CPU 내부 버스를 기반으로 작동하기 때문에 빠르다.
하지만 캐시미스가 발생하게 되면 메모리에서 가져오며 시스템 버스를 기반으로 작동하기 때문에 느리다.


캐시매핑(Cache Mapping)

캐시매핑이란 캐시가 히트되기위해 매핑하는 방법

  • CPU의 레지스터와 주메모리(RAM)간에 데이터를 주고받을 때 기반으로 한다.
캐시매핑의 분류
이름설명
직접 매핑(directed mapping)메모리의 각 블록은 고정된 하나의 캐시 블록에만 저장될 수 있는 방식
연관 매핑(associate mapping)메모리 블록이 캐시의 어느 블록에나 저장될 수 있는 방식
집합 연관 매핑(set associate mapping)직접 매핑과 연관 매핑의 절충 방식으로, 캐시를 여러 세트(Set)로 나누고, 각 세트 내에서는 연관 매핑이 적용되는 방식

웹 브라우저의 캐시

소프트웨어적인 대표적인 캐시가 있는데 바로 웹브라우저의 캐시이다.

웹 브라우저의 작은 저장소는 쿠키, 로컬 스토리지, 세션 스토리지가 있으며, 보통 사용자의 커스텀한 정보나 인증 모듈 관련 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 식별자나 중복 요청 방지를 위해 쓰인다. 이러한 캐시는 오리진(origin)에 종속된다.


📢 웹 브라우저의 저장소쿠키, 로컬 스토리지, 세션 스토리지로 구성된다!

1. 쿠키(Cookie)

쿠키(Cookie)는 만료기한이 있는 Key-Value 저장소

  • same site 옵션을 strict로 설정하지 않았을 경우 다른 도메인에서 요청했을 때 자동 전송되며, 4KB까지 데이터를 저장할 수 있고 만료기한을 정할 수 있다.
  • 쿠키를 설정할 때는 document.cookie로 쿠키를 볼 수 없게 httponly 옵션을 거는 것이 중요하며, 서버에서 만료기한을 정한다.

2. 로컬 스토리지(Local Storage)

로컬 스토리지(Local Storage)는 만료기한이 없는 Key-Value 저장소

  • 5MB까지 저장할 수 있으며 웹 브라우저를 닫아도 유지가 된다.
  • HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없다.
  • 클라이언트에서만 수정이 가능하다.

3. 세션 스토리지(Session Storage)

세션 스토리지(Session Storage)는 만료기한이 없는 Key-Value 저장소

  • 탭 단위로 세션 스토리지를 생성하며, 탭을 닫을 때 해당 테이터가 삭제된다.
  • 5MB까지 저장이 가능하며 HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없다.
  • 클라이언트에서만 수정이 가능하다.

4. Redis

메인 데이터베이스 위에 레디스(Redis) 데이터베이스 계층을 캐싱 계층으로 둬서 성능을 향상시킨다.


2-2. 메모리의 관리(Memory Management)

메모리 관리는 한정된 물리적 메모리 자원을 효율적으로 사용하기 위해 다양한 기법들을 사용하는 중요한 운영체제 기능이며 메모리 관리의 핵심 기법으로는 가상 메모리(Virtual Memory), 메모리 할당(Memory Allocation), 그리고 페이지 교체 알고리즘(Page Replacement Algorithm)이 있다.

1. 가상 메모리(Virtual Memory)

가상 메모리(Virtual Memory)는 메모리 관리 기법의 하나로 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하는 기법

  • 가상적으로 주어진 주소를 가상 주소(Logical Address)라고 하며, 실제 메모리 상에 잇는 주소를 실제 주소(Physical Address)라고 한다.
  • 가상 주소는 메모리관리장치(MMU)에 의해 실제 주소로 변환이 되며, 메모리관리장치 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 된다.

가상 메모리는 가상 주소와 실제 주소가 매핑되어 있고 프로세스의 주소 정보가 들어있는 '페이지 테이블'로 관리된다. 속도 향상을 위해서는 TLB를 사용한다.

📢 TLB는 메모리와 CPU 사이에 있는 주소 변환을 위한 캐시이며 페에지 테이블에 있는 리스트를 보관하며 CPU가 페이지 테이블까지 가지 않도록 해 속도를 향상시킬 수 있는 캐시 계층

가상 메모리에서 일어나는 현상에는 스와핑(Swapping)페이지 폴트(Page Fault)가 존재하는데 두 개념은 가상 메모리에서 메모리를 효율적으로 관리하고 물리 메모리(RAM)의 한계를 보완하기 위해 중요한 역할을 한다.


1-1. 스와핑(Swapping)

스와핑(Swapping)은 메모리에서 당장 사용하지 않는 영역을 하드 디스크로 옮기고 하드디스크의 일부분을 마치 메모리처럼 불러와 사용하는 것을 의미한다.

  • 페이지 폴트가 일어나지 않는 것처럼 만든다.

여기서 말하는 페이지 폴트(Page Fault)라는 것이 무엇일까?🤔
한번 알아보자 !!


1-2. 페이지 폴트(Page Fault)

페이지 폴트(Page Fault)는 프로세스의 주소 공간에는 존재하지만, 실제 물리적 메모리(RAM)에는 없는 데이터에 접근하려고 할 때 발생하는 현상

페이지 폴트와 그로 인해 발생하는 스와핑의 과정

  1. 어떤 명령어가 유효한 가상 주소에 접근했으나 해당 페이지가 만약 없다면 트랩(SW Interrupt)가 발생하게 되어 운영체제에게 알린다.
  2. 운영체제는 실제 디스크로부터 사용하지 않은 프레임을 찾는다.
  3. 해당 프레임을 실제 메모리에 가져와서 페이지 교체 알고리즘을기반으로 특정 페이지와 교체한다. ➡️ 스와핑이 발생한다.
  4. 페이지 테이블을 갱신시킨 후 해당 명령어를 다시 시작한다.

📢 페이지(Page)는 가상 메모리를 사용하는 최소 크기 단위, 프레임(Frame)은 실제 메모리를 사용하는 최소 크기 단위


스레싱

스레싱(Thrashing)메모리의 페이지 폴트율(Page Fault Rate)이 높은 것

  • 스레싱이 많이 발생하게 되면 컴퓨터의 심각한 성능 저하가 발생한다.
  • 스레싱이 발생하는 이유는 페이지 폴트가 일어나면 CPU 이용률이 낮아지고, CPU 이용률이 낮아지면 운영체제가 CPU가 한가하다고 인식하여 가용성을 더 높이기 위해 메모리에 더 많은 프로세스를 올리게 된다.
  • 이러한 현상이 반복되면 스레싱이 발생하게 되는 것이다.

해결방안🤓
메모리(RAM)을 늘리든가, 보조기억장치가 HDD이면 SSD로 바꾸는 물리적으로 해결하는 방법과 운영체제에서 해결할 수 있는 작업 세트(Working Set)와 PFF가 있다.

작업 세트(Working Set)

작업 세트는 프로세스의 과거 사용 이력인 지역성을 토앻 결정된 페이지 집합을 만들어서 미리 메모리에 로드하는 방법

  • 미리 로드하게 되면 탐색에 드는 비용을 줄일 수 있고 스와핑 또한 줄일 수 있다는 점이 있다.

PFF(Page Fault Frequency)

PFF는 이름 그대로 페이지 폴트 빈도를 조절하는 방법으로서 상한선과 하한선을 만드는 방법

  • 상한선에 도달하게 된다면 프레임을 늘리고 하한선을 도달하게 된다면 프레임을 줄이는 방법이다.

2. 메모리 할당(Memory Allocation)

메모리에 프로그램을 할당할 때 시작 메모리의 위치와 메모리의 할당 크기를 기반으로 할당을 진행하는데 할당은 연속 할당(Contiguous Allocation)불연속 할당(Noncontiguous Allocation)으로 나뉜다.

2-1. 연속 할당(Contiguous Allocation)

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

  • 연속 할당에는 메모리를 미리 나누어 관리하는 고정 분할 방식(Fixed Partition Allocation)과 매 시점 프로그램의 크기에 맞게 메모리를 분할하여 사용하는 가변 분할 방식(Variable Partition Allocation)이 있다.

고정 분할 방식은 메모리를 미리 나누어 관리하는 방식이기 때문에 융통성이 존재하지 않아 내부 단편화가 발생한다.
가변 분할 방식은 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용하기 때문에 내부 단편화가 발생하지 않지만 외부 단편화가 발생할 수 있다. ➡️ 가변 분할 방식에는 최초 척합(First Fit), 최적 적합(Best Fit), 최악 적합(Worst Fit)이 존재한다.

가변 분할 방식 종류

이름설명
최초 적합(First Fit)위쪽이나 아래쪽부터 시작해서 홀(할당할 수 있는 비어 있는 메모리 공간)을 찾으면 바로 할당
최적 적합(Best Fit)프로세스의 크기 이상인 공간 중 가장 작은 홀부터 할당
최악 적합(Worst Fit)프로세스의 크기와 가장 많이 차이가 나는 홀에 할당


2-2. 불연속 할당(Noncontiguous Allocation)

메모리를 연속적으로 할당하지 않는 불연속 할당은 현대 OS에서 많이 쓰이는 방법인 페이징(Paging) 기법세그멘테이션(Segmentation) 기법, 페이지드 세그멘테이션(Paged Segmentation) 기법으로 구성되어 있다.

페이징(Paging) 기법

메모리를 고정된 크기의 페이지(Page) 단위로 나누고, 프로세스를 이 페이지 단위로 나누어 메모리의 서로 다른 위치에 할당하는 기법

페이징 기법은 외부 단편화를 해결하는 데 유리하며 메모리가 고정된 크기의 페이지로 나누어지기 때문에 프로세스는 어디든 빈 페이지 프레임에 할당될 수 있다. 또한, 효율적인 메모리를 사용할 수 있는데 페이지 크기가 동일하므로, 메모리 사용이 효율적이기 때문이다.
하지만 가상 주소를 물리 주소로 변환하는 작업(페이지 테이블을 통한 주소 매핑)이 추가되어 주소 변환이 복잡해질 수 있다.

세그멘테이션(Segmentaion) 기법

메모리를 고정된 크기가 아닌, 의미 있는 단위로 나누어 할당하는 기법

  • 세그먼트(Segment)는 논리적인 단위로, 코드, 데이터, 스택 등을 구분하여 메모리에 저장하는 단위이다.
  • 코드와 데이터로 나누거나 코드 내의 작은 함수를 세그먼트로 놓고 나눌 수 있다. 이는 공유와 보안 측면에서 장점을 가지지만 홀 크기가 균일하지 않은 단점이 있다.
  • 세그먼트 크기가 다르므로, 메모리 공간에 외부 단편화가 발생할 수 있다. 즉, 남는 메모리 공간이 프로세스의 세그먼트 크기와 맞지 않는 경우가 생길 수 있다(=외부 단편화 발생)

페이지드 세그멘테이션(Paged Segmentation) 기법

세그멘테이션과 페이징 기법을 결합한 방식으로, 프로그램을 의미 있는 단위(세그먼트)로 나눈 뒤, 각 세그먼트를 다시 고정된 크기의 페이지로 나누어 메모리에 할당하는 기법

세그먼트를 통해 코드, 데이터 등의 논리적인 단위를 유지하여 공유 및 보안 측면에서 장점을 유지할 수 있는 세그멘테이션의 장점과 고정된 크기의 페이지 단위로 나누어 외부 단편화 문제를 완화하고, 메모리 관리가 효율적인 페이징의 장점을 가지고 있다.


3. 페이지 교체 알고리즘(Page Replacement Algorithm)

가상 메모리 시스템에서 페이지 폴트(Page Fault)가 발생할 때, 물리적 메모리(RAM)가 꽉 차서 더 이상 페이지를 저장할 공간이 없을 경우, 어느 페이지를 교체할지 결정하는 알고리즘

  • 페이지 교체 알고리즘은 페이지 폴트의 빈도를 최소화하여 메모리 사용을 최적화하고 성능을 향상시키는 것이다.

2-1. 페이지 교체 알고리즘의 종류

  • 오프라인 알고리즘(Offline Algorithm)
  • FIFO(Fisrt In First Out)
  • LRU(Least Recently Used)
  • NUR(Not Used Recently)
  • LFU(Least Frequently Used)

오프라인 알고리즘(Offline Algorithm)은 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘으로, 가장 좋은 방법이지만 미래에 사용되는 프로세스를 알지 못하기 때문에 사용할 수 없다. 단지, 다른 알고리즘과의 성능 비교에 대한 상한 기준(Upper_Bound)를 제공해준다.

FIFO(First In First Out)는 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방식이며, 구현이 간단하다. 하지만 최근에 자주 사용된 페이지라도 먼저 들어왔다는 이유로 교체될 수 있어 비효율적일 수 있다. 페이지 프레임 수를 늘려도 페이지 폴트가 증가할 수 있는 문제인 Belady의 역설이 발생할 수 있다.

LRU(Least Recently Used)는 참조가 가장 오래된 페이지를 바꾸는 방식, 각 페이지가 마지막으로 참조된 시간을 기록하고 가장 오랫동안 참조되지 않은 페이지를 교체하는 방식이며 오래된 것을 파악하기 위해 각 페이지 마다 계수기, 스택을 두어야 하는 점이 발생한다. LRU는 해시 테이블과 이중 연결 리스트로 구현한다.

NUR(Not Used Recently)는 일명'Clock 알고리즘, Second Chance 알고리즘'이라고도 불리며 LRU에서 발전한 알고리즘으로써, LRU보다 구현이 더 간단하고 하드웨어 부담이 적다. 이러한 NUR은 참조 비트(Reference Bit)수정 비트(Modified Bit)를 사용하여 페이지 교체를 결정합니다.

LFU(Least Frequently Used)가장 적게 사용된 페이지를 교체하는 방식으로써, 각 페이지가 얼마나 자주 참조되었는지 기록하고, 참조 횟수가 가장 적은 페이지를 교체한다. 이러한 LFU는 자주 사용되는 페이지는 오래 유지되므로 효율적일 수 있지만 참조 횟수를 기록하는 데 추가 비용이 들며, 오래된 페이지가 한 번 참조된 경우 자주 사용되지 않더라도 계속 남아 있을 수 있다.

profile
티스토리로 기술 블로그 이전

0개의 댓글