운영체제 메모리 관리 방법
캐시의 지역성
캐시 메모리는 속도가 빠른 장치와 느린 장치간의 속도차에 따른 병목 현상을 줄이기 위한 범용 메모리
CPU가 어떤 데이터를 원할 것인가를 어느정도 예측할 수 있어야 한다. 적중율을 극대화시키기 위해 데이터 지역성의 원리를 사용한다. 지역성의 전제조건으로 프로그램은 모든 코드나 데이터를 균등하게 Access 하지 않는다는 특성을 기본으로 한다.
메모리
메인 메모리는 CPU가 직접 접근할 수 있는 접근 장치
프로세스가 실행되려면 프로그램이 메모리에 올라와야 함
메인 메모리는 주소가 할당된 일련의 바이트들로 구성되어 있다.
- 논리적 주소: 주소 프로그램이 실행되는 동안 CPU에 의해 생성된 것[ 가상 주소 ] → 프로그램 상에서 사용자가 보는 주소 공간
→ MMU라는 하드웨어 장치에 의해 해당 물리적 주소에 매핑
→ MMU에서 사용되는 주소 바인딩 방법은 컴파일 타임 및 로드 시간 동안 동일한 논리 및 실제주소를 생성
→ 실행시간 동안 주소 바인딩 방법은 다른 논리 및 실제 주소를 생성
→논리 주소는 프로그램이 실행되는 동안 CPU에 의해 생성되는 반면 물리적 주소는 MMU (Memory Management Unit)에 의해 계산됩니다. - 물리적 주소: 메모리의 물리적 위치를 식별
→ 물리적 주소는 사용자에 의해 해당 논리 주소에 의해 액세스 됩니다. 사용자 프로그램은 논리주소를 생성하고 프로그램이 논리주소에서 실행되고 있다고 생각합니다. 그러나 이 프로그램은 실행을 위한 물리적 메모리 주소가 필요함.
TLB(MMU)
- CPU는 레지스터가 지시하는 대로 메모리에 접근하여 다음에 수행할 명령어를 가져온다.
- 명령어 수행시 메모리에 필요한 데이터가 없으면 해당 데이터를 우선 가져와야 한다
- 메모리 관리장치는 논리주소를 물리주소로 변환해준다.
→ 메모리의 공간이 한정적이기 때문에 사용자에게 더 많은 메모리를 제공하기 위해 가상 주소라는 개념이 등장함 - 가상 주소에서 실제 데이터가 담겨 있는 곳에서 접근하기 위해선 빠른 주소 변환이 필요한데, 이를 MMU가 도와주는것이다.
- 메인 메모리의 직접 접근은 비효율적이므로, CPU와 메인 메모리 속도를 맞추기 위해 캐시가 존재
메모리 할당 알고리즘
- 최초 적합: 가용공간 중 수용가능한 첫번째 기억공간을 할당하는 방법
- 최적 적합: 모든 공간 중에서 수용가능한 가장 작은 곳을 선택
가상 메모리: 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법
→ 가상 메모리는 물리 메모리로부터 사용자 관점의 논리 메모리를 분리시켜 주 메모리를 균일한 크기의 저장 공간으로 구성된 엄청나게 큰 배열로 추상화 시켜 준다.
→ 작은 메모리를 가지고도 큰 가상 주소 공간을 제공
요구페이징: 초기에 필요한 것들만 적재하고, 페이지들이 실행 과정에서 실제로 필요할 때 적재하는 기법이다.
페이지 부재(Page Fault): 프로세스(프로그램)가 메인 메모리(RAM)에 저장되지 않은 페이지를 사용하려는 현상 → 페이지 부재 트랩(page-fault trap)을 발생
페이지 교체: 페이지 부재가 발생하면 메인 메모리에 있으면서 사용하지 않는 페이지를 디스크로 내보내고 새로운 페이지로 바꾸는 과정
페이지 교체 알고리즘
- FIFO
- OPT
- LRU
- LFU
- MFU: 참조 회수가 가장 작은 페이지가 최근에 메모리에 올라왔고, 앞으로 계속 사용될 것이라는 가정에 기반
메모리 관리: 페이징
- 물리 메모리를 사용할 때, 페이지를 고정 크기의 프레임단위로 나눔
- 논리 메모리도 같은 프레임 단위인 페이지로 나누어 프레임과 페이지를 대응하게 함
- 연속적인 물리 메모리가 아니더라도 원하는 크기의 프레임을 사용할 수 있는 기능
프레임(Frame) : 물리 메모리를 일정한 크기로 나눈 블록
페이지(Page) : 가상 메모리를 일정한 크기로 나눈 블록
물리메모리(프레임)와 가상메모리(페이지)를 대응하기 위해 page mapping 과정이 필요합니다.
이를 위해 Paging table을 설정해야 합니다.
페이징 기법을 사용하면 연속적이지 않은 공간도 활용할 수 있기 때문에 외부단편화(External fragmentation)을 해결할 수 있고, 코드를 쉽게 공유할 수 있다는 장점이 있습니다.
그리고 페이지 단위를 작게하면 내부 단편화(Internal fragmentation) 역시 해결할 수 있지만
(페이지에 공간을 할당한 후, 남는 공간이 적어지기 때문에) 그 만큼, page mapping 과정이 증가하므로 서로 trade off 관계에 있습니다.
메모리 관리: 세그멘테이션
세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법처럼 미리 분할해 둘 수 없고,
메모리에 적재될 때 빈 공간을 찾아 할당하는 사용자 관점의 가상메모리 관리 기법입니다.
페이징기법과 마찬가지로 mapping을 위해 세그먼트 테이블을 필요로 합니다.
이 기법은 하나의 세그먼트 단위로 통제가 가능한 장점이 있습니다.
즉 내부단편화가 발생하지 않습니다.
그러나 서로 다른 크기의 세그먼트들에 대해 필요시에 메모리에 올리고 필요없을 경우
내리는 작업을 반복하다보면 외부 단편화가 생기는 문제점이 있습니다.
메모리 보호
프로세스는 독립적인 메모리 공간을 가져야 되고, 자신의 공간만 접근해야 한다.
따라서 한 프로세스에게 합법적인 주소 영역을 설정하고, 잘못된 접근이 오면 trap을 발생시키며 보호한다.
메모리 과할당
실제 메모리의 사이즈보다 더 큰 사이즈의 메모리를 프로세스에 할당한 상황
페이지 기법과 같은 메모리 관리 기법은 사용자가 눈치 채지 못하도록 눈속임을 통해 메모리를 할당해준다. (가상 메모리를 이용해서)
과할당 상황에 대해서 사용자를 속인 것을 들킬만한 상황이 존재한다.
- 프로세스 실행 도중 페이지 폴트 발생
- 페이지 폴트를 발생시킨 페이지 위치를 디스크에서 찾음
- 메모리의 빈 프레임에 페이지를 올려야 하는데, 모든 메모리가 사용중이라 빈 프레임이 없음
페이지 교체
스레싱
메모리 영역에 접근하게 될 때, 메모리에 페이지 부재(=페이지 폴트(Page fault)율이 높은 것을 의미하며, 심각한 성능 저하를 초래합니다.
- 다중 프로그래밍 정도가 높아짐에 따라 CPU 이용률이 높아진다.
CPU이용률이 최대값에 도달하였을때, 다중 프로그래밍의 정도가 그 이상으로 더 커지면
쓰레싱이 일어나게 되고 CPU 이용률은 급격히 떨어진다.
- 운영체제는 CPU 이용률을 감시하면서, CPU 이용률이 너무 낮아지면 새로운 프로세스를 시스템에 더 추가해서
다중 프로그래밍의 정도를 높인다. 이 때 전역 페이지 교체 알고리즘을 사용하여 어떤 프로세스의 페이지인지에 대한 고려 없이 교체를 수행한다.