가상 메모리
가상 메모리는 메모리 관리 기법의 하나로 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말한다.
이때 가상적으로 주어진 주소를 가상 주소(logical address)라고 하며, 실제 메모리상에 있는 주소를 물리 주소(physical address)라고 한다.
가상 주소는 메모리관리장치(MMU)에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 된다.
물리 메모리를 사용하는 최소 크기 단위를 프레임(frame)이라고 하고 가상 메모리를 사용하는 최소 크기 단위를 페이지(page)라고 한다.
스와핑(Swapping)
만약 가상 메모리에는 존재하지만 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생한다. 이때 메모리에서 당장 사용하지 않는 영역을 하드디스크로 옮기고 하드디스크의 일부분을 마치 메모리처럼 불러와 쓰는 것을 스와핑(swapping)이라고 한다.
이때 디스크로 내보내는 것은 swap out, 메모리로 들여보내는 것은 swap in이라고 한다.
페이지 폴트(page fault)
페이지 폴트(page fault)란 프로그램이 프로세스의 주소 공간에는 존재하지만 RAM에는 없는 데이터에 접근 시도할 경우 발생하는 현상이다.
페이지 폴트와 그로 인한 스와핑은 다음 과정으로 이루어진다.
- CPU는 물리 메모리를 확인하여 해당 페이지가 없으면 트랩을 발생해서 운영체제에 알린다.
- 운영체제는 CPU의 동작을 잠시 멈춘다.
- 운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인하고, 없으면 프로세스를 중단하고 현재 물리 메모리에 비어 있는 프레임이 있는지 찾는다. 물리 메모리에도 없다면 스와핑이 발동된다.
- 비어 있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화한다.
- 중단되었던 CPU를 다시 시작한다.
스레싱(thrashing)
사용하는 프로세스가 많아질 때 어느 한계점 까지는 CPU이용률이 증가하다가 한계점 이상부터는 CPU 이용율이 떨어지게 되는데 이때 사용량이 떨어지는 이유 중 하나가 스레싱때문이다.
스레싱(Thrashing)이란 페이지 폴트가 증가하여 CPU 이용률이 급격하게 떨어지는 현상을 얘기한다.
스레싱이 발생하는 이유는 프로세스를 처리하는 시간보다 메모리에 적재되지 못한 페이지로 인하여 페이지 교체에 드는 시간이 증가하게 되고 그러 인해 CPU이용률이 떨어지게 된다.
해결 방법
Working Set
지역성의 원리를 이용하여 지역성 집합이 메모리에 동시에 올라갈 수 있도록 보장하는 메모리 관리 방법이다.
워킹 셋이라는 이름과 같이 프로세스의 작업을 구성하는 자주 참조되는 페이지들을 묶는다고 생각하면 이해하기 좀 더 편하다. 해당 워킹 셋의 합인 전체 프레임이 할당된 페이지 프레임보다 크게 되면 스레싱이 발생하게 된다.
PFF(Page Fault Frequency, 페이지 부재 빈도)
프로세스의 페이지 부재율을 주기적으로 조사하고 이 값에 근거하여 각 프로세스에 할당할 메모리 양을 동적으로 예측하고 조절하는 알고리즘이다. 현재 페이지 부재와 직전 페이지 부재 사이의 시간을 관찰하여 상한 값(upper bound)을 초과하거나 하한 값(lower bound) 미만이 되면 운영체제가 메모리에 올라가 있는 프로세스 수를 조절한다.
메모리 할당
메모리에 프로그램을 할당할 때는 시작 메모리 위치, 메모리의 할당 크기를 기반으로 할당하는데
연속 메모리 할당과 불연속 메모리 할당으로 나뉜다.
연속 메모리 할당(contiguous memory allocation)
연속 메모리 할당은 연속된 하나의 큰 메모리에서 프로세스에 메모리를 할당시켜 주는 방법이다.
Contiguous Allocation에서 메모리를 분할하는 각 단위는 Block이고, 프로세스가 사용할 수 있는 Block을 Hole이라고 한다.
다양한 크기의 Hole들이 메모리 여러 곳에 흩어져 있고, 프로세스가 도착하면 수용 가능한 Hole을 할당시켜 준다.
- 고정크기 메모리할당 : 메모리를 고정된 크기로 나누고 프로세스를 할당시켜 준다.
- 가변크기 메모리할당 : 프로세스마다 요구되는 메모리 크기에 맞춰서 메모리를 할당시켜 준다.
이러한 두 가지 방법에는 단편화(fragmetation)라는 문제가 발생한다.
단편화란 연속된 큰 하나의 메모리상에서 메모리가 할당될 크기는 아니지만, 메모리가 존재하는 공간이 생겨 프로세스가 할당되지 못하는고 낭비되는 메모리 공간이 생기는 문제이다.
내부 단편화
메모리 내 사용자 영역이 실행 프로그램보다 커서 프로그램의 사용 공간을 할당 후 사용되지 않고 남아있는 공간을 의미한다.
고정크기 메모리할당의 경우 메모리를 고정된 크기로 나누기 때문에 해당 크기보다 프로세스가 더 작은 경우 내부 단편화가 발생한다.
외부 단편화
주기억장치 내 사용자 영역보다 실행 프로그램이 커서 프로그램이 할당될 수 없어 사용되지 않고 남아있는 공간을 의미한다.
가변크기 메모리할당은 메모리를 여러 크기로 나눈 후 남은 공간이 프로세스보다 더 작은 경우 프로세스가 할당될 수 없어 외부 단편화가 발생한다.
단편화 해결 방법
- 집약(coalescing) : 현재 위치의 메모리에서 단편화 메모리들끼리 인접해 있는 경우 이를 하나의 큰 메모리로 만들어준다.
- 압축(compaction) : 비연속적으로 존재하는 단편화 메모리들을 메모리 재배치를 통해 하나의 연속된 큰 메모리로 만들어 준다.
불연속 메모리 할당은 다음 포스팅에서 다루도록 하겠다!
참고 자료
https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EB%A9%94%EB%AA%A8%EB%A6%AC
https://product.kyobobook.co.kr/detail/S000001834833
https://velog.io/@anjaekk/OS-Thrashing
https://jwprogramming.tistory.com/56
https://chelseashin.tistory.com/41
'백엔드 > 운영체제' 카테고리의 다른 글
[운영체제] 운영체제(OS) 메모리 관리 - (1) 불연속 메모리 할당, 페이징 (0) | 2023.04.27 |
---|---|
[운영체제] 캐시(Cache) (2) | 2023.04.25 |
[운영체제] 메모리 계층 구조 (Memory Hierarchy) (0) | 2023.04.25 |
[운영체제] 운영체제(OS), 시스템 콜(System Call) (0) | 2023.04.25 |
[운영체제] 세마포어(semaphore) 뮤텍스(mutex) 모니터(Monitor) (0) | 2023.04.24 |