독학사 운영체제 편을 공부하고 정리한 글입니다.
메모리 관리
- 메모리의 구조는 1바이트 단위로 나뉘고 주소로 구분하는데 0번지 부터 시작한다.
- CPU는 메모리 주소 레지스터를 통해 데이터를 메모리에서 읽어오거나 쓰기가 가능하다.
- 오늘날 시분할 시스템에서 많은 응용프로그램이 동시에 메모리에 올라와있으므로 관리가 복잡하다.
메모리 관리자
- 다중 프로그래밍 환경에서 효율적으로 메모리를 사용하기위해 메모리 할당 및 해제 등의 작업을 수행한다.
- 메모리 관리 유닛(Memory Manage Unit, MMU)라는 하드웨어가 메모리 관리를 담당한다.
- 메모리 관리 작업은 가져오기(fetch), 배치(placement) 그리고 재배치(replacement)로 나뉜다.
1. 적재 정책
- 프로세스와 데이터를 메모리로 가져오는 적재 작업에서 언제 메모리에 가져올지 결정하는 정책이다.
- 요구 적재(demand fetch): 운영체제나 시스템 프로그램, 사용자프로그램 등 참조 요청이 있을 시 메모리에 적재
- 예상 적재(anticipatory fetch): 시스템 요청을 미리 예측하여 메모리에 적재하는 방법
2. 배치 정책
가져온 프로세스와 데이터를 메모리에 올려놓는 배치 작업에서 어느 위치에 저장할 것인지 결정한다.
- 최초 적합: 분할된 빈 메모리 공간 중에서 배치 가능한 첫 번째 분할 공간에 적재
- 최적 적합: 분할된 빈 메모리 공간 중에서 배치 가능한 가장 작은 공간에 적재
- 최악 적합: 분할된 빈 메모리 공간 중에서 배치 가능한 가장 큰 공간에 적재
3. 재배치 정책
새로운 프로세스를 메모리에 올리기 위해 메모리에 충분한 공간이 없을시 디스크로 내보낼(swap-out) 프로세스를 결정하는 작업에서 어떤 프로세스를 제거할지 결정하는 정책이다.
- 선입선출: 가장 먼저 실행된 (오래된) 프로세스를 내보냄
- 최근 최소 사용(LRU): 가장 사용한지 오래된 프로세스를 내보냄
메모리 주소
- 32bit CPU vs 64bit CPU
- CPU 비트는 한 번에 다룰 수 있는 데이터의 최대 크기 (레지스터의 크기)를 의미.
- 데이터를 주메모리에서 CPU로 전송할 때 사용하는 버스의 대역폭도 같은 크기를 가진다.
- 32bit ~ 4GB를 다루며 64bits는 거의 무한대의 메모리 주소 공간을 사용할 수 있다.
- 메모리 영역 구분
- 운영체제의 기능이 정의된 함수와 데이터, 부팅관련 소스 등의 보호된 영역으로 0번지 부터 시작하여 일정 영역을 차지하고 있다.
- 사용자 영역에서 프로세스가 실행될 때 마다 높은 주소부터 차례대로 할당된다.
- 사용자 영역이 운영체제 영역을 침범하는 것을 막기 위해 "limit"의 주소를 가진 경계 레지스터가 CPU에 존재한다.
- 메모리 관리자는 사용자가 프로세스를 요청할 때 경계 레지스터를 조사하여 경계를 벗어나는지 확인하고 그렇다면프로세스를 종료한다.
- 절대주소와 상대주소
- 절대주소는 메모리 관리자(하드웨어)에서 보는 물리적인 주소이고 실제 메모리 (RAM)에서 사용하는 메모리 주소와 일치한다.
- 프로세스 생성시 메모리가 확보되고 적절한 위치에 적재되는데 프로세스마다 시작 주소를 가진다.
- 이 시작주소를 기준으로 코드, 데이터, 스택, 힙과 같은 영역이 구분되고 사용자 관점에서 바라본 주소를 상대주소라고한다.
- 프로그램에서 출력되는 주소는 상대주소이다.
- 실제로 메모리 관리자가 Process 2의 힙 영역의 데이터를 접근하기 위해 기준 주소를 사용하여 상대주소를 절대주소로 번역한다.
- 위의 가상 예에서 3600(상대주소)를 4800(Process 2의 기준 주소)를 더해 실제 물리주소 8400를 구해 힙 영역을 접근할 수 있다.
- 프로세스마다 기준 주소를 가지고 있으며 재배치 레지스터가 이 값을 저장한다.
단일 프로그래밍에서 메모리 할당
- 메모리 오버레이
프로그램의 크기가 메모리 용량보다 클 때 구성 프로그램을 모듈별로 잘라 일부분만 메모리에 적재한다.
프로그램 카운터가 다음 실행할 모듈에 대한 내용이 메모리에 없으면 MMU에 요청하여 필요 모듈을 적재한다.
- 스왑
메모리에서 새로운 프로세스나 모듈이 적재될 때 공간확보를 위해 기존 오래된 프로세스나 모듈을 디스크로 내보내게 되는데 이를 스왑 아웃 (swap-out)이라 하고 디스크로부터 메모리에 적재하는 것을 스왑 인 (swap-in)이라고 한다.
- 두 기능을 통해 사용자는 실제 메모리의 크기와 상관 없이 큰 프로그램을 실행할 수 있다.
다중 프로그래밍에서 메모리 할당
- 고정 분할 방식
메모리를 일정한 크기로 나누어 "조각"으로 관리
프로세스가 조각의 크기보다 클 시 나누어 여러 조각에 적재
- 단점
조각내부에 사용하지 않는 빈 공간이 생기는 현상, 내부 단편화로 인한 메모리 낭비
분할 크기에 따른 내부 단편화 조절
- 가변 분할 방식
메모리를 일정하지 않은 크기로 나누며 주로 "프로세스" 단위로 메모리에 적재
- 단점
메모리 관리가 복잡하다
외부 단편화, 적재해야할 프로세스 크기가 기존 프로세스 종료 후 반납된 메모리 조각들보다 커서 메모리 적재가 불가능한 현상
P5를 메모리에 적재해야하는데 기존 메모리 조각 중 충분한 크기를 가진 공간이 없음
외부 단편화를 위한 해결 방법
1. 배치 정책
기존 여러 크기의 빈 조각에 어떻게 프로세스를 할당할 것 인가
- 최초 배치
조각 순서대로 가능한 공간에 배치
- 최적 배치
가능한 공간 중 가장 작은 공간에 배치
- 최악 배치
가능한 공간 중 가작 큰 공간에 먼저 배치
2. 메모리 조각 모음
이동할 프로세스를 중단시키고 프로세스 기준 주소를 변경하여 메모리 적재 위치를 변경한다.
공간이 큰 메모리 조각이 충분히 확보된 후 프로세스를 다시 시작한다.
'Computer Science 기본 지식 > 운영체제' 카테고리의 다른 글
[운영체제] 가상 메모리 (2) 페이지 부재 (0) | 2021.01.20 |
---|---|
[운영체제] 가상 메모리 (1) 페이징과 세그먼테이션 (0) | 2021.01.19 |
[운영체제] 교착상태 (0) | 2021.01.16 |
[운영체제] 프로세스 동기화 (0) | 2021.01.15 |
[운영체제] 프로세스 스케줄링 (0) | 2021.01.14 |