일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 웹프로그래밍
- Level2
- OS
- C++
- 파이썬
- 배열
- web
- 카카오
- react
- 프로그래머스
- 프로그래밍
- 자바스크립트
- 리트코드
- 고득점Kit
- dp
- Doitvue.js입문
- 코테연습
- 백준
- Level1
- 리액트
- typescript
- sql
- Level3
- CS
- LeetCode
- python
- javascript
- 동적계획법
- Medium
- VUE
- Today
- Total
[운영체제] 메모리 관리 본문
- 메인메모리
- 주소 바인딩
- MMU
- 기억장치 할당 방식
- 연속 할당
- 단일 분할 할당
- 다중 분할 할당
- 가변 길이 할당
- 균등 고정 분할 방식
- 비균등 고정 분할 방식
- 가변 길이 할당
- 불연속 할당
- 분산 할당
- 페이징
- 세그먼트
- 연속 할당
메모리 관리
각각의 프로세스는 독립된 메모리 공간을 갖고, 운영체제 혹은 다른 프로세스의 메모리 공간에 접근할 수 없는 제한이 걸려있다. 단지, 운영체제만이 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 제약을 받지 않는다.
요구되는 역할은 allocation, relocation, protection, sharing이다.
메인 메모리
메인 메모리는 CPU가 직접 접근할 수 있는 기억 장치이다. 프로세스가 실행되려면 프로그램이 메모리에 올라와야 한다. CPU는 레지스터가 지시하는대로 메모리에 접근하여 다음에 수행할 명령어를 가져온다. 명령어 수행 시 메모리에 필요한 데이터가 없으면 해당 데이터를 우선 가져와야한다. 이때 MMU가 사용된다.
Types of Addresses
Symbolic address > virtual address = Logical or relative address > Physical address
- Symbolic address : 소스 코드 상에서 변수 이름 등으로 사용되는 주소이다.
- Logical or relative address (virtual address): 프로세스 또는 프로그램 안에 위치하며 어떤 논리적 주소의 상대적 주소이다. 메모리의 공간이 한정적이기 때문에, 사용자에게 더 많은 메모리를 제공하기 위해 등장하였다.
- Physical address: 메인 메모리에 존재하는 실제 주소이다.
어떤 프로그램이 사용자에게 사용되기 위해서는 물리적 주소에 올라가 있어야하며 CPU가 명령을 실행하기 위해서는 해당 데이터의 논리적 주소가 물리적 주소 어디에 매핑 되어 있는지 확인해야 한다.
Address binding
Symbolic address를 실제 물리적 주소로 매핑하는 것을 주소 바인딩이라고 한다.
- compile time : 프로그램을 컴파일할 때 물리적 주소가 결정되며 이미 다른 프로세스에서 사용하고 있는 메모리 주소가 있을 수 있으므로 거의 쓰이지 않는다.
- load time: 프로그램 로딩 시에 물리적 주소가 결정되며 프로그램 종료까지 고정된다. 실행될 때 마다 주소가 변경되므로 프로그램 내의 메모리 주소 전체를 어디에 로딩되는지에 따라 바꿔줘야하므로 로딩 시간이 길어져서 안 쓴다.
- execute time: 프로세스가 이동될 수 있기 때문에 run time까지 딜레이 했다가 바인딩한다. MMU 등 HW의 지원을 받는다.
Dynamic address translation은 실행 시간에 메모리를 translation해주는 것으로 MMU가 해당된다.
Memory Management Unit (MMU)
mmu는 논리적 주소를 메인 메모리의 물리적 주소로 변환해주는 역할을 한다.
또한 메모리 보호나 캐시 관리 등 CPU가 메모리에 접근하는 것을 총 관리해주는 하드웨어이다.
relocation 해결
가상 주소를 통해서 실제 데이터가 담겨 있는 곳에 접근하기 위해서는 빠른 주소 변환이 필요한데, 이를 MMU가 도와준다.
Base register는 프로그램의 시작 주소를 물리주소로 가진다.
base register + local address로 주소를 변환한다.
MMU의 메모리 보호
메인 메모리의 크기는 한정되어 있기 때문에 해당 크기를 넘어가 잘못된 주소를 참조하게 된다. 또한 만약 멀티 프로세싱 시스템일 경우 메모리에 여러 프로세스들이 들어 있기 때문에 서로 독립된 공간을 가지며 자신을 제외한 공간을 침범해서는 안된다. 이를 위해 MMU는 limit register 를 두어 주소의 영역을 제한하고 잘못된 접근이 오면 trap을 발생시키며 메모리를 보호한다. 이를 memory protection이라고 한다.
base <= x < base + limit 일 때 접근이 가능해지며 이 외에는 trap을 발생시킨다.
안정성을 위해서 base와 limit 레지스터는 커널 모드에서만 수정이 가능하도록 설계한다.
주기억장치 할당 방식
단편화 (Fragmentation)
프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면, 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 자유 공간들이 늘어나되는데, 이것이 단편화이다.
내부 단편화
프로세스가 사용하는 메모리 공간에 포함된 부분이 남는 부분. 메모리 분할 자유공간이 10000B 있고 프로세스 A가 9998 사용하게 되면 2b라는 차이가 존재하고, 이 현상을 내부 단편화라고 한다. 분할된 영역이 프로세스보다 크기 때문에 프로세스가 할당된 후 사용하지 않고 남아 있는 빈공간이 생기게 된다.
외부 단편화
메모리 공간 중 사용하지 못하게 되는 부분. 물리 메모리에서 사이 사이 남는 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있을 때 발생한다고 볼 수 있다. 불할된 영역이 할당될 프로그램의 크기보다 작기 때문에 빈 공간으로 남아 있는 분할된 전체 영역을 말한다.
연속 할당 기법
프로세스를 메모리에 연속으로 할당하는 기법
- 단일 분할 할당 기법: 오버레이 스와핑
- 다중 분할 할당 기법: 고정 분할 할당 기법, 동적 분할 할당 기법
swapping
메모리의 관리를 위해 사용되는 기법으로 round-robin과 같은 스케줄링의 다중 프로그래밍 환경에서 CPU 할당 시간이 끝난 프로세스의 메모리를 보조 기억장치로 내보내고 다른 프로세스의 메모리를 불러 들일 수 있다.
고정 분할 할당 기법
균등 고정 분할 방식 Equal-size
균등 고정 분할 방식은 메모리를 균등한 사이즈로 분할한 후 사용 가능한 파티션에 하나의 프로세스를 올릴 수 있게 하는 것이다. 만약 파티션 크기보다 큰 프로그램이 존재한다면 overlay (프로세스 주소 공간을 분할해 실제 필요한 부분한 메모리에 적재하는 기법) 해야한다.
장점
- 프로그래밍하기 쉽다
단점
- 메인 메모리 효율이 떨어진다.
- 내부 단편화 발생
- 동시에 메모리에 올릴 수 있는 프로그램 수와 수행 가능한 프로그램 크기가 제한된다
비균등 고정 분할 방식 unequal-size
프로그램이 들어오는 패턴에 따라 메모리를 비균등한 사이즈로 분할하는 것으로 해당 패턴에 따라 성능이 달라질 수 있다.
장점
- mutiple queue 방식: 내부 단편화 최소화
- single queue 방식: 파티션 선택에 유연함
- 적용이 쉽고 오버헤드가 적다.
단점
- 메모리 효율이 떨어지고 (내부 단편화가 그래도 존재하기 때문에)
- 멀티 프로그램의 정도와 프로세스 사이즈에 제약이 있다
분산 할당 기법
프로세스를 특정 단위의 조각으로 나누어 메모리에 분산하여 할당하는 기법.
파티션이 실행 시간에 동적으로 생성되며, 메인 메모리에 프로세스를 가져올 때는 정확히 필요한 만큼의 메모리만 사용한다. 내부 단편화 문제를 해결하고 메모리를 더 효율적으로 사용할 수 있지만, 외부 단편화 문제와 외부 단편화를 만났을 때 memory compaction으로 인한 CPU 시간 낭비 문제가 발생한다.
*memory compaction : OS가 프로세스를 shift해서 남은 메모리가 한 블럭 안에 모이도록 하는 것을 말한다.
불연속 할당 기법
메모리를 불연속으로 분할하여 할당해주는 기법으로 페이징 기법과 세그먼트 기법이 있다.
Paging 페이징 기법
하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없애는 메모리 관리 방법이다. 외부 단편화와 압축 작업을 해소하기 위해 생긴 방법론이다.
물리 메모리는 Frame이라는 고정 크기로 분리되어 있고, 논리 메모리(프로세스가 점유하는)는 페이지라 불리는 고정 크기의 블록으로 분리된다.
프로그램을 고정 길이로 나눈 단위를 페이지라고 하고, 페이지 크기로 일정하게 나누어진 메인 메모리의 단위를 페이지 프레임이라고 한다.
페이징 기법을 사용함으로써 논리 메모리는 물리 메모리에 저장될 때, 연속되어 저장될 필요가 없고 물리 메모리의 남는 프레임에 적절히 배치됨으로 외부 단편화를 해결할 수 있는 큰 장점이 있다.
하나의 프로세스가 사용하는 공간은 논리 메모리에서 여러 개의 페이지로 나뉘어서 관리되고 개별 페이지는 순서에 상관 없이 물리 메모리에 있는 프레임에 mapping되어 저장된다.
이때 매핑 정보를 알기 위해 page table을 사용하며 인덱스는 페이지 번호이고 각각 frame 번호 정보를 가지고 있다.
단점은 내부 단편화의 비중이 늘어나게 된다는 것이다. 예를 들어 페이지 크기가 1024B이고 프로세스A가 3172B의 메모리를 요구한다면 3개의 프레임을 하고도 100B이 남기 때문에 총 4개의 페이지 프레임이 필요하고 4번째 프레임에는 924B의 여유 공간이 남게 되는 내부 단편화 문제가 발생한다.
보호과 공유
보호
모든 프로세스는 페이지 테이블을 경유하게 된다. 따라서 페이지 테이블의 각 엔트리에 r, w,x 비트를 두어 메모리를 보호할 수 있다. 3개 비트를 이용하여 해당 페이지에 대한 접근 제어를 가능하게 한다.
공유
다중 프로그래밍을 지원하는 운영체제에서는 메인메모리에 다양한 프로세스들이 올라올 수 있다. 만약 같은 프로그램을 지원하는 프로세스들이 여러개 올라온다면? 같은 프로그램인데 각각 다른 기능을 수행하기 위해 복수 개의 프로세스들이 올라온다면, 같은 기능을 지원 받을 수 있기 때문에 복수 개의 프로세스를 모두 메인 메모리에 적재하는 건 메모리 낭비일 것이다.
이 경우를 위해 운영체제는 code 영역을 공유 가능하도록 만들었다. code 영역은 읽기만 가능하고 쓰기가 불가능하므로 임계 구역 문제가 발생하지 않는다. 따라서 공통으로 사용하는 code 부분을 메모리에 하나만 적재하고 해당 부분을 사용하는 프로세스들의 페이지 테이블에서 같은 주소를 가리키도록 하여 각각 따로 기능을 수행하지만 메모리에는 하나의 공간만 차지하도록 코드 영역을 공유할 수 있다.
Segmentation(세그멘테이션) 기법
가상메모리에 보관되어 있는 프로그램을 가변 길이의 논리적인 단위로 나눈 후 메인 메모리에 적재시켜 실행시키는 기법이다.
논리 메모리와 물리메모리를 서로 다른 크기의 논리적 단위인 세그먼트로 분할한다.
구성
가상 주소 형식
가상 주소는 세그먼트 번호를 나타내는 s와 세그먼트 내에 실제 내용이 위치 하고 있는 곳까지의 거리를 나타내는 변위값 d로 구성된다.
물리적 주소
세그먼트의 기준번지(세그먼트의 시작 물리 주소)와 변위값을 더해서 얻을 수 있다.
세그먼트 맵
세그먼트 번호를 인덱스로 가진다
주소 변환
- 논리적 주소에서 segment 번호 (왼쪽 N bit)를 이용해 segment table에서 해당 블럭을 찾는다.
- limit 와 base를 확인하고 offset(변위)가 limit를 넘지 않는지 확인한다.
- 넘지 않는다면 base + offset이 물리주소가 된다.
- 넘는다면 trap 인터럽트를 발생시키고 운영체제에게 운영권을 넘긴다.
보호와 공유
모든 논리 주소들은 세그먼트 테이블을 경유하게 되므로 세그먼트 테이블 엔트리 마다 r, w, x 비트를 만들어 해당 세그먼트에 대한 접근 제어를 가능하게 해준다. 또한 같은 프로그램을 사용하는 복수의 프로세스가 있다면 하나만 메모리에 적재하여 프로세스의 세그먼트 테이블의 코드 영역이 같은 곳을 가리키게 한다. 이렇게 세그먼트는 논리적 영역으로 분할되기 때문에 코드 영역에는 코드 영역만 들어가고, 중요한 프로세스와 중요하지 않은 프로세스로 구분되기 때문에 보호와 공유의 기능을 수행하기도 쉬워져 오버헤드를 줄일 수 있다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 스레드, 프로세스 vs 스레드 (0) | 2022.04.18 |
---|---|
[운영체제] 프로세스 (0) | 2022.04.17 |
[운영체제] 운영체제 (0) | 2022.04.17 |
[운영체제] 캐시 Cache (0) | 2022.04.17 |
[운영체제] 가상메모리 (0) | 2022.04.14 |