Search

[운영체제] 메모리 관리와 가상 메모리

제목
Tag
작성일

프로세스와 메모리

프로세스의 동작 - 프로그램 카운터(PC)를 참조해 수행될 명령을 메모리에서 읽어 CPU로 수행하는것
기억장치 계층구조
종류
특징
CPU 레지스터
가장 빠름 / 매우 비쌈 / 용량 가장 적음
캐시 메모리
CPU와 메모리 속도 차이를 줄이기 위한 고속 저장소
주기억 장치 (메인 메모리, RAM)
비교적 빠름 / 상대적으로 저렴 / 용량 중간
보조 기억장치 (디스크, SSD, HDD 등)
느림 / 매우 저렴 / 대용량 저장 가능
메모리 관리
메모리 호출: 새로운 프로세스를 언제 메모리에 적재할지 결정
메모리 배치: 프로세스를 메모리 어느 위치에 둘지 결정
메모리 교체: 메모리가 가득 찼을 때 어떤 프로세스를 제거할지 결정

단일 프로그래밍 환경

하나의 프로세스만 메모리를 전용으로 사용
연속 메모리 할당 - 하나의 연속된 블록에 프로세스 적재
문제점
메모리의 용량을 초과하는 프로세스는 실행 못함
메모리 낭비 심함 - 지속적으로 사용되지 않는 프로세스도 메모리에 계속 적재
주변장치 등 자원의 낭비 심함 (계산 위주, 입출력 위주의 프로세스)

다중 프로그래밍 환경

여러개의 프로세스를 메모리에 동시에 적재
CPU 연산과 입출력을 동시에 함으로써 CPU용도와 시스템 처리량 증가
메모리 분할
여러 프로세스 적재를 위한 메모리 분할
하나의 분할에 하나의 프로세스 적재

고정 분할

메모리를 여러개의 고정된 크기의 영역으로 분할
프로세스 배치 방법 1
분할 영역마다 큐를 두고 큐에 들어온 프로세스는 해당 분할영역에만 적재
절대 번역 및 적재 (메모리 주소 고정)
낮은 효율성
프로세스 배치 방법 2
하나의 큐만 두고 프로세스를 어느 분할영역에든 적재
재배치 가능 번역 및 적재
높은 복잡도

내부 단편화

고정분할의 문제점
프로세스의 크기가 적재된 분할영역의 크기보다 작아서 분할영역 내에 남게되는 메모리 발생
수행할 프로세스의 크기를 미리 알고 고정 분할해줘야 하지만 현실적이지 못함

동적 분할

가변 크기의 메모리 영역 분할
각 프로세스에 필요한 만큼의 메모리만 할당

외부 단편화

동적 분할의 문제점
메모리의 할당과 반환이 반복됨에 따라 작은 크기의 공백이 메모리 공간에 흩어져 생김
해결방법
통합: 인접한 공백을 하나로 합치기
집약: 모든 공백을 모아 하나로 만들기

메모리 보호

프로세스 간 메모리 침범 방지
하한-상한 또는 하한-크기 레지스터 쌍으로 제한
이 제한 넘어 운영체제 호출하려면 시스템 콜 이용

메모리 배치기법

동적 분할 다중 프로그래밍에서 새로 반입된 프로그램이나 데이터를 어느 위치 메모리에 할당 할 것인지
종류
설명
최초 적합(First Fit)
첫 번째로 발견된 빈 공간에 프로세스 적재
후속 적합(Next Fit)
이전 탐색 위치 다음부터 탐색하여 빈 공간에 적재
최적 적합(Best Fit)
가장 작은 충분한 빈 공간 선택 큰 빈 공간을 최대한 보존
최악 적합(Worst Fit)
가장 큰 빈 공간 선택 작은 자투리 공간 최소화

가상 메모리

물리 메모리보다 큰 주소 공간을 제공하는 기술
보조 기억 장치를 확장된 메모리처럼 사용하는 방식
프로그램 전체를 메모리에 올리지 않고 필요한 부분만 적재하여 실행 가능

사상(Mapping)

