주소 변환의 원리
- 문제의식 : 각 프로세스가 "자기만의 주소 0부터" 쓰게 하면서도 서로 간섭하지 않게 하고, 물리 메모리에 유연하게 배치하려면? --> 가상 주소 --> 물리 주소로 바꿔주는 MMU가 필요
- 핵심 기술(초기형): Base + Bound
- 가상 주소에 베이스 레지스터 값을 더해 물리주소를 얻고, 바운드 레지스터로 범위를 검사(보호), 벗어나면 예외
- 운영체제의 역할(개입 시점)
- 프로세스 생성: 빈 슬롯 찾아 할당
- 종료: 회수
- 문맥 교환: 각 프로세스의 Base/Bound를 저장·복원
- 보호 위반: 예외 처리
- 핵심 메시지: 단순·빠르지만 주소공간이 크거나 드문드문 쓰일 때 낭비/유연성 한계가 생김. 그래서 더 발전된 기법(세그멘테이션/페이징)으로 발전
세그멘테이션
- 아이디어: 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으로 조정하면 된다.
'Deep Dive > OS' 카테고리의 다른 글
[OSTEP] 스터디 6주차 - 메모리 가상화 2 Part.1 (0) | 2025.10.14 |
---|---|
[OSTEP] 스터디 5주차 - 메모리 가상화 1 (0) | 2025.09.29 |
[OSTEP] 스터디 4주차 - 스케줄링 2 : Part.2 - 비례 배분 (0) | 2025.09.23 |
[OSTEP] 스터디 4주차 - 스케줄링 2 : Part.1 - MLFQ (0) | 2025.09.22 |
[OSTEP] 스터디 3주차 - 스케줄링 1 (0) | 2025.09.15 |