티스토리 뷰
2023.07.08 - [운영체제] - #34 메모리 - 메모리 할당방식
#34 메모리 - 메모리 할당방식
2023.05.29 - [운영체제] - #27 메모리 - 메모리와 주소 #27 메모리 - 메모리와 주소 2023.02.12 - [운영체제] - #3 컴퓨터 하드웨어와 구조(feat 폰 노이만 구조) #3 컴퓨터 하드웨어와 구조(feat 폰 노이만 구조
radderveloper.tistory.com
- 위의 글을 먼저 읽어보자
● 세그멘테이션
- 글의 목적 : 가변 분할 방식을 이용하는 세그멘테이션 기법을 알아보자
- 세그멘테이션에서 프로그램은 함수나 모듈등으로 세그먼트를 구성한다.
- 세그멘테이션은 메모리를 가변적으로 분할할 수 있고 코드 영역, 데이터 영역, 힙 영역, 스택 영역을 모듈로 처리할 수 있기 때문에 공유와 각 영역에 대한 메모리 접근 보호가 편리하다.(영역별로 분할돼서 관리가 쉽다.)
- 단점으로는 외부 단편화가 발생한다.

- 프로그램(사용자) 관점에서 메모리를 살펴보면 메인 코드가 있는 세그먼트, 전역 데이터들이 있는 세그먼트, 힙 영역이 있는 세그먼트, 스택 영역이 있는 세그먼트 등이 있다.(각 세그먼트들이 서로 인접할 필요는 없다.)
- 반면에 프로세스 관점에서는 코드 영역, 데이터 영역, 힙 영역, 스택 영역 등이 서로 인접한 것 처럼 바라본다.

● 논리주소를 물리주소로 변환
- 사용자, 프로세스, CPU가 바라보는(사용하는) 주소는 논리주소이다. / 메모리(RAM)는 물리주소를 사용한다.
- 논리주소를 실제 물리주소를 변환해주는 작업은 중간에서 메모리 관리자(MMU)가 수행한다.
Q. 메모리 관리자(이하 MMU)는 어떻게 논리주소를 물리주소로 변환해줄까?
A.
- MMU는 세그멘테이션 테이블이라는 것을 가지고 있다.
- 세그멘테이션 테이블에는 Base Address와 Bound Address 정보가 있으며 이것을 이용해 물리 메모리 주소를 계산한다.

ex)
1. CPU에서 논리 주소를 전달해준다.(CPU 曰 : "논리주소 0x123번지의 물리 메모리 주소를 알려줘")
2. MMU는 해당 논리 주소가 몇번 세그먼트인지 알아낸다.(MMU 曰 : "CPU가 요청한 논리 주소는 세그먼트 3번에서 왔군")
2-1. MMU 내의 Segment Table Base Register를 이용해서 물리 메모리 내에 있는 세그멘테이션 테이블을 찾는다.(MMU 曰 : "물리메모리 n번지에 있는 세그멘테이션 테이블을 가져와야지")
3. 세그먼트 번호를 인덱스로 Base Address와 Bound Address를 찾는다.(MMU 曰 : "세그먼트 3번이니 3번 인덱스를 참조")
4. MMU는 CPU에서 받은 논리주소와 Bound Address의 크기를 비교한다.(Bound Address는 세그먼트의 크기를 의미)
(MMU 曰 : "123과 500의 크기를 비교")
5. (논리주소 < Bound Address)라면 (논리주소 + Base Address) 값을 이용해 물리주소를 구한다.(MMU 曰 : "123과 6400을 더하면 물리주소는 6523")
5-1. (논리주소 > Bound Address)라면 메모리를 침범했다고 생각하고 에러를 발생시킨다.(MMU 曰 : "CPU야 이 놈 메모리 침범이야! 종료시켜!")
cf)
- 참고로 OS는 컨텍스트 스위칭을 할 때마다 MMU 내의 Segment Table Base Register의 값을 해당 프로세스의 것으로 바꿔줘야 한다.
- 컨텍스트 스위칭은 이런 작업까지 하기에 굉장히 무거운 동작이다.
- 논리주소를 물리주소로 변환하는 예시를 몇 개 더 작성해보겠다.

1.
- CPU에서 세그먼트 1번이 0x632 번지로 접근할려고 한다.
- MMU는 CPU의 요청을 받아 세그먼트 1번인 것을 알아낸다.
- MMU 내에 있는 Segment Table Base Register를 이용해서 세그멘테이션 테이블을 찾아낸다.(물리 메모리 n번지에 있는 세그멘테이션 테이블 소환)
- 세그멘테이션 테이블을 찾은 다음 세그먼트 1번이 위치한 1번 인덱스를 참조한다.
- [논리주소(632) < Bound Address(1000)] 이므로 논리주소(632)와 Base Address(5200)를 더해 물리주소(5832)를 구한다.
- 최종적으로 논리주소 0x632는 물리주소 0x5832로 변환됐다.
2.
- CPU에서 세그먼트 3번이 0x750 번지로 접근할려고 한다.
- MMU는 CPU의 요청을 받아 세그먼트 3번인 것을 알아낸다.
- MMU 내에 있는 Segment Table Base Register를 이용해서 세그멘테이션 테이블을 찾아낸다.(물리 메모리 n번지에 있는 세그멘테이션 테이블 소환)
- 세그멘테이션 테이블을 찾은 다음 세그먼트 3번이 위치한 3번 인덱스를 참조한다.
- [논리주소(750) > Bound Address(500)] 이므로 MMU는 메모리를 침범했다고 판단, 인터럽트를 발생시켜 프로세스를 종료시킨다.(이거 이거 메모리 침범이야! 종료시켜!)
'CS > 운영체제' 카테고리의 다른 글
#37 페이징(배치정책) (0) | 2023.07.11 |
---|---|
#36 파일과 디스크 (0) | 2023.07.10 |
#34 메모리 - 메모리 할당방식 (0) | 2023.07.08 |
#33 가상메모리 (0) | 2023.07.06 |
#32 파일과 파일시스템, 파일 구조 (0) | 2023.06.29 |
- Total
- Today
- Yesterday
- 코딩테스트
- spring
- nosql
- 메모리
- 알고리즘
- OS
- SQL
- 프로세스
- Advanced Stream
- Phaser
- Java8
- SpringBoot
- java
- 코테
- 빅데이터
- 프로그래머스
- MongoDB
- DART
- Stream
- git
- Phaser3
- API
- MySQL
- 자료구조
- 빅데이터 분석기사
- jpa
- 운영체제
- db
- node.js
- Spring Boot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |