[CS] 페이징(Paging)과 세그멘테이션(Segmentation)

giggle·2023년 7월 31일
0

프로그램을 실행하다보면 컴퓨터에서 메모리 공간에 프로그램들이 연속적으로 할당됩니다. 만약 여러 프로그램들이 메모리에 할당되고 해제되는 것이 반복되게 된다면 메모리 공간이 조각조각 나뉘게 되어 총 메모리 공간이 충분함에도 불구하고 할당이 불가능한 상황이 발생합니다. 이를 메모리 단편화라고하며 페이징과 세그멘테이션으로 다음 문제를 해결할 수 있습니다.

  • 연속 메모리 기법
    프로그램 전체가 메모리에 연속적으로 할당
    고정 분할 기법 : 메모리가 고정된 파티션으로 분할. 내부 단편화 발생
    동적 분할 기법 : 파티션들이 동적으로 생성되고 자신의 크기와 같은 파티션에 메모리 할당. 외부 단편화 발생

  • 불연속 메모리 기법
    프로그램의 일부가 서로 다른 주소 공간에 할당될 수 있는 기법
    Page : 프로세스를 고정된 크기로 나눈 블록
    Frame : 메모리를 고정된 크기로 나는 블록
    Segment : 서로 다른 크기의 논리적 블록

  • 내부 단편화
    내부 단편화는 메모리 영역이 프로세스나 데이터 구조의 크기보다 크게 할당되어서 실제로 사용하지 않는 낭비 상태

  • 외부 단편화
    외부 단편화는 메모리 영역 사이에 여유 공간(사용되지 않는 작은 조각)이 존재하여 프로세스나 데이터 구조를 할당하는 데에는 충분한 공간이 있는데도 할당할 수 없는 낭비 상태

📌 페이징(Paging)

페이징이란?

페이징은 물리적인 메모리(RAM)를 고정 크기의 블록인 페이지(Page)로 분할하고, 프로세스의 가상 주소 공간도 같은 크기의 페이지로 분할하여 사용하는 메모리 관리 기법입니다.

페이지 테이블을 사용하여 가상 주소와 물리 주소 간의 매핑을 관리하고 페이지 번호와 해당 페이지에 대응되는 물리 주소를 저장합니다.

페이징을 통해 프로세스는 물리적인 메모리보다 큰 가상 주소 공간을 사용할 수 있으며, 페이지 단위로 메모리를 할당하므로 내부 단편화(Internal Fragmentation)를 최소화할 수 있습니다.

하지만 페이징은 외부 단편화(External Fragmentation)가 발생할 수 있으며, 페이지 크기가 고정되어 있기 때문에 크기가 다른 데이터를 저장하는 경우 낭비가 발생할 수 있습니다.

페이징 과정

  1. 가상 주소 생성: 프로세스가 실행될 때 운영체제는 가상 주소 공간을 할당합니다. 가상 주소 공간은 프로세스가 사용할 수 있는 가상적인 주소 공간으로, 프로세스가 직접 접근할 수 있는 주소입니다.

  2. 가상 주소 분할: 가상 주소 공간은 고정 크기의 블록인 페이지(page)으로 분할됩니다. 이 페이지들은 가상 페이지 번호(Virtual Page Number)로 식별됩니다. 페이지 크기는 일정한 크기로 정해져 있으며, 대표적으로 4KB, 8KB, 16KB 등이 사용됩니다.

  3. 페이지 테이블 사용: 페이지 테이블(Paging Table)은 가상 페이지 번호와 해당 페이지에 대응되는 물리 주소(페이지 프레임 번호, Physical Page Number)를 매핑하는 테이블입니다. 페이지 테이블은 운영체제가 유지하며, 각 프로세스는 자신의 페이지 테이블을 가지고 있습니다.

  4. 페이지 테이블 조회: 가상 주소에 해당하는 가상 페이지 번호를 페이지 테이블에서 찾습니다. 이때, 가상 페이지 번호는 페이지 테이블의 인덱스로 사용됩니다.

  5. 물리 페이지 프레임 번호 추출: 페이지 테이블에서 가상 페이지 번호에 대응되는 물리 페이지 프레임 번호를 추출합니다. 이는 물리 메모리(RAM)의 주소를 나타냅니다.

  6. 오프셋 결정: 가상 주소의 페이지 내 오프셋(offset)은 페이지의 시작으로부터 얼마나 떨어져 있는지를 나타냅니다. 페이지 크기로 나누어 오프셋을 결정합니다.

  7. 물리 주소 생성: 가상 주소의 페이지 프레임 번호와 오프셋을 결합하여 최종적인 물리 주소를 생성합니다. 이 물리 주소는 프로세스가 물리 메모리에 접근하는 실제 주소입니다.

