[OSTEP] 스터디 6주차 - 메모리 가상화 2 정리 및 숙제

주소 변환의 원리

  • 문제의식 : 각 프로세스가 "자기만의 주소 0부터" 쓰게 하면서도 서로 간섭하지 않게 하고, 물리 메모리에 유연하게 배치하려면? --> 가상 주소 --> 물리 주소로 바꿔주는 MMU가 필요
  • 핵심 기술(초기형): Base + Bound
    • 가상 주소에 베이스 레지스터 값을 더해 물리주소를 얻고, 바운드 레지스터로 범위를 검사(보호), 벗어나면 예외
  • 운영체제의 역할(개입 시점)
    1. 프로세스 생성: 빈 슬롯 찾아 할당
    2. 종료: 회수
    3. 문맥 교환: 각 프로세스의 Base/Bound를 저장·복원
    4. 보호 위반: 예외 처리
  • 핵심 메시지: 단순·빠르지만 주소공간이 크거나 드문드문 쓰일 때 낭비/유연성 한계가 생김. 그래서 더 발전된 기법(세그멘테이션/페이징)으로 발전

세그멘테이션

  • 아이디어: Base/Bound를 "세그먼트별"로 일반화(코드/힙/스택 등 각자 Base/Bound를 가짐). 덕분에 쓰는 부분만 물리메모리에 배치 --> 드문드문(sparse) 주소 공간을 효율적으로 수용..
  • 주소 변환: (세그먼트 선택) + (세그먼트 내부 오프셋) → 해당 세그먼트의 Base에 오프셋을 더함. 스택은 성장 방향이 반대라 방향 비트로 처리. 
  • 공유/보호:세그먼트 단위 보호 비트(읽기/쓰기/실행)코드 공유 가능(여러 프로세스가 같은 코드 세그먼트를 읽기 전용으로 매핑).
  • 현실의 문제: 세그먼트가 가변 크기라서 외부 단편화가 생김(틈이 쪼개져 큰 연속 공간을 못 만들 때). 압축(compaction)이나 적합-할당 알고리즘을 써도 근본 해결은 어려움. 그래서 오늘날은 보통 페이징(고정 크기)으로 해결하거나 혼합.

숙제

질문

1. 시드 1, 2, 3으로 실행하고 프로세스에서 생성된 각 가상 주소가 범위 내에 있는지 또는 범위를 벗어났는지 계산하세요. 범위 내라면 변환을 계산하세요.

A1 : Limit 가 290 이다. VA 0, 1, 2, 3, 4를 비교했을 때 VA1 만 290 이하에 있으니 범위 내에 있다고 할 수 있다.

A2 : Limit 가 500 일때 범위 내에 있는 것은 VA0, VA1이다.

A3: Limit 가 316 일 때 범위 내에 있는 것은 VA3, VA4이다.

2. 다음 플래그로 실행하세요: -s 0 -n 10. 생성된 모든 가상 주소가 범위 내에 있도록 하려면 -l(한계 레지스터)을 어떤 값으로 설정해야 할까요?

A: 최소 929 보다는 커야 한다 그러면 930이 가장 최소이다.

3. 다음 플래그로 실행하세요: -s 1 -n 10 -l 100. 주소 공간이 여전히 물리 메모리에 전체적으로 맞도록 기준을 설정할 수 있는 최댓값은 얼마인가요?

A: 물리 메모리 범위는 16K - 100으로 16384 - 100 = 16284이다. 즉 Base 가 16284 위치여도 가능하다는 것이다. 

4. 위와 동일한 문제 중 일부를 실행해 보세요. 단, 더 큰 주소 공간(-a)과 물리 메모리(-p)를 사용하세요.

 

  • VA는 0~65535 범위에서 생성.
  • 유효성: VA < 4096 이어야 함.
  • 적재 가능 조건: Base + 4096 ≤ 1,048,576 → Base_max = 1,044,480 (≈0xFF000).

 

limit 가 21689가 되었다. 현재 VA들을 모두 범위 안으로 들어오게 만들기 위해 Limit를 42660으로 조정하면 된다.