선릉역 1번 출구
메모리 관리_물리 메모리 관리 본문
물리 메모리 관리
메모리 관리의 개요
*폰 노이만 구조의 컴퓨터에서는 메모리는 유일한 작업 공간이며 모든 프로그램은 메모리에 올라와야 실행이 가능
메모리에는 사용자 프로세스와 운영체제 프로세스도 공존함 -> 여러 작업을 동시에 처리할 때 메모리를 어떻게 관리하나?
메모리 관리 시스템(Memory management system)이 담당
1) 메모리 관리의 이중성
프로세스 입장에서는 메모리를 독차지하려하고, 메모리 관리자 입자에서는 되도록 관리를 효율적으로 하고 싶어하는 것
= 프로세스 입장에서의 편리함과 관리자 입장에서의 편리함이 충돌하는 것
2) Compiler vs interpreter
compiler: 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행. C언어, Java
interpreter: 소스코드를 한 행씩 번역해 실행. Javascript, python
왜 컴파일러를 사용할까?
1. 오류 발견(symbol table의 사용) 2. 코드 최적화
구분 | 자바 | 자바스크립트 |
변수 | 변수를 선언해야 함 | 변수 선언 필요 x |
실행 | 컴파일 후 실행 | 한 줄씩 실행 |
장점 | 오류 찾기, 코드 최적화, 분할 컴파일에 의한 공동 작업 | 실행이 간편 |
사용 프로그램 | 대형 프로그램 | 간단한 프로그램 |
컴파일 과정은 총 4개로 전처리, 컴파일, 어셈블, 링킹으로 나눌 수 있음
https://gracefulprograming.tistory.com/16
3) 메모리 관리자
메모리 관리는 MMU라는 메모리 관리 유닛(=메모리 관리자)이 담당함
메모리 관리자의 작업은 가져오기_fetch, 배치_placement, 재배치_replacement로 나눌 수 있음
메모리 주소
1) 32bit vs 64bit
32bit cpu는 한 번에 다룰 수 있는 데이터의 크기가 32bit이고, 64bit cpu는 한 번에 다룰 수 있는 데이터의 크기가 64bit임 -> cpu내의 레지스터의 크기도 동일하게 설계됨(32bit -> 32bit, 64bit -> 64bit)
CPU의 비트는 메모리 주소 공간의 크기와도 연관이 있는데 32bit CPU의 경우 메모리 주소를 지정하는 레지스터 MAR의 크기가 32bit이기 때문에 표현할 수 있는 메모리 주소의 범위가 0~2^32-1, 총개수가 2^32로 크기는 2^32B = 약4GB임
즉 32bit CPU 컴퓨터는 메모리를 최대 4GB까지 사용이 가능하고 반면 64bit는 0~2^64-1로 거의 무한대에 가까운 메모리를 사용할 수 있음
2) 절대주소 vs 상대 주소
메모리 영역은 os영역과 사용자 영역으로 구분할 수 있는데 사용자 영역에 os 영역을 넘지 않으려면 경계 레지스터라는 하드웨어의 도움이 필요함 -> 작업을 요청할 때마다 경계레지스터의 값을 넘는지 비교해 넘으면 프로세스를 종료함
컴파일 시 변수의 주소를 0번지부터 배정함
why? 컴파일할 당시에는 변수가 메모리의 어느 위치에 올라가는지 알 수 없기 때문
사용자 프로세스가 메모리의 400번지에 올라가면 프로세스 내 변수에 400을 더함 -> 400이 절대 주소임
절대 주소: 실제 물리주소를 가리키는 주소, 메모리 관리자 입장에서 바라본 주소
-물리 주소 공간: 절대 주소를 사용하는 주소 공간
상대 주소: 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용, 사용자 프로세스 입장에서 바라본 주소
-논리 주소 공간: 상대 주소를 사용하는 주소 공간
상대 주소 -> 절대 주소 변환
1. 사용자 프로세스가 상대 주소 40번지에 있는 데이터를 요청
2. CPU는 메모리 관리자에게 40번지에 있는 내용을 가져오라고 명령
3. 메모리 관리자는 재배치 레지스터를 사용해 상대 주소 40번지를 절대 주소 400번지로 변환하고 메모리 400번지에 저장된 데이터를 가져옴(재배치 레지스터의 값은 360임)
단일 프로그래밍 환경에서의 메모리 할당
1) 메모리 오버레이
메모리 오버레이: 프로그램의 크기가 실제 메모리(물리 메모리)보다 클 때 전체 프로그램을 메모리에 가져오는 대신 적당한 크기로 자라서 가져오는 기법
프로그램을 몇 개의 모듈로 나누고 필요할 대마다 모듈을 메모리에 가져와 사용
어떤 모듈을 가져오거나 내보낼지는 CPU 레지스터 중 하나인 프로그램 카운터(PC)가 결정함
*한정된 메모리에서 메모리보다 큰 프로그램 실행이 가능
*프로그램 전체가 아닌 일부만 메모리에 올라와도 실행이 가능함
2) 스왑
메모리 오버레이에서 프로그램의 전체 중 일부만을 메모리에 올렸는데 올리지 않은 나머지 영역을 잠시 보관하는 영역
즉 메모리가 모자라 쫓겨난 프로세스는 저장장치의 특별한 공간에 모아두고 이 영역을 스왑 영역이라고 함
스왑 영역은 HDD의 일부로 하드디스크는 저장장치 관리자가 관리하지만, 스왑 영역은 메모리 관리자가 관리함
사용자는 실제 메모리의 크기와 스왑 영역의 크기를 합쳐 전체 메모리로 인식하고 사용함
ex) [최대 절전 모드]는 현재 작업 중인 상태 그대로 쉬게 하는 것 -> 현재 메모리에 있는 데이터를 스왑 영역으로 옮김
다중 프로그래밍 환경에서의 메모리 할당
1) 메모리 분할 방식
메모리를 어떤 크기로 나눌 것 인가?
-가변 분할 방식: 프로세스의 크기에 따라 메모리를 나누는 것(연속된 중간에 배치돼 연속 메모리 할당이라고도 함)
-고정 분할 방식: 프로세스의 크기와 상관없이 메모리르 같은 크기로 나누는 것
장/단점
가변 분할 방식 장점: 프로세스를 한 덩어리로 처리해 하나의 프로세스를 연속된 공간에 배치함
가변 분할 방식 단점: 메모리 관리가 복잡함
고정 분할 방식 장점: 메모리 관리가 수월함
고정 분할 방식 단점: 쓸모없는 공간으로 인한 메모리 낭비가 발생
2) 가변 분할 방식의 메모리 관리
가상 메모리 기법에서는 세그먼트 기법이라고 함
외부 단편화 현상: 할당할 프로세스의 크기보다 메모리에 남아 있는 조각이 작아 할당이 불가능한 현상
외부 단편화 현상 해결 방법
1. 최초 배치: 메모리 중 가장 첫번째로 발견한 공간에 앉게 배치
2. 최적 배치: 메모리의 빈 공간을 모두 확인해 적당한 크기 가운데 가장 작은 공간에 프로세스 배치
3. 최약 배치: 최적 배치와 반대로 가장 큰 공간에 프로세스를 배치
4. 조각 모음: 1~3을 해도 단편화가 발생하기 때문에 배치된 프로세스를 옆으로 옮겨 빈 공간들을 하나의 큰 덩어리로 만들어 주는 거(시간이 많이 걸림)
3) 고정 분할 방식의 메모리 관리
내부 단편화: 각 메모리 조각에 프로세스를 배치하고 공간이 남는 현상
가변 분할 방식과는 다르게 고정 분할 방식에서는 조각 모음을 할 수 없음 -> 동일하게 분할되는 공간의 크기를 조절해 내부 단편화를 최소화 시킴
4) 버디 시스템
외부 단편화를 완화하는 방법으로 가변 분할 방식과 고정 분할 방식의 중간 구조임
1. 프로세스의 크기에 맞게 메모리를 1/2로 자르고 프로세스를 메모리에 배치
2. 나뉜 메모리의 각 구역에는 프로세스 1개만 들어감
3. 프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 덩어리를 만듦
특징
1. 가변 분할 방식처럼 메모리가 프로세스 크기대로 나뉨
2. 고정 분할 방식처럼 하나의 구역에 다른 프로세스가 들어갈 수 없음
3. 메모리의 한 구역 내부에 조각이 생겨 내부 단편화 발생
4. 비슷한 크기의 덩어리가 서로 모여있어 통합하기 쉬움
그러나 고정 분할 방식이 버디 시스템보다 메모리 관리 측면에서 단순하기 때문에 버디 시스템보다는 고정 분할 방식을 더 사용함
참고 사이트
https://velog.io/@thalals/OS-7.-%EB%AC%BC%EB%A6%AC-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC
'Computer > Operating system' 카테고리의 다른 글
window OS structure (0) | 2022.10.04 |
---|---|
메모리 관리_가상 메모리의 기초 (0) | 2022.01.08 |
Operating system(2)-2 (0) | 2021.12.18 |
Operating system(2)-1 (0) | 2021.12.18 |
Operating system(1) (0) | 2021.08.13 |