[CS] OS - 메모리
메모리 계층
메모리계층은 레지스터, 캐시, 메모리, 저장장치로 구성되어 있다.
각각의 특징은 다음과 같다.
레지스터 : CPU안의 작은 메모리, 휘발성, 속도 가장 빠름, 용량 가장 적음
캐시 : L1, L2 캐시를 지칭한다. 휘발성, 속도 빠름, 용량 적음
주기억장치 : RAM을 가리킨다. 휘발성, 속도 보통, 용량 보통
보조기억장치 : HDD, SSD를 일컬으며, 비휘발성, 속도 낮음, 용량 큼
계층의 위로올라갈수록 가격은 비싸지고, 속도는 빨라지고, 용량은 적어지는 특징을 갖고 있다.
이러한 계층이 존재하는 이유는 경제성과 캐시 때문이다.
캐시
캐시는 데이터를 미리 복사해 놓는 임시 저장소이다.
빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말한다.
예로, 메모리와 CPU 사이의 속도차이가 크기때문에,
중간의 레지스터 계층을 두고 속도차이를 해결한다.
이렇게 속도차이를 해결하기 위해 계층과 계층 간에 있는 계층을 캐싱 계층이라 한다.
위의 그림을 다시 보면 캐시와 보조기억 장치 사이에 있는 주기억 장치가 보조기억 장치의 캐싱 계층이라 할 수 있다.
지역성
캐시는 속도는 빠르지만 용량은 적다.
데이터를 미리 복사해 놓는 곳이라고 했지만,
적은 용량 때문에 모든 데이터를 저장할 수는 없다.
(정확하게는 엄청 큰 용량을 사용하기엔 비용이 너무 많이 든다..)
파레토의 법칙에 따라 특정 데이터를 선별하여 저장해야하는데,
저장할 데이터와 저장하지 않을 데이터를 선별하는 기준이 지역성이다.
파레토의 법칙
전체 결과의 80%는 상위 20%에 의해 발생한다는 법칙
ex) 잘팔리는 상품 20%가 전체 매출의 80%를 차지한다.
시간 지역성
시간 지역성을 최근 사용한 데이터에 다시 접근하려는 특성을 말한다.
예를 들어 for 반복문에서 조건변수(int i = 0;)를 선언 했을 때,
이 조건 변수 i
는 for문이 끝나기 전까지 계속 쓰일 확률이 높다.
공간 지역성
공간 지역성은 최근 접근한데이터를 이루고 있는 공간이나, 그 가까운 공간에 접근하는 특성을 말한다.
예를 들어 for문에서 어떠한 배열에 접근한다고 하면,
해당 for문이 끝나기 전까지 배열의 메모리주소는 계속 쓰일 확률이 높다는 것을 의미한다.
캐시히트와 캐시미스
CPU가 값을 가져오려고 할 때, 캐시에서 원하는 데이터를 찾았다면 캐시히트,
해당 데이터가 캐시에 없다면 주메모리로 가서 데이터를 찾아오는 것을 캐시미스 라고 한다.
캐시매핑
캐시가 히트되기 위해 매핑하는 방법을 말한다.
직접매핑(directed mapping)
메모리가 1-100이 있고 캐시가 1-10이 있다면,
1:1-10, 2:1-20 ... 이런 시긍로 매핑 되는 것을 말한다.
처리가 빠르지만, 충돌 발생이 잦고 적중률이 낮다.연관매핑(associative mapping)
직접매핑의 단점을 보완하기 위해 만들어짐.
메인 메모리의 순서와은 아무런 상관없이, 관련이 있는 캐시와 메모리를 매핑한다.
따라서 모든 캐시를 전부 뒤져서 같은 데이터가 확인해야 하는데,
이에 따라 적중률은 높지만, 처리속도가 느리다.집합 연관 매핑(set associative mapping)
직접 매핑의 단순한 회로, 연관 매핑의 적중률 두개의 장점만을 취한 방식이다.
웹브라우저의 캐시
소프트웨어의 대표적인 캐시의 예시로는 웹브라우저의 쿠키, 로컬스토리지, 세션이 있다.
쿠키
쿠키는 만료 기한이 있는 key-value 저장소 이다.
4KB 까지 데이터를 저장할 수 있고, 만료기한을 정할 수 있다.
httponly 설정을 통해 XSS 공격에 대비하는 것이 중요하다.
또한, secure 설정을 통해 암호화 하여 탈취되더라도 쿠키의 내용을 알 수 없게끔 하여야한다.
로컬 스토리지
로컬 스토리지는 만료기한이 없는 key-value 저장소이다.
10M 까지 저장할 수 있고, 브라우저를 닫아도 유지된다.
HTML5를 지원하지 않는 브라우저에는 사용할 수 없다.
세션스토리지
세션스토리지는 만료기한이 없는 key-value 저장소이다.
탭 단위로 세션스토리지를 생성하며 탭을 닫을 때 세션이 날라간다.
5MB까지 저장가능하며, HTML5를 지원하지않는 브라우저에서는 사용할 수 없다.
REDIS
메모리를 사용하는 데이터베이스.
key-value 값으로 저장되며, 메인데이터 베이스 위에 캐싱계층으로 성능을 항상시킨다.
메모리에 데이터가 저장 되므로, 서버가 꺼지면 데이터가 다 날라간다.
메모리 관리
가상메모리
가상메모리는 메모리 관리 기법의 하나로 컴퓨터가 실제로 이용가능한 메모리자원을 추상화하여
이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말한다.
초창기 컴퓨터는 RAM의 용량이 애플리케이션의 주소공간 보다 커야만 애플리케이션을 실행할 수 있었다.
애플리케이션이 복잡해짐에 따라 메모리 용량은 계속 부족해짐에 따라,
물리 메모리 크기의 한계를 극복하기 나온 기술이다.
즉, 128MB 메모리로 256MB 크기의 프로세스를 돌리기 위한 기술.
물리적으로 말이 안되는 것 같지만,
어떤 프로세스가 실행될 때 해당 프로세스 전체가 메모리에 올라가지 않더라고 실행이 가능하기 때문에
실행에 필요한 일부분만 메모리에 올라가며 애플리케이션의 나머지는 디스크에 남게 된다.
-> 디스크가 메모리의 보조기억장치(backing store)처럼 작동한다.
가상 메모리의 기본개념은 프로세스는 가상주소를 사용하고,
데이터를 사용할 때는 물리주소로 변환 해주는 것.
가상 주소를 물리주소로 변환하는 기능은 MMU(Memory Management Unit) 가 수행한다.
가상 메모리는 가상 주소와 실제 주소가 매핑 되어있고,
프로세스의 주소정보가 들어있는 페이지 테이블로 관리한다.
이때 속도 향상을 위해 TLB를 사용한다.
TLB
MMU는 가상 주소 메모리 접근이 필요할 때, 해당 주소를 물리 주소 값으로 변환 해주는 장치이다.
하지만 매번 물리 주소를 확인 하기 위해 메모리를 왔다갔다하는 과정을 효율적으로 하기 위해 사용된다.최근에 물리주소로 변환된 가상 주소 정보를 저장하여, 페이지 정보를 캐시할 수 있는 하드웨어가 TLB이다.
페이지폴트 & 스와핑
페이지 폴트란 프로그램이 자신의 주소 공간(가상주소)에는 존재하지만 시스템의 RAM(실제주소)에는 현재 없는 데이터나 코드에 접근 시도하였을 경우 발생하는 현상을 말한다.
페이지폴트가 발생하면, 메모리에서 사용하지 않는 영역은 디스크로 옮기고,
디스크에서 해당 페이지(프레임)을 찾아 메모리로 가져와 쓰는 것을 스와핑 이라고 한다.
페이지폴트가 일어났을 때 스와핑이 되는 과정은 다음과 같다.
- CPU는 물리 메모리를 확인하여 해당 페이지가 없으면 트랩을 발생, 운영체제에 알림
- 운영체제는 CPU의 동작을 멈춤
- 운영체제가 가상메모리에 페이지가 존재하는지 확인하고 없으면,
프로세스를 중단, 물리 메모리에 비어있는 프레임이 있는지 찾는다.
없으면 스와핑이 발동 - 비어있는 프레임에 해당 페이지를 로드, 페이지테이블을 최신화.
- 중단되었던 CPU 다시 시작.
위와 같은 상황이 너무 자주 발생하면, CPU및 입/출력 작업을 무리하게 요구당하게 되고,
프로그램의 처리속도가 급격히 떨어진다.
이러한 현상을 스레싱(thrashing) 이라 하며, 이를 해결 하기위한 방법으로
작업세트와 PFF가 있다.
작업세트
프로세스의 과거 사용 이력인 지역성을 통해 결정된 페이지 집합을 만들어
미리 메모리에 로드하는 것.PFF
페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 만드는 방법이다.
상한선에 도달하면 프레임을 늘리고,
하한선에 도달하면 프레임을 줄인다.
메모리 할당
메모리에 프로그램을 할당할 때는 시작 메모리위치, 메모리의 할당 크기를 기바능로 할당하는데,
연속할당과 비연속 할당으로 나눠진다.
연속할당
연속할당은 메모리에 연속적으로 공간을 할당하는 것을 말한다.
메모리에 프로세스가 순차적으로 공간에 할당되는 것을 의미하며,
메모리르를 미리나누어 관리하는 고정 분할 방식과,
매 시점 프로그램의 크기에 맞게 메모리를 분할하여 사용하는 가변분할 방식이 있다.
고정분할 방식
메모리를 미리 나누어 관리하는 방식.
메모리가 미리 나뉘어져 있기 때문에 융통성이 없고, 내부 단편화가 발생한다.
내부 단편화
메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상
가변 분할 방식
매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용한다.
내부 단편화는 발생하지 않으나, 외부 단편화가 발생할 수 있다.
외부 단편화
메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하는 현상.
불연속 할당
현대 운영체제에서 사용되는 방식으로 페이징 기법이 있다.
메모리를 동일한 크기의 페이지로 나누고,
프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당한다.
이외에도 세그멘테이션, 페이지드 세그멘테이션이 있다.
페이지교체 알고리즘
메모리는 한정된 공간을 사용하기 때문에, 스와핑이 많이 일어나는데,
스와핑은 많이 일어나지 않는게 좋다. 이를 위해 페이지 교체 알고리즘이 사용된다.
오프라인 알고리즘
오프라인 알고리즘은 먼 미래에 참조되는 페이지와,
현재 할당하는 페이지를 바꾸는 알고리즘 이다.
미래에 어떤 페이지를 사용할지 알 수 없기에 사용되지 않지만,
다른 알고리즘과의 성능 비교를 위해 사용된다.
FIFO
FIFO는 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법을 의미 한다.
LRU
참조가 가장 오래된 페이지를 바꾼다.
오래된 것을 파악하기 위해 페이지마다 계수기와 스택을 두어야 하는 문제점이 있다.
NUR
LRU에서 발전한 방식.
clock 알고리즘이라고도 하며, 0과 1을 가진 비트를 둔다.
0은 참조되지 않음을, 1은 최근에 참조 되었음을 의미한다.
시계방향으로 돌며 0을 찾고, 0을 찾은 순간 해당 프로세스를 교체한뒤 1로 변경한다.
LFU
가장 참조횟수가 적은 페이지를 교체한다.
즉, 많이 사용되지 않은 것을 교체한다.