프로세스 실행을 위해 가상주소를 실주소로 변환하는 과정
동적 주소변환(DAT): 프로세스 실행 중 실시간으로 주소 변환 수행
인위적 연속성: 가상주소는 연속되지만, 실제주소는 연속될 필요 없음

블록단위 주소변환

블록 단위로 주소변환
가상 메모리의 각 블록이 메모리의 어디에 위치하는지 관리
가상 주소 v = (b, d)
b: 블록 번호
d: 블록의 시작점으로부터의 변위(offset)

주소변환 사상표

동적 주소변환을 위한 정보를 가진 표
바이트나 워드 단위는 변환에 필요한 정보량이 너무 많아 비효율적임
블록 크기 결정
블록 크기 증가
사상표 크기 감소, 블록 전송 시간 증가, 동시에 적재 가능한 프로세스 수 감소
블록 크기 감소
사상표 크기 증가, 블록 전송 시간 감소, 동시에 적재 가능한 프로세스 수 증가

블록 구성방식

페이지(Page): 고정 크기 블록
세그먼트(Segment): 가변 크기 블록

페이징 기법 (Paging)

가상 메모리를 고정 크기 페이지로 분할
물리 메모리도 동일 크기의 페이지 프레임으로 분할
가상 주소를 페이지 번호와 오프셋으로 구분
페이지 사상표를 이용해 동적 주소 변환

페이지 사상표(Page Table)

페이지 번호 → 페이지 프레임 번호 매핑
페이지 항목 구성
페이지 존재 비트
보조 기억 장치 주소
페이지 프레임 번호

동적 주소 변환 방법

직접 사상
페이지 번호를 페이지 테이블에서 직접 조회해 물리 주소 변환
매번 메모리에 접근해야 하므로 속도 느림
구조 단순, 구현 쉬움
예시
가상주소 v = (3, 8), 페이지 크기 M = 1024
실주소 r = 5M + 8 = 5128
연관 사상
연관 메모리(TLB) 에서 페이지 번호를 병렬 검색해 바로 변환
메모리 접근 없이 고속 변환 가능, 속도 매우 빠름
TLB 크기 제한으로 일부 페이지만 저장 가능
연관/직접 혼용 사상
먼저 TLB에서 빠르게 검색, 실패 시 페이지 테이블에서 조회
자주 쓰는 페이지만 TLB에 캐싱하여 속도 향상
현실 CPU가 사용하는 일반적인 방식

페이징 기법의 특징

논리적 의미와 무관한 동일 크기 페이지로 나눔
메모리 보호는 페이지 단위로 이루어짐
외부단편화 없음
내부 단편화 발생 가능

세그멘테이션 기법

가상 메모리를 논리적 단위(세그먼트)로 분할
세그먼트마다 크기가 다를 수 있음
세그먼트 사상표를 이용해 동적 주소 변환

세그먼트 사상표(Segment Table)

세그먼트 번호 → 세그먼트 시작주소 저장
항목 구성
세그먼트 존재 비트
보조 기억 장치 주소
세그먼트 길이(오버플로 확인용)
세그먼트 시작주소

페이징/세그먼테이션 혼용기법

세그멘테이션 기법의 논리적 장점 + 페이징 기법의 메모리 관리 장점 결합
가상 메모리를 세그먼트 단위로 분할 후 각 세그먼트를 페이지 단위로 추가 분할
메모리는 페이지 프레임으로 분할
가상 주소 v=(s, p, d)
s: 세그먼트 번호
p: 페이지 번호
d: 페이지 내 변위
세그먼트 테이블 > 페이지 테이블 > 메모리 주소

메모리 호출 기법

어느 시점에 페이지 또는 세그먼트를 메모리에 적재할 것지 결정하는 기법

요구 페이지 호출 기법

프로세스가 필요한 페이지를 요청할 때 메모리에 적재
페이지 폴트 발생
불필요한 페이지 적재 최소화
프로세스 시작 시 다수의 페이지 폴트 발생 가능

예상 페이지 호출 기법

곧 필요할 것으로 예상되는 페이지를 사전에 메모리에 적재
예상이 잘못된 경우 시간과 메모리 공간 낭비
프로세스 시작 시점에 적용하면 성능이 개선