-
💻 [OS 오퍼레이팅시스템] #14 | 메모리 관리 | 메모리 관리 요구사항, 주소 종류, Buddy System, Paging, SegmentationCS/OS 2022. 6. 13. 10:51
💻 용어 정리
- 정적 static 할당
컴파일 타임에 실행되어 실행 전에 미리 할당 된다.static 변수, 전역 변수
- 동적 dynamic 할당
런타임에 실행되어 요청 시에 할당된다.실행 시점에야 메모리를 얼마나 사용할지 알 수 있는 상황이 있기 때문에 쓰인다(ex. 사용자의 입력으로 메모리 크기 알 수 있다던지)
new, malloc
- 메모리 관리
2부분으로 나뉜다.1) OS(monitor, kernel)
2) User part : 다수의 프로세스로 나뉜다. 나뉘는 일은 OS가 하며 멀티프로그래밍 시스템의 핵심이다 -> memory management
💻 메모리 관리 요구사항
- 1) Relocation 재배치
다수의 프로세스 간 메인 메모리는 공유된다.- 프로그램이 어디에 배치될지 실행되기 전까지 알 수 없다(예측 불가능)
- 프로그램이 할당되어도 다시 이동할 가능성이 있다. utilization을 극대화하기 위해 프로세스가 swap in, out될 수 있게 해줘야한다.
프로세스를 메모리의 다른 영역으로 relocate 재배치 할 수도 있다.
- 2) Protection 보호
원치 않은 다른 프로세스의 접근으로부터 보호되어야 한다.- 프로세스는 그 프로세스가 할당된 공간만 접근해야한다.
- 프로그램의 위치가 예측불가능이기 때문에, 컴파일 타임에 절대 주소를 알 수 없다.
- 동적 주소 변환을 대부분 허용한다.
- 프로세스에 의한 모든 메모리 참조는 런타임에 체크되어야 한다. 프로세서는 실행지점에서 그러한 명령어를 중단할 수 있어야 한다.
- 3) Sharing 공유 (위 보호 개념과 배타적)
몇몇 프로세스들이 메인 메모리의 같은 부분을 접근하는 것을 허용하는 융통성이 있어야한다.- 몇몇 프로세스들이 같은 프로그램을 실행중이라면, 각 프로세스들이 (각자 독립본을 갖는게 X) 같은 부분을 공유하는 것이 효과적이다.
- kernel 코드와 데이터도 공유 주소 공간에 있고 모든 유저 프로세스에 의해 공유된다.
- 4) 논리적 구성 Logical Organization
실제 physical 메모리와 프로그램 구성은 다르다.- 대부분의 프로그램은 모듈로 구성되어있고, 수정 불가능한 부분과 데이터를 수정 가능 부분으로 나뉘어져 있다.
- Base & Bounds의 문제 : 주소 공간을 물리적 메모리에 연속적으로 매핑
- 모듈레벨에서 sharing과 protection을 제공할 수 있고 효과적으로 주소 공간을 사용할 수 있다.
- 5) 물리적 구성 Physical Organization
컴퓨터 메모리는 주기억장치와 보조기억장치로 나뉜다.두 메모리 간 information을 옮기는 작업은 시스템 책임적인 일이다.
디스크에서 메인 메모리로 부분적재가 가능하다 (중요한 코드 등 필요한 부분만 적재)
💻 주소 종류
- 1) Symbolic 주소
소스코드에 사용된 주소. 변수 이름, 상수, 명령어 label
- 2) Logical 주소(relative address, virtual address)
프로세스 내 위치를 지정(page 숫자와 offset으로 표현)주소 공간에서 0부터 시작
컴파일 타임에 컴파일러가 symbolic 주소를 logical 주소로 변환한다.
- 3) Physical 주소(absolute address)
메인 메모리 내 실제 위치를 지정프로그램이 메인메모리에 로드 되면 런타임에 절대 주소로 변환된다.
- 주소 공간
메모리의 프로세스의 logical address- 주소 변환
페이지 사이즈와 프레임 사이즈는 반드시 2의 지수 승이여야 한다.만약 table 사용하면 table에 대한 overhead(추가적인 메모리 접근)이 단점이다.
- 절대 주소(# page, offset)와 상대주소는 같다.
- 실행 시 동적 주소 변환을 위해 하드웨어에서 기능 구현
- 동적 주소 변환
MMU의 부분, 각 CPU의 하드웨어 레지스터들- 가상 주소를 절대 주소로 변환- 주소 공간을 physical 메모리의 어느 곳에 위치할 수 있도록 한다.- 주소 변환은 프로세스에게 transparent하다. (프로세스들은 절대 주소를 모른다)런타임에 adder사용, 가상주소 + Base주소를 해서 가상 주소로 바꾼다.
💻 연속적인 할당
- Fixed Partioning 고정 분할
1) equal size partitions미리 시작 전에 partition을 여러개로 나누고 프로세스 요청 오면 그때그때 partition 아무거나 할당
장점 단점 단순하고 직관적
구현이 쉬움멀티프로그래밍 정도에 제약
파티션의 개수 뿐 아니라 크기도 제약
Internal Fragmentation (Utilization 감소)
프로그램이 partition보다 커서 안들어갈 수도.
프로그램이 partition에 비해 너무 작으면 낭비2) unequal size partitions
여러 비균등한 partitions들 미리 할당, 요청 오면 할당해줌
방법 1: 단일 큐가 존재해서 가장 딱 맞는 파티션 할당, 방법 2: 멀티큐가 존재하여 각 프로세스 당 딱맞는 곳에 큐에 대기
장점 단점 구현이 쉬움
OS 오버헤드 적음
Internal Fragmentation로 utilization 감소
active 프로세스 수 고정
size 크면 실행 불가- Dynamic Partioning 동적 분할
파티션이 미리 생성되는게 아니라 동적으로 생성된다
프로세스에게 런타임에 메모리 할당 요청이 오면 요청한 만큼의 메모리를 할당해준다 -> Internal Fragmentation X
Memory compaction 메모리 압축 필요 : OS가 프로세스위치를 조정하여 모든 프리 메모리 공간을 모아준다.
[ 메모리의 free 블럭들을 고르는 placement 알고리즘 3가지 ]
방법 1 First-fit : 처음부터 순회하면서 후보 고름
방법 2 Next-fit : 마지막에 placement한 위치부터 순회
방법 3 Best-fit : 요청한 size와 가장 잘 맞는 블럭을 찾는다 -> 다 순회하는거 cost 큼, compaction 자주 해야함
방법 4 Worst-fit : 요청한 size와 가장 잘 안맞는 블럭을 찾는다
장점 단점 Internal Fragmentation X
메모리 사용에 더 효과적External Fragmentation
Compaction하는데 CPU time 낭비- Buddy System
메모리 요청이 오면 커널이 free-space를 나눈다. 각 블록을 buddy 블록이라고 한다.메모리 블럭은 2^k word 사이즈가 가능하다.
요청한 사이즈 s가 2^(U-1) < s ≤ 2^U 이면 블럭이 할당된다. 아니라면 2^(U-1) 사이즈로 블록이 나뉜다.
2^(U-2) < s ≤ 2^(U-1)이면 할당되고 아니라면 또 두개로 나뉜다. s보다 같거나 큰 블록을 찾을 때 까지 계속된다.
요청된 블럭을 회수하면, 커널이 두 공간을 합친다.
💻 불연속적 할당 (non-contiguous)
- Paging 분산 적재
프로세스가 동일한 작은 고정된 사이즈의 chunk로 나뉜다.메모리도 고정된 같은 사이즈의 chunk로 나뉜다.
장점 : 내부 단편화가 마지막 조각에만 발생된다. 외부 단편화 X
* page : 프로세스 조각으로 일반적으로 4KB* frame (page frame) : 메모리 조각으로 페이지가 들어갈 수 있는 슬롯. page와 동일한 사이즈로 나뉜다.* page table (page mapping table) : PT또는 PMT라고 부름. 각 페이지의 frame 위치를 포함하며 각 프로세스 당 OS가 유지한다.
- 주소 변환 Paging
1) logical 주소에서 왼쪽 n 비트를 페이지 넘버라고 한다2) 페이지 넘버를 인덱스처럼 사용하여 프로세스 페이지 테이블에서 프레임 넘버 k를 찾는다
3) logical 주소에서 오른쪽 m 비트를 offset이라고 한다.
4) 절대 주소의 시작점은 k*(2^m) 절대 주소는 k*(2^m) + offset.
- Segmentation 분산 적재
주소 공간을 segment로 나누고 각 세그먼트를 절대 주소에 독립적으로 매핑한다.프로세스는 가변길이의 세그먼트로 나뉜다. (code segment, heap segment, stack segment)
* Segment table (segement mapping table) : 각 세그먼트의 최대 사이즈와 시작주소를 포함하며 각 프로세스당 OS가 유지한다.
장점 단점 dynamic partitioning처럼 내부 단편화 X
코드 세그먼트 share와 protect가 가능외부 단편화 0 -> compaction 필요 - 주소 변환 Sementation
1) logical 주소에서 왼쪽 n 비트를 세그먼트 넘버라고 한다2) 세그먼트 넘버를 인덱스처럼 사용하여 세그먼트 테이블에서 세그먼트의 절대 주소의 시작점을 찾는다.3) logical 주소에서 오른쪽 m 비트를 offset이라고 한다. offset과 세그먼트의 길이보다 같거나 크면 주소는 유효 X4) 절대 주소는 시작점 + offset이다.
'CS > OS' 카테고리의 다른 글