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 |