Computer/Operating system

ch07. Memory Mangement

코머 2021. 10. 12. 14:21

1. Memory Management Requirements

Relocation (재배치)

- 프로그램 실행 시 배치; 장소는 모른다

- 재배치가 일어나는 2가지 경우 

  1) Disk swap out 한 후 다시 swap in 할 때

  (프로그램이 장시간 Blocked 상태일 경우 메인 메모리에서 디스크로 빠짐) -> (다시 불러옴)

  2) memory compaction :

   중간중간 쓰지 않는 메모리 조각이 생김. > 메모리 전부를 앞 쪽부터 다시 옮김

- 논리 주소 -> 실제 주소로 변환이 필요하다.

 

Protection (메모리 보호)

- 다른 프로그램이 내 영역 침범할 때 보호

- MMU (memory management unit hardware) : 메모리를 관리하는 별도의 하드웨어 장치

  내 영역이 아닌 다른 메모리 참고 할 때 MMU가 CPU에 trap을 걸어줌 -> 메모리 보호하는 device drive 실행

 

Sharing (메모리 공유)

- 여러 프로그램이 하나의 메모리를 공유

- 메모리 공유가 일어나는 3가지 경우

1) 프로그램 코드 공유 : 동일 프로그램이 여러 개 실행 될 때 

    ex. PowerPoint 10개 실행 시 프로그램 코드는 공유하고 프로그램 데이터는 따로 가짐

2) DLL 라이브러리 코드 공유 : 서로 다른 여러 프로세스가 하나의 DLL코드를 공유함 

3) 데이터 공유 : 하나의 버퍼(배열)을 여러 프로세스가 공유

 

Logical Organization (메모리의 논리적 구성)

- 하나의 프로그램이 여러 모듈(각각의 파일)로 구성

- 하나의 모듈은 독립적으로 컴파일이 가능하다

- 코드 영역은 읽기만 한다.

- 코드 영역은 서로 다른 프로그램끼리 코드를 공유할 수 있다.

 

Physical Organization (물리적 구성)

 

2. Memory Partitioning and Placement

Fix Partitioning (고정된 크기의 메모리를 할당하는 방법)

1) Equal-size partitions : 메모리조각(internal fragmentation)이 생긴다.

2) Unequal-size partitions : 적당한 크기의 메모리가 쏠린다. 작고 큰 크기의 메모리는 놀고 있다.

 

Dynamic Partitioning (동적으로 메모리를 할당하는 방법)

: 프로그램 메모리 할당이 아직 안되어 있는 조그마한 메모리 공간(external fragmentation) 

-> compaction : 사용한 프로그램 공간을 앞으로 밀어주고 뒤에 커다란 메모리 공간을 만들어 줌 (프로그램 재배치)

1) Best-fit : 남은 메모리 공간 중 요청된 메모리 크기에 가장 밀접한 메모리에 할당

- 가장 성능이 좋지 않음 (external fragmentation) = external fragmentation이 완전 조그마한 공간으로 많이 남게 됨 

2) First-fit : 위에서부터 메모리를 탐색해서 요청된 메모리 크기를 넣을 수 있는 메모리를 처음 찾을 경우 그 메모리에 할당

- 구현하기 가장 간단하고 가장 성능이 좋고 가장 빠르다.

3) Next-fit : 마지막으로 할당해준 block 이후 요청된 메모리 크기를 넣을 수 있는 처음 찾을 경우 그 메모리에 할당 (마지막까지 탐색 후 없을 시 프로그램의 처음부터 탐색)

4) Worst-fit : 빈공간들 중에 가장 큰 공간에 메모리 할당

5) Buddy system : 메모리 할당은 2ˣ, 즉 2의 지수승 크기로 할당     "메모리를 할당하는 과정 - 강의 07-2차시 / 24분"

- memory compaction이 필요없기 때문에 성능 좋음, But 메모리 낭비가 심함

- 비어있는 메모리 블록들 중 요청한 메모리 크기를 수용하는 가장 작은 2의 지수승인 메모리를 할당

- 만약 가장 작은 2의 지수승인 메모리가 없을 경우 이의 두 배를 늘려 계속 빈 블록을 찾음 -> 찾은 블록을 반으로 분할하고 이 중 왼쪽의 블록을 원하는 메모리 크기가 될 때까지 계속 반으로 분할하며 내려감

- 같은 크기로 분할된 두 개의 블록끼리 서로 buddy(친구)라고 함

- 메모리 블록이 반납되면 우선 그 메모리의 buddy가 이미 free인지 계속 사용 중인지 확인 -> 반남된 블록의 buddy블록을 하나로 합쳐 두 배의 큰 블록으로 만듦 (메모리 합병, merging), 만약 합병된 큰 블록의 buddy가 또 free라면 위 합병과정을 계속 진행

 

3. Memory Mangement

Addresses

- 논리 주소 (Logical address) -> 실제 주소로 변환이 필요하다.

- 상대 주소 (Relative address) -> 시작부터 어느정도 떨어져 있는지

- 물리주소 (Physical address) -> 주 메모리에서 실제 위치의 절대 주소

 

Basic Paging System

- Frame : main memory를 4KB 단위씩 자른 것

- Page : process(프로그램)를 4KB 단위씩 자른 것 

