티스토리 뷰

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
링크
«   2025/04   »
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
글 보관함