일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 마곡속눈썹연장
- 다시보기
- 직무면접
- OS
- 카카오
- leetcode
- 등촌동속눈썹연장
- 리트코드
- 딥러닝
- 삼성
- 수학
- 추석트래픽
- level2
- 1차면접
- 삼성 SW역량테스트 기출
- 마곡속눈썹펌
- 포스코
- 알고리즘
- ai/bigdata
- 백준
- BOJ
- 삼성SW역량테스트
- 투포인터
- 등촌동속눈썹펌
- 운영체제
- 프로그래머스
- 정렬
- 코딩테스트
- 시뮬레이션
- Java
- Today
- Total
기록하는 습관을 들이자
[ 운영체제 정리 ] 7장 메모리 관리 - 운영체제와 정보기술의 원리 본문
※ 해당 포스팅은 이화여대 반효경 교수님 저서 [운영체제와 정보기술의 원리] 책 내용을 기반으로 작성되었습니다.
우리가 사는 집마다 고유의 주소가 있듯이 메모리 역시 주소를 통해 접근하는 저장장치이다.
우리가 사용하는 컴퓨터 시스템은 흔히 32비트 혹은 64비트 주소 체계를 사용한다.
-> 32비트 주소 체계를 사용할 경우 2^32가지 서로 다른 메모리 위치를 구분할 수 있으며, 컴퓨터에서는 byte 단위로 메모리 주소를 부여하기 때문에 2^32 바이트만큼의 메모리 공간에 서로 다른 주소를 할당할 수 있다!
1. 주소 바인딩
앞 장에서 살펴보았듯이 프로그램이 실행을 위해 메모리에 적재되면 그 프로세스를 위한 독자적인 주소 공간이 생성된다. 이 주소를 논리적 주소(logical address) 혹은 가상 주소(virtual address)라고 부른다. 논리적 주소는 각 프로세스마다 독립적으로 할당되며 0번지부터 시작된다.
반면 물리적 주소(physical address)는 물리적 메모리에 실제로 올라가는 위치를 말한다. 물리적 메모리의 낮은 주소 영역에는 운영체제가 올라가고 높은 주소 영역에는 사용자 프로세스들이 올라간다.
CPU가 기계어 명령을 실행하기 위해 논리적 주소를 통해 메모리 참조를 하게 되면 해당 논리적 주소가 물리적 메모리의 어느 위치에 매핑되는지 확인해야한다. 이렇게 프로세스의 논리적 주소를 물리적 메모리 주소로 연결시켜주는 작업을 주소 바인딩(address binding)이라고 한다.
물리적 메모리의 주소가 결정되는 시기에 따른 주소 바인딩의 방식
- 컴파일 타임 바인딩(compile time binding): 프로그램을 컴파일할 때 물리적 메모리 주소가 결정됨 -> 즉, 물리적 메모리 주소를 변경하고 싶다면 컴파일을 다시해야한다. -> 잘 사용하지 않는 방식!
- 로드 타임 바인딩(load time binding): 프로그램 실행이 시작될 때 물리적 메모리 주소가 결정됨. 프로그램이 종료될 때까지 물리적 메모리상의 위치가 고정된다.
- 실행시간 바인딩(execution time binding): 프로그램이 실행을 시작한 후에도 그 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식. 이 방식은 CPU가 논리적 메모리 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 주소 매핑 테이블(address mapping table)이 필요하다. 기본적으로는 MMU(Memory Management Unit)이라는 하드웨어를 이용.
2. 메모리 관리와 관련된 용어
1) 동적로딩(dynamic loading)
: 여러 프로그램이 동시에 메모리에 올라가서 수행되는 다중 프로그래밍 환경에서 메모리 사용의 효율성을 높이기 위해 사용하는 기법 중 하나. 프로세스가 시작될 때 그 프로세스의 주소 공간 전체를 메모리에 다 올려놓는 것이 아니라 메모리를 좀 더 효율적으로 사용하기 위해 해당 부분이 불릴 때 그 부분만을 메모리에 적재하는 방식. 즉 프로세스 내에서 실행에 필요한 부분이 실제로 불릴 때마다 메모리에 적재하는 것을 말한다.
2) 동적연결(dynamic linking)
: 연결(linking)이란 프로그래머가 작성한 소스코드를 컴파일하여 생성된 목적 파일(object file)과 이미 컴파일된 라이브러리 파일들을 묶어서 하나의 실행파일을 생성하는 과정을 말한다.
동적 연결은 컴파일을 통해 생성된 목적 파일과 라이브러리 파일 사이의 연결을 프로그램의 실행 시점까지 지연시키는 기법!
정적 연결에서는 목적 파일과 라이브러리가 모두 합쳐져서 실행파일이 생성되기에 실행파일의 크기가 상대적으로 크며 동일한 라이브러리를 각 프로세스가 개별적으로 메모리에 적재해야 하므로 물리적 메모리가 낭비되는 단점이 있다.
동적 연결에서는 프로그램이 실행되면서 라이브러리 코드가 호출될 때가 되어서야 라이브러리에 대한 연결이 이루어진다. 즉 실행 파일에 라이브러리 코드가 포함되지 않는다. 라이브러리 호출 시 스텁을 통해 해당 라이브러리가 메모리에 이미 존재하는지 살펴보고 그럴 경우 그 주소의 메모리 위치에서 직접 참조하며, 그렇지 않을 경우 디스크에서 동적 라이브러리 파일을 찾아 메모리에 적재한 후 수행. -> 동일한 라이브러리는 메모리에 한 번만 적재하므로 메모리 사용의 효율성 증대!
3) 중첩(overlays)
: 프로세스의 주소 공간을 분할해 실제 필요한 부분만을 메모리에 적재하는 기법을 말한다.
-> 동적 로딩과 비슷한 개념이지 않나? 맞다. 하지만 목적이 다르다.
동적 로딩은 메모리에 더 많은 프로세스를 동시에 올려놓고 실행하기 위한 용도인 반면, 중첩은 단일 프로세스만을 메모리에 올려놓는 환경에서 메모리 용량보다 큰 프로세스를 실행하기 위한 어쩔 수 없는 선택!
4) 스와핑(swapping)
: 메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 스왑 영역에 일시적으로 내려놓는 것.
(파일 시스템과 다른 점은 파일 시스템은 전원이 나가더라도 그 내용이 유지되는 비휘발성 저장공간인 반면, 스왑 영역은 프로세스가 수행 중인 동안에만 디스크에 일시적으로 저장하는 공간) -> 중기 스케줄러에 의해 메모리 다중 프로그래밍의 정도를 조절하기 위함!
앞선 컴파일 타임 바인딩 방식과 로드 타임 바인딩 방식에서는 스왑 아웃된 프로셋가 다시 스왑 인될 때에는 원래 존재하던 메모리 위치로 다시 올라가야 한다. 반면 실행시간 바인딩 기법에서는 추후 빈 메모리 영역 아무 곳에나 프로세스를 올릴 수 있다.
3. 물리적 메모리의 할당 방식
여기서는 사용자 프로세스 영역의 관리 방법에 대해서 살펴보고자 한다.
사용자 프로세스 영역의 관리 방법은 프로세스를 메모리에 올리는 방식에 따라 연속할당 방식과 불연속할당 방식으로 나누어볼 수 있다.
- 연속할당 방식: 프로세스를 물리적 메모리의 연속적인 공간에 올리는 방식. 고정분할 방식과 가변분할 방식으로 나뉜다.
- 불연속할당 방식: 하나의 프로세스를 물리적 메모리의 여러 영역에 분산해 적재하는 방식. 페이징 기법과 세그멘테이션 기법이 있다.
1) 연속할당 방식
- 고정분할 방식 : 물리적 메모리를 주어진 개수만큼의 영구적인 분할로 미리 나누어두고 각 분할에 하나의 프로세스를 적재해 실행시킬 수 있도록 한다. -> 단점: 동시에 메모리에 올릴 수 있는 프로세스의 수가 고정, 외부 단편화(프로그램 크기가 분할의 크기보다 커 해당 분할이 비어 있는데도 불구하고 이용할 수 없는 메모리 공간)와 내부 단편화(프로그램 크기보다 분할의 크기가 큰 경우 프로그램을 적재하고 남는 메모리 공간) 발생
- 가변분할 방식: 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식. 해당 방식에서 주요하게 다르는 쟁점 중 하나는 주소 공간의 크기가 n인 프로세스를 메모리에 올릴 때 물리적 메모리 내 가용 공간 중 어떤 위치에 올릴지 결정하는 문제이다. 대표적인 방법으로 최초 적합(first-fit: 가장 먼저 찾아지는 곳에 프로세스 할당), 최적 적합(best-fit: 크기가 n 이상인 가장 작은 가용 공간을 찾아 할당), 최악 적합(worst-fit: 가용 공간 중에 가장 크기가 큰 곳에 할당)
2) 불연속할당 기법
하나의 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당 기법을 의미한다. 하나의 프로그램을 동일한 크기로 나누어 메모리에 올리는 페이징(paging) 기법과 크기는 일정하지 않지만 의미 단위로 나누어 메모리에 올리는 세그먼테이션(segmentation) 기법이 존재한다.
4. 페이징 기법
페이징 기법에서는 각 프로세스의 주소 공간 저체를 물리적 메모리에 한꺼번에 올릴 필요가 없으며, 일부는 백킹스토어에, 일부는 물리적 메모리에 혼재시키는 것이 가능하다.
페이징 기법에서는 물리적 메모리를 페이지와 동일한 크기의 프레임(frame)으로 미리 나누어둔다. 메모리에 올리는 단위가 동일한 크기의 페이지 단위이므로 같은 크기로 분할해두어 연속할당에서 발생했던 문제가 발생하지 않는다는 장점을 가진다.
1) 주소 변환 기법
: 페이징 기법에서는 CPU가 사용하는 논리적 주소를 페이지 번호(p)와 페이지 오프셋(d)으로 나누어 주소 변환(address translation)에 사용한다. 페이지 번호는 페이지 테이블 접근 시 인덱스로 사용되고, 해당 인덱스의 항목에는 그 페이지의 물리적 메모리상의 기준 주소(base address), 즉 시작 위치가 저장된다. 한편 페이지 오프셋은 하나의 페이지 내에서의 변위(displacement)를 알려준다. 따라서 기준 주소값에 변위를 더함으로써 요청된 논리적 주소에 대응하는 물리적 주소를 얻을 수 있다.
2) 페이지 테이블의 구현
페이지 테이블은 페이징 기법에서 주소 변환을 하기 위한 자료구조로, 물리적 메모리에 위치하게 된다. 페이징 기법에서의 메모리 접근 연산은 주소 변환을 위해 페이지 테이블에 접근하는 것 1번, 그리고 변환된 주소에서 실제 데이터에 접근하는 것, 이렇게 2번의 메모리 접근을 필요로 한다.
-> 이렇게 메모리에 두 번 접근해야하는 오버헤드를 줄이기 위해 TLB(Translation Look-aside Buffer)라고 불리는 고속의 주소 변환용 캐시가 사용된다.
메모리에 비해 TLB로 사용되는 하드웨어는 가격이 비싸기 때문에 페이지 테이블의 모든 정보를 담을 수는 없으며, 빈번히 참조되는 페이지에 대한 주소 변환 정보만을 담게 된다. 따라서, 요청된 페이지 번호가 TLB에 존재한다면 곧바로 대응하는 물리적 메모리의 프레임 번호를 얻을 수 있지만, TLB에 존재하지 않는 경우에는 메인 메모리에 있는 페이지 테이블로부터 프레임 번호를 알아내야 한다.
5. 세그먼테이션(Segmentation)
프로세스의 주소 공간을 의미 단위의 세그먼트(segment)로 나누어 물리적 메모리에 올리는 기법이다.
하나의 프로세스를 구성하는 주소 공간은 일반적으로 코드, 데이터, 스택 영역으로 나뉘는데, 이렇게 기능 단위로 세그먼트를 정의한다. 페이징 기법과 같이 특정 크기 단위로 나누지 않는다.
세그먼테이션 기법에서는 논리적 주소가 <세그먼트 번호, 오프셋>으로 나뉘어 사용된다. 세그먼트 번호는 해당 논리적 주소가 프로세스 주소 공간 내에서 몇 번째 세그먼트에 속하는지를 나타내며, 오프셋은 그 세그먼트 내에서 얼마만큼 떨어져 있는지에 대한 정보를 나타낸다.
'운영체제' 카테고리의 다른 글
[ 운영체제 정리 ] 6장 CPU 스케줄링 - 운영체제와 정보기술의 원리 (0) | 2020.09.04 |
---|---|
[ 운영체제 정리 ] 5장 프로세스 관리 - 운영체제와 정보기술의 원리 (0) | 2020.09.04 |
[ 운영체제 정리 ] 4장 프로그램의 구조와 실행 - 운영체제와 정보기술의 원리 (0) | 2020.09.04 |
[ 운영체제 정리 ] 3장 컴퓨터 시스템의 동작 원리 - 운영체제와 정보기술의 원리 (0) | 2020.09.03 |
[ 운영체제 정리 ] 2장 운영체제 개요 - 운영체제와 정보기술의 원리 (0) | 2020.09.03 |