- 실제 메모리에는 page 단위로 잘라서 비 연속적으로 아무 빈 곳에 배치됨

- Page Tables : 해당 페이지가 배치된 메모리 frame 번호

- 논리주소를 실제주소로 변환하기 위한 페이지 테이블 (실제 integer 배열)

- 각 프로그램 별로 운영체제가 자동으로 생성하고 관리

 

Paging 주소 변환

1) 논리 주소 -> 실제 주소

- 페이지 크키 = 프레임 크기 = 1024라 가정

- 논리주소(3) -> 실제주소(1027) 변환 방법

논리주소(3) / 페이지 크기(1024) = 페이지 번호 (0)

논리주소(3) % 페이지 크기(1024) = 페이지 내의 offset(3), 페이지에서 얼만큼 떨어져 있는지

page table에서 페이지 번호(0)를 index로 사용하여 테이블에서 프레임 번호(1)을 찾음

프레임 번호 (1) * 프레임 크기 (1024) = 프레임 시작주소 (1024)

프레임 시작주소(1024) + offset(3) = 실제주소(1027)

2) 실제 주소 -> 논리 주소

- 페이지 크기 = 프레임 크기 = 1024라 가정

- 실제주소 (2050) -> 논리주소(1026) 변환방법

실제주소(2050) / 프레임 크기 (1024) = 프레임 번호(2)

실제주소 (2050) % 프레임 크기 (1024) = 프레임 내의 offset(2)

page table에서 프레임 번호(2) 값을 가지는 index(1) 찾음, 이 index 값이 페이지 번호(1)

페이지 번호(1) * 페이지 크기 (1024) = 페이지 시작 주소 (1024)

페이지 시작주소(1024) + offset(2) = 논리주소(1026)

3) 페이지 테이블 만들기

- 페이지 크기 = 프레임 크기 = 1024로 가정

- 페이지 테이블 내의 빈 프레임 번호 찾기

논리주소 (2049) -> 실제주소(1) 변환 방법을 사용함

논리주소 (2049) / 페이지 크기 (1024) = 페이지 번호 (2)

논리주소 (2049) / 페이지 크기 (1024) = 페이지 내의 offset(1)

page table에서 페이지 번호(2)를 index로 사용하여 프레임 번호(x)를 찾음

프레임 번호(x) * 프레임 크기 (1024) = 프레임 시작주소

프레임 시작주소(x*1024) + offset(1) = 실제주소(1)

x * 1024 + 1(offset) = 1(실제 주소)이 되기 위해서는 x는 0이어야함

x =(실제주소 - offset) / 1024(프레임크기)

따라서 페이지 2가 로드된 메모리의 프레임 번호는 0

4) Logical to Physical Address Translation (하드웨어적 논리적 - 물리적 주소 변환)

- CPU가 메모리 장치에 보내는 논리주소 (가상주소)

  포인터 변수 값 및 CPU가 다루는 모든 주소는 사실 논리주소임

- OS가 내부적으로 process page table 만들고 관리 (전기적 신호로)

- MMU 장치에서 이러한 과정을 H/W적으로 자동 실행해 실제 주소로 변환

 

Basic segmentation System

- Segment : 코드 세그먼트, 전역변수 세그먼트, 힙 세그먼트, 스택 세그먼트

- 세그먼트마다 길이가 다 다름 

  동적으로 메모리를 할당해주어야 함 -> compaction필요

  실제 시스템에서 이 방법을 사용하지 않음

- 한 세그먼트가 가질 수 있는 최대 크기가 시스템 내에 정해져 있음

 

 

 

 

 

 

 

 

segmetation 주소 변환

1) 논리 주소 -> 실제 주소

- 시스템 내의 세그먼트 최대 크기 = 1024라 가정

- 논리주소(3) -> 실제주소(1027) 변환방법

논리주소(3) / 세그먼트 최대 크기(1024) = 세그먼트 번호 (0)

논리주소(3) % 세그먼트 최대 크기(1024) = 세그먼트 최대 크기 내의 offset(3)

Segmentation table에서 세그먼트 번호(0)를 index로 사용하여 테이블에서 실제메모리의 세그먼트 시작주소(1024)를 찾음

세그먼트 시작주소(1024) + offset(3) = 실제주소(1027)

2) 실제 주소 -> 논리 주소

- 시스템 내의 세그먼트 최대 크기 = 1024라 가정

- 실제주소 (2050) -> 세그먼트 최대 크기(1026) 변환방법

실제주소(2050) / 세그먼트 최대 크기(1024) = 프레임 번호(2)

실제주소 (2050) % 프레임 크기 (1024) = 프레임 내의 offset(2)

page table에서 프레임 번호(2) 값을 가지는 index(1) 찾음, 이 index 값이 페이지 번호(1)

페이지 번호(1) * 페이지 크기 (1024) = 페이지 시작 주소 (1024)

페이지 시작주소(1024) + offset(2) = 논리주소(1026)

'Computer > Operating system' 카테고리의 다른 글

08 Virtual Memory (2)  (0) 2021.10.25
08 Virtual Memory (1)  (0) 2021.10.25
Ch03 Processes2  (0) 2021.09.23
Ch03 Processes1  (0) 2021.09.23
Ch02 Types of Operating System  (0) 2021.09.14