📌 세그멘테이션(Segmentation)

세그멘테이션이란?

세그멘테이션은 논리적인 메모리를 서로 크기가 다른 세그먼트(Segment)로 분할하여 사용하는 메모리 관리 기법입니다.

세그먼트는 논리적인 단위로서, 프로그램의 코드, 데이터, 스택 등을 나타낼 수 있습니다. 세그먼트는 크기가 가변적이며, 서로 다른 크기의 세그먼트를 독립적으로 관리합니다.

세그멘테이션을 통해 프로세스는 물리적인 메모리보다 큰 가상 주소 공간을 사용할 수 있으며, 세그먼트 단위로 메모리를 할당하므로 내부 단편화를 최소화할 수 있습니다.

하지만 세그멘테이션은 외부 단편화가 발생할 수 있으며, 세그먼트 번호와 오프셋을 함께 사용하여 가상 주소를 매핑하기 때문에 페이지 테이블보다 복잡한 구조를 갖습니다.

세그멘테이션 과정

  1. 가상 주소 생성: 프로세스가 실행될 때 운영체제는 가상 주소 공간을 할당합니다. 가상 주소 공간은 프로세스가 사용할 수 있는 가상적인 주소 공간으로, 프로세스가 직접 접근할 수 있는 주소입니다.

  2. 가상 주소 분할: 가상 주소 공간은 서로 크기가 다른 세그먼트로 분할됩니다. 세그먼트는 논리적인 단위로서, 프로그램의 코드, 데이터, 스택 등을 나타낼 수 있습니다. 세그먼트는 크기가 가변적이며, 세그먼트마다 고유한 이름을 가집니다.

  3. 세그먼트 테이블 사용: 세그먼트 테이블(Segmentation Table)은 세그먼트 번호와 해당 세그먼트에 대응되는 물리 주소(베이스 주소, Base Address)와 세그먼트의 크기(한계 주소, Limit)를 매핑하는 테이블입니다. 세그먼트 테이블은 운영체제가 유지하며, 각 프로세스는 자신의 세그먼트 테이블을 가지고 있습니다.

  4. 세그먼트 번호 추출: 가상 주소의 세그먼트 번호를 추출합니다. 세그먼트 번호는 세그먼트 테이블의 인덱스로 사용됩니다.

  5. 베이스 주소와 한계 주소 조회: 세그먼트 테이블에서 세그먼트 번호에 대응되는 베이스 주소와 한계 주소를 조회합니다. 베이스 주소는 물리적인 메모리(RAM)에서 해당 세그먼트가 저장되어 있는 시작 주소를 나타내며, 한계 주소는 세그먼트의 크기를 나타냅니다.

  6. 오프셋 결정: 가상 주소의 세그먼트 내 오프셋(offset)은 세그먼트의 시작으로부터 얼마나 떨어져 있는지를 나타냅니다. 한계 주소로 오프셋의 유효성을 검사합니다.

  7. 물리 주소 생성: 베이스 주소와 오프셋을 결합하여 최종적인 물리 주소를 생성합니다. 이 물리 주소는 프로세스가 물리 메모리에 접근하는 실제 주소입니다.


참고


피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글