728x90
메모리 관리
- CPU의 작업 공간 = 메모리, 모든 프로그램은 메모리에 올라와야 실행 가능
- 메모리 구조는 1B 크기로 나뉨, 각 영역은 메모리 주소로 구분 (0번지부터 시작)
- 메모리 주소 레지스터 (MAR) : CPU가 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 사용
- 메모리 관리의 이중성
- 프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 되도록 관리를 효율적으로 하고 싶어 하는 것
- 프로세스 입장에서의 작업의 편리함과 관리자 입장에서 관리의 편리함이 충돌을 일으키는 것
소스코드의 번역과 실행
- 컴파일러와 인터프리터
- 저급 언어 (low level language) : 컴퓨터의 동작을 가장 직접적으로 표현한 언어, 기계어(0과 1)/어셈블리어
- 고급 언어 (high level language) : 사용자가 이해하기 쉽게 프로그래밍할 수 있는 언어, C언어/자바
- 언어 번역 프로그램 : 고급 언어로 작성한 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역하는 프로그램
- 컴파일러 (compiler) : 소스코드를 기계어로 번역 후 한 번에 실행, C언어/자바
- 인터프리터 (interpretor) : 소스코드를 한 행씩 번역하여 실행, 자바스크립트/베이직
- 컴파일러와 인터프리터의 차이
- 컴파일러 사용 프로그래밍 언어는 사용할 변수 먼저 선언 후 사용
- 컴파일러는 실행 전에 소스코드 점검하여 오류 수정, 최적화
- 인터프리터는 한 줄씩 위에서부터 아래로 실행되기 때문에 같은 일 반복하는 경우/필요 없는 변수 확인 불가
- 따라서 크고 복잡한 프로그램에는 컴파일러 사용, 간단한 프로그램에는 인터프리터 사용
- 컴파일러의 목적
- 오류 발견 : 변수 선언부에 명시한 각 변수의 이름과 종류를 모아놓은 테이블인 심벌 테이블(symbol table) 사용
- 코드 최적화
- 컴파일 과정
- 소스코드 작성
- 컴파일러를 통해 소스코드를 0과 1의 기계어로 번역 (목적코드)
- 목적코드와 라이브러리 연결 (라이브러리 : 자주 사용하는 함수를 시스템 내에 미리 만들어둔 것)
- 동적 라이브러리를 포함하여 최종 실행
동적 라이브러리 : 실행할 때 삽입되는 함수를 가진 라이브러리
DLL (Dynamic Link Loader) : 윈도우에서의 동적 라리브러리
메모리 관리자
- 일반적으로 메모리 관리 유닛(MMU; Memory Manage Unit)이라는 하드웨어
- 메모리 관리자의 작업
- 가져오기 (fetch)
- 프로세스와 데이터를 메모리로 가져오는 작업
- 어떤 상황에서는 데이터의 일부만 가져와 실행하기도 함 (ex 용량이 큰 동영상)
- 사용자의 요청이 없더라도 앞으로 필요할 것이라고 예상되는 데이터를 미리 가져오기도 함
- 배치 (placement)
- 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업
- 재배치 (replacement)
- 꽉 차있는 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업
- 메모리 관리 정책
- 가져오기 정책
- 프로세스가 필요로 하는 데이터를 언제 메모리로 가져올지 결정하는 정책
- 일반적으로는 프로세스가 요청할 때 메모리로 가져옴
- prefetch : 필요하다고 예상되는 데이터를 미리 가져오는 방법
- 배치 정책
- 가져온 프로세스를 메모리의 어떤 위치에 올려놓을지 결정하는 정책
- 페이징 (paging) : 메모리를 같은 크기로 자르는 것
- 세그먼테이션 (segmentation) : 프로세스의 크기에 맞게 자르는 것
- 페이징과 세그먼테이션의 장단점을 파악하여 메모리를 효율적으로 관리할 수 있도록 정책을 만드는 것
- 재배치 정책
- 메모리가 꽉 찼을 때 메모리 내에 있는 어떤 프로세스를 내보낼지 결정하는 정책
- 앞으로 사용하지 않을 프로세스를 내보내면 시스템 성능 상승, 자주 사용할 프로세스를 내보내면 성능 감소
- 교체 알고리즘 (replacement algorithm) : 앞으로 사용하지 않을 프로세스를 찾아서 내보내는 알고리즘
메모리 주소
- 메모리에 접근할 때는 주소를 이용
- 34bit CPU / 64bit CPU
- CPU의 비트 : 한 번에 다룰 수 있는 데이터의 최대 크기
- CPU의 내부 부품은 비트를 기준으로 제작 (레지스터 크기, 산술 논리 연산장치, 데이터 전송 버스 크기(대역폭), 대역폭의 버스를 통해 옮겨지는 데이터 크기 등)
- 물리 주소 공간 (physical address space) : 컴퓨터에 설치된 메모리의 주소 공간, 절대 주소 사용하는 주소 공간
- 논리 주소 공간 (logical address space) : 사용자 입장에서 바라본 주소 공간, 상대 주소 사용하는 주소 공간
- 절대 주소와 상대 주소
- 절대 주소 (absoulte address) : 메모리 관리자 입장에서 바라본 주소, 실제 물리 주소
- 상대 주소 (relative address) : 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용하는 주소 지정 방식
- 상대 주소를 절대 주소로 변환 하기
- 사용자 프로세스가 상대 주소를 사용하여 메모리에 접근
- CPU는 메모리관리자에게 상대 주소의 내용 가져오라고 명령
- 메모리관리자는 재배치 레지스터 값을 더하여 절대 주소로 변환하고 절대 주소에 저장된 데이터 가져옴
- 재배치 레지스터 : 주소 변환의 기본이 되는 주소를 가진 레지스터, 메모리에서 사용자 영역 시작 주소값 저장됨
단일 프로그래밍 환경에서의 메모리 할당
- 메모리 오버레이
- 프로그램의 크기가 실제 메모리(물리 메모리)보다 클 때 전체 프로세스를 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 기법
- 프로그램을 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 사용
- 프로그램 전체를 메모리에 올려놓고 실행하는 것보다 속도가 느리지만 메모리가 프로그램보다 작을 때도 실행 가능
- 프로그램 카운터 (PC)
- 메모리 오버레이에서 어떤 모듈을 가져오거나 내보낼지 결정하는 CPU 레지스터
- 앞으로 실행할 명령어의 위치를 가리키는 레지스터
- 해당 모듈이 메모리에 없으면 메모리 관리자에게 요청하여 메모리로 가져오게 함
- 메모리 오버레이의 의미
- 한정된 메모리에서 메모리보다 큰 프로그램의 실행 가능
- 프로그램 전체가 아니라 일부만 메모리에 올라와도 실행 가능 (메모리를 여러 조각으로 나누어 여러 프로세스에 할당할 수도 있음)
- 스왑
- 스왑 영역 (swap area) : 메모리가 모자라서 쫓겨난 프로세스를 모아두는 저장장치의 공간
- 스왑인 (swap in) : 스왑 영역 → 메모리, 데이터 가져오기
- 스왑아웃 (swap out) : 메모리 → 스왑 영역, 데이터 내보내기
- 메모리 관리자가 관리
- 스왑을 이용하면 스왑 영역의 크기가 메모리 크기로 인식됨
(사용자는 실제 메모리 크기+스왑 영역 크기를 전체 메모리 크기로 인식)
다중 프로그래밍 환경에서의 메모리 할당
- 메모리 분할 방식
- 메모리 배치 정책에 해당
- 현대 운영체제에서는 기본적으로 고정 분할 방식 사용하며 일부분은 가변 분할 방식 혼합
[가변 분할 방식]
- 가상 메모리 시스템에서의 세그먼테이션
- 프로세스의 크기에 따라 메모리를 나누는 것
- 프로세스를 한 덩어리로 처리하여 하나의 프로세스를 연속된 공간에 배치, 연속 메모리 할당 (contiguous memory allocation)
- 메모리 통합 등의 부가적인 작업이 필요하여 메모리 관리 복잡
[고정 분할 방식]
- 가상 메모리 시스템에서의 페이징
- 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는 것
- 메모리 관리 수월
- 쓸모없는 공간으로 메모리 낭비 발생 가능 (일정하게 나누어진 공간보다 작은 프로세스가 올라올 경우)
- 가변 분할 방식의 메모리 관리
- 외부 단편화 (external fragmentation) : 할당할 프로세스보다 메모리에 남아있는 조각이 작아서 할당 불가능한 현상
- 해결 방법 : 메모리 배치 방식, 조각 모음
- 메모리 배치 방식
- 최초 배치 (first fit) : 단편화 고려하지 않고 메모리에서 적재 가능한 공간을 순서대로 찾다가 첫 번째로 발견한 공간에 프로세스를 배치하는 방법
- 최적 배치 (best fit) : 메모리의 빈 공간을 모두 확인한 후 적당한 크기 가운데 가장 작은 공간에 프로세스 배치
- 최악 배치 (worst fit) : 최적 배치와 정반대, 빈 공간을 모두 확인한 후 가장 큰 공간에 프로세스 배치
- 버디 시스템 (buddy system)
- 조각 모음 : 서로 떨어져 있는 여러 개의 빈 공간을 합치는 작업, 많은 시간 소요
- 조각 모음을 하기 위해 이동할 프로세스의 동작을 멈춤
- 프로세스를 적당한 위치로 이동, 프로세스의 상대 주소값 변경
- 위의 작업을 마친 후 프로세스 다시 시작
- 고정 분할 방식의 메모리 관리
- 내부 단편화 (internal fragmentation) : 각 메모리 조각에 프로세스를 배치하고 공간이 남는 현상
- 동일하게 분할되는 공간의 크기를 조절하여 내부 단편화 최소화
- 버디 시스템
- 가변 분할 방식이지만 고정 분할 방식과 유사한 점이 있음 (둘의 중간 구조)
- 작동 방식
- 프로세스 크기에 맞게 메모리를 1/2로 자르고 프로세스를 메모리에 배치
- 나뉜 메모리의 각 구역에는 프로세스가 1개만 들어감
- 프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 덩어리를 만듦
- 비슷한 크기의 덩어리가 서로 모여있어 통합이 쉬움 (조각모음을 하지 않아도 간단히 큰 덩어리 만들 수 있음)
- 효율적인 공간 관리 측면에서는 고정 분할 방식과 비슷한 수준
- 하지만 메모리 관리 측면에서 고정 분할 방식이 더 단순하여 많이 사용됨
728x90
'CS > Operating System' 카테고리의 다른 글
[OS] 교착 상태 (0) | 2021.12.09 |
---|---|
[OS] 임계구역, 임계구역 해결 (0) | 2021.12.06 |
[OS] 프로세스 간 통신 (0) | 2021.12.05 |
[OS]CPU 스케줄링 알고리즘 (0) | 2021.12.02 |
[OS] CPU 스케줄링 (0) | 2021.12.02 |
댓글