오늘 알아볼 것은 메모리 관리입니다
메모리란?
메모리란 쉽게 말하자면 주 기억장치인 RAM과 보조 기억장치(SSD, 하드 드라이브)를 의미한다.
프로그램을 실행할 때 필요한 주소, 정보를 저장하거나, 가져다 작업을 수행할 수 있도록 해주는 공간을 뜻한다.
가상메모리란?
컴퓨터가 실행되며 프로그램을 시작하면 프로그램은 메모리에 올라가 작동되기 시작한다.
이때 모든 데이터를 한 번에 메모리에 올리는 것은 쉽지 않은데, 이때 사용되는 것이 가상메모리 라고 할 수 있다.
가상메모리는 부족한 물리메모리를 가상메모리를 만들어 사용하는 것이다.
하지만 여기서 가상은 없는 것을 만들어내는 것이 아닌 이미 있는 것을 다르게 사용한다는 의미이며,
가상메모리의 실제 공간은 기존의 하드디스크 + RAM이 된다고 할 수 있다.
운영체제가 가상메모리 공간을 프로세스에게 제공해 주면서 프로세스는 자신이 모두 물리메모리 공간에 적재됐다고 인식하는 것이다.
또한 운영체제는 가상메모리의 프로세스 부분이 실제로 물리메모리에 적재가 필요하다면 물리메모리 공간과 변경(swap) 해준다.
프로세스의 모든 코드가 물리메모리에 한 번에 올라가 실행되는 일은 없다는 걸 알 수 있다.
메모리 관리자
위 내용처럼 프로세스는 필요한 부분만 물리메모리에 올려 실행시킨다.
하지만 프로세스를 어떻게 쪼개서, 어떻게 물리메모리에 적재시키고, 물리메모리가 꽉 차게 되면 어떻게 해야 할지 생각해 볼 수 있는데,
이를 담당해 주는 것이 메모리 관리자의 역할이다.
메모리 관리자가 하는 일은 대표적으로 가져오기(fetch), 배치, 재배치 세 가지로 나눌 수 있다.
가져오기(fetch)
프로세스가 필요로 하는 데이터를 언제 메모리로 가져올지 결정하는 정책으로, 프로세스는 필요한 코드와 데이터를 필요한 순간에 메모리에 불러와 사용하는데,
이 과정에서 데이터를 효율적으로 관리하기 위해 캐싱이 사용됩니다.
(캐싱이란? 파일 복사본을 캐시 또는 임시 저장 위치에 저장하여 보다 빠르게 액세스 할 수 있도록 하는 프로세스를 의미한다.)
배치(메모리 분할 방식)
가져온 프로세스 조각을 메모리 내 어떤 위치에 할당할지 결정하는 정책은 상당히 중요합니다. 프로세스 조각의 크기는 각기 다를 수 있기 때문에,
메모리를 효율적으로 활용하려면 적절한 위치에 조각을 할당하는 방법이 필요합니다.
배치의 두 가지 주요 기법으로는 페이징(paging)과 세그먼테이션(sagmentation)이 있으며, 방식의 차이는 다음과 같습니다.
페이징:메모리를 일정한 크기로 나누고, 각각의 조각을 이 크기에 맞게 잘라 할당하는 방식
= 페이지를 독립적으로 처리할 수 있기 때문에 메모리의 효율성을 높여준다.
세그먼테이션:프로세스를 논리적인 단위로 나누고, 이를 메모리에 할당할 때 크기를 맞춰 자르는 방식
=프로세스의 논리적인 구조를 유지하면서 메모리를 효율적으로 활용할 수 있도록 도와준다.
재배치(요구 페이징)
앞서 나온 내용처럼 프로세스의 특정 부분반 올라와서 메모리에 적재되게 되는데, 프로세스가 작동하며 특정모듈이 필요하게 될 경우,
메모리에 해당 모듈을 요청하는 것을 요구 페이징이라고 한다.
페이지 폴트는 메모리에 모듈이 없어서 스왑 영역에서 가져와야 할 때 발생하는데, 로딩시간으로 인한 불편을 줄이려면
미리 사용될 가능성이 높은 프로세스 모듈을 스케줄링하여 미리 메모리에 적재해놔야 한다.
이때 중요 기준은 지역성으로, 공간의 지역성, 시간의 지역성으로 나뉜다.
공간의 지역성: 현재 접근했던 데이터에서 가까운 위치의 데이터에 더 접근할 확률 높다.
시간의 지역성: 가까운 시간대에 접근했던 데이터가 더 먼 시간에 접근했던 데이터 보다 접근할 확률이 높다.
이러한 지역성을 고려한다면 페이지 폴트로 인한 성능저하를 최소화시킬 수 있다.
(페이지 폴트: 메모리에 해당 모듈이 적재되지 않고, 스왑 영역에 해당 모듈이 있는 경우)
'OS' 카테고리의 다른 글
리눅스 기본 명령어 (1) | 2023.11.20 |
---|---|
캐시와 버퍼 (0) | 2023.11.18 |
파일 시스템 (0) | 2023.11.14 |
프로세스와 스레드 (0) | 2023.11.09 |
컴퓨터 구조의 시작 (0) | 2023.11.08 |