CS

페이징, 세그멘테이션

Hyeon_E 2023. 11. 7. 15:01

주소 할당(Address Binding)

▶ 프로세스 주소(Process Address)

프로세스 주소는 논리적 주소(Logical Address)와 물리적 주소(Physical Address)로 나뉨

논리적 주소

가상 주소(Virtual Address)라고도 함

CPU가 생성하는 주소이며 프로세마다 독립적으로 가지는 주소 공간

 

물리적 주소

프로세스가 실행되기 위해 실제로 메모리(RAM)에 올라가는 위치

 

▶ 주소 할당

어떤 프로그램이 메모리의 어느 위치에, 어떤 물리적 주소에 load될지를 결정하는 과정

 

Compile Time Binding

프로세스의 물리적 주소가 컴파일 때 정해짐

프로세스가 메모리의 어느 위치에 들어갈지 미리 알고 있으므로 컴파일러는 고정된 주소를 생성

만약 위치가 변경된다면 재컴파일을 해주어야 함

컴파일 타임 주소 할당은 프로세스 내부에서 사용하는 논리적 주소와 물리적 주소가 동일

 

Load Time Binding

프로세스가 메모리의 어느 위치에 들어갈지 미리 알 수 없어 컴파일러는 Relocatable code를 생성

Loader가 프로세스를 메모리에 load하는 시점에 물리적 주소를 결정

따라서 논리적 주소와 물리적 주소가 다름

 

Execution Time(Run Time) Binding

프로세스가 수행이 시작된 이후에 프로세스가 실행될 때 메모리 주소를 바꾸는 방법

실행 도중 주소가 바뀔 수 있음

MMU(Memory Management Unit)라는 하드웨어 장치를 사용하여 논리적 주소를 물리적 주소로 바꿔줌

 

메모리

운영체제에서 메모리란 메인 메모리(주 기억장치), 즉 RAM을 뜻함

프로그램 실행 시 필요한 주소, 정보들을 저장하고 가져다 사용할 수 있게 만드는 공간

각각의 프로세스는 독립된 메모리 공간을 갖음

프로세스는 다른 프로세스나 운영체제의 메모리 공간에 접근할 수 없지만 운영체제는 메모리 접근 제약이 없기 때문에 운영체제에서 메모리를 관리

최근 멀티프로그래밍 환경으로 변화하면서 한정된 메모리를 효율적으로 사용하기 위해 메모리 관리의 필요성이 생겼음

 

▶ 효율적인 메모리 사용

동적 적재(Dynamic Loading)

프로그램 실행에 반드시 필요한 루틴과 데이터만 적재하는 기법
모든 루틴과 데이터는 항상 사용하지 않고 실행 시 필요하다면 그때 해당 부분을 메모리에 적재


동적 연결(Dynamic Linking)

라이브러리 루틴 연결을 컴파일 시점에 하는 것이 아닌 실행 시점까지 미루는 기법


스와핑(Swapping)

메모리에 적재되어 있으나 사용되지 않는 프로세스를 관리
다중 프로그래밍 환경에서 CPU 할당 시간이 끝난 프로세스의 메모리를 보조 기억장치(backing store)로 내보내고 다른 프로세스의 메모리를 불러들임


주 기억장치(RAM)으로 프로세스를 불러오는 과정을 swap-in, 보조 기억장치로 내보내는 과정을 swap-out이라고 함

가상 메모리 기법의 핵심으로 디스크를 활용하여 큰 메모리가 있는 것처럼 효율적으로 메모리를 사용할 수 있게 함

문맥 교환 비용이 크고 swap하는데 걸리는 시간의 대부분은 디스크 전송 시간

 

단편화(Fragmentation)

메모리의 공간이 작은 조각으로 나뉘어 사용 가능한 메모리가 충분히 존재하지만 사용(할당)이 불가능한 상태

  • 내부 단편화
    • 프로세스를 고정된 크기의 페이지로 분할할 때 프로세스 메모리 크기가 페이지 단위와 나누어 떨어지지 않았을 때 할당된 마지막 프레임이 가득차지 않는 현상
  • 외부 단편화
    • 프로세스들이 메모리를 차지하는 과정에서 외부에 여러 개로 작게 나누어진 공백이 생겨서 메모리를 할당할 수 없는 상태가 되는 현상
    • 압축(프로세스가 사용하는 공간을 한쪽으로 몰아 자유공간을 확보하는 방법론)으로 외부 단편화를 해소할 수 있지만 작업 효율이 좋지 않음

 

▶ 메모리 관리 방법

연속 메모리 할당(Contiguous Allocation)

프로세스를 메모리에 연속적으로 할당하는 기법

할당과 제거를 반복하다면 scarrered holes가 생격나고 외부 단편화가 발생함

  • 고정 분할
    • 시스템 생성 시 주 기억장치가 이미 특정 크기로 고정된 파티션들로 분할되는 방식
    • 원리가 단순하고 주기억장치가 미리 분할되므로 운영체제 부담이 줄어들지만 파티션 수에 따라 프로세스 수가 제한받고 크기가 작은 프로세스는 효율적인 공간 활용이 안돼서 현재 고정분할을 사용하는 운영체제는 거의 없음
  • 동적 분할
    • 프로세스 주 기억장치에 적재될 때 정확히 필요한 크기만큼 메모리를 할당하는 방식
    • 재배치를 반복하는 과정에서 외부 단편화 현상이 발생
    • 메모리 압축(compaction)이나 통합(coalescing)을 사용해 외부 단편화를 해결함
      • 압축은 프로세스의 재배치를 통해 모든 빈 공간을 하나로 합치는 방법
      • 통합은 빈 공간의 주소가 인접한 경우 하나로 합치는 방법

 

[ 페이징 ]

하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없애는 기법

물리 메모리는 Frame이라는 고정 크기로 분되어있고 프로세스가 점유하는 논리 메모리는 Page로 불리는 고정 크기의 블록으로 분리

가상 주소 공간은 페이지 번호와 오프셋(offset)으로 표현됨. 페이지 번호는 페이지가 물리 메모리에 어디에 위치하는 지를 나타내며 오프셋은 페이지 내에서 실제 데이터의 위치를 나타냄

MMU의 재배치 레지스터 방식을 활용해 CPU가 마치 프로세스가 연속된 메모리에 할당된 것처럼 인식하도록 함

 

장점

논리 메모리는 물리 메모리에 저장될 때 연속되어 저장될 필요가 없어 외부 단편화를 해결할 수 있음

할당과 해제가 빠르고 swap out이 간단함

 

단점

내부 단편화 문제의 비중이 늘어나게 됨

page table을 저장하기 위한 메모리가 추가로 소모

메모리 접근에 필요한 연산은 두번의 메모리 접근(page + table에 접근 + 실제연산)이 필요하게 되어 속도가 느려짐

 

[ 세그먼테이션 ]

페이징에서 논리 메모리와 물리 메모리를 같은 크기의 블록이 아닌 서로 다른 크기의 논리적 단위인 세그먼트(Segment)로 분할함. 일반적으로 하나의 세그먼트는 code, data, stack부분으로 정의됨

페이징 기법과 달리 프로그램을 기능별로 분할하는 것을 말함

프로세스의 주소 공간은 세그먼트 식별자와 오프셋으로 나타내며 이 방식은 다양한 데이터 타입을 다루기에 적합함

 

장점

세그먼트들이 연속으로 할당될 필요가 없음

stack과 heap이 독립적으로 커질 수 있음

세그먼트마다 protection(보호)을 따로 수행할 수 있음

 

단점

서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되다 보면 외부 단편화 현상이 발생