일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 카카오
- 회고
- vercel
- REST_API
- level1
- javascript
- useState
- redux
- React
- 백준
- 해시테이블
- web
- 큐
- html
- 30daysdowoonchallenge
- 자바스크립트
- CSS
- 프로그래머스
- Next.js
- superstarjypnation
- UX
- 운영체제
- 프로토타입
- mysemester
- 스택
- Til
- UI
- 코드스테이츠
- 자료구조
- 생활코딩
- Today
- Total
데굴데굴
07. 메모리 관리 - 1 본문
주소는 32비트 체계와 64비트 체계로 나뉜다.
32비트로 구성하면 232바이트 만큼의 메모리 공간에 서로 다른 주소를 할당할 수 있다.
이렇게 구성된 메모리 공간을 그대로 쓰지 않고 체계적으로 나눠서 사용한다.
page = 4KB(212byte) 단위로 묶은 것
32비트 주소 체계의 한 페이지 내에서 바이트별 위치 구분을 위해서는 12비트가 필요
논리적 주소(Logical address, virtual address): 프로세스마다 독립적으로 가지는 주소 공간
물리적 주소 (Physical address): 메모리에 실제로 올라가는 위치
주소 바인딩: 메모리 주소를 결정하는 것
Logical Address에서 Physical Address로 변환되는 시점이 어디인가?
주소 바인딩 (Address Binding)
물리적 메모리 주소가 결정되는 방식에 따라 세 가지로 나뉜다.
1. Compile time binding
컴파일 시 물리적 메모리 주소가 결정됨
프로그램이 절대 주소로 적재된다는 뜻에서 절대 코드(absolute code)를 생성한다고도 한다.
물리적 메모리 주소를 변경하고 싶다면 재컴파일해야 한다.
현대의 시분할 컴퓨팅 환경에서는 잘 사용하지 않는다.
2. Load time binding
프로그램의 실행이 시작될 때 물리적 메모리 주소가 결정됨
Loader의 책임 하에 물리적 메모리 주소를 부여한다
컴파일러가 재배치 가능 코드(relocatable code)를 생성한 경우 가능
3. Execution time binding(=runtime binding)
수행이 시작된 후에도 프로세스의 메모리 상 위치를 옮길 수 있음
cpu가 주소를 참조할 때마다 address mapping table을 이용해 binding을 점검
하드웨어적인 지원이 필요하다 (MMU)
🙋♀️ cpu가 바라보는 주소는 logical address인가 physical address인가?
=> logical address이다.
세 방식을 보면 옆의 검은 숫자로 표기된 physical address는 계속 바뀌고 있지만, instruction 내부에 있는 변수의 메모리 주소는 20,30으로 그대로 표기된 것을 볼 수 있다.
따라서 cpu가 참조하는 것은 logical address이다.
MMU (Memory-Management Unit)
주소 바인딩 중 Execution time binding 방식에 필요한 하드웨어
기준 레지스터(base register)와 한계 레지스터(limit register)의 도움을 받아 동작
MMU Scheme
cpu가 특정 프로세스의 논리적 주소를 참조하려고 할 때 그 주소값에 기준 레지스터의 값을 더해 물리적 주소값을 알아낸다.
(기준 레지스터는 재배치 레지스터 relocation register라고도 한다)
만약 기준 레지스터를 더한 값이 한계 레지스터를 초과하게 되면 다른 프로세스의 영역을 침범할 수 있으므로 트랩을 발생시켜 해당 프로세스를 강제종료시킨다.
사용자 프로그램은 logical address만을 다룬다.
관련 용어
compiler - linker - loader
Dynamic Loading
다중 프로그래밍 환경에서 메모리 사용의 효율성을 높이기 위해 사용하는 방법
해당 루틴이 불려질 때 그 부분만 메모리에 load하는 방식
운영체제의 지원 없이 프로그램 자체에서 구현할 수 있다. (OS 라이브러리 이용)
paging 기법 /= dynamic loading 기법
Overlays
메모리에 프로세스 부분 중 실제로 필요한 부분만 올려놓는 것
프로세스의 크기가 메모리보다 클 때 유용하다
프로세스의 주소 공간을 분할한다
사용자가 직접 구현한다
실제로 필요한 부분만 메모리에 올린다는 점에서 dynamic loading과 유사한 듯 보이지만 사용 이유가 다르다.
overlays는 작은 공간의 메모리를 사용하던 초창기 시스템에서 메모리를 효율적으로 쓰기 위해 프로세스의 주소 공간을 분할하는 방식을 말한다. 즉, 프로그램의 크기가 물리적 메모리의 크기보다 작다면 그냥 올려버린다.
반면 dynamic loading은 다중 프로그래밍 환경에서 메모리의 이용률을 향상시키기 위한 방법이다. 프로그램의 크기가 물리적 메모리의 크기보다 작아도 쪼개서 불려진 부분만 올린다.
Swapping
프로세스를 일시적으로 메모리에서 backing store(하드디스크)로 쫓아내는 것 [[3강 Process 1#스케줄러|참고: 중기 스케줄러]]
swap out = memory -> backing store
swap in = memory <- backing store
메모리에 존재하는 프로세스의 수를 조절하는 것이 목적
다중 프로그래밍의 정도(degree of multiprogramming)를 조절한다.
프로세스가 종료되어 그 주소 공간을 디스크로 내쫓는 것이 아님에 유의!
동작 과정
- 중기 스케줄러가 스왑아웃시킬 프로세스 선정
- 스왑 아웃
효율적으로 동작하기 위해서는 runtime binding이 유용하다.
swap time은 대부분 transfer time이다.
Dynamic Linking
Linking = 여러 군데에 존재하는 컴파일된 파일을 하나로 모아서 실행 파일로 만드는 과정
목적 파일(object file)과 컴파일된 라이브러리 파일(library file)을 묶어서 실행 파일로 만든다.
Static Linking
라이브러리 파일이 프로그램의 실행 파일 코드에 포함됨
Dynamic Linking
실행 시점에 라이브러리 파일이 연결된다.
실행 파일 안에 라이브러리의 위치를 찾기 위한 stub이라는 작은 코드를 둔다.
dynamic linking이 가능하도록 만들어주는 라이브러리 = shared library (DLL)
구현에 운영체제의 도움이 필요하다.
물리적 메모리의 할당 방식
OS 상주 영역과 사용자 프로세스 영역
연속 할당 (Continuous Allocation)
1. 고정 분할 방식
사용자의 프로그램이 들어갈 크기를 미리 나눠 놓는 방식
낭비되는 메모리 조각이 발생한다. (내부 조각과 외부 조각)
2. 가변 분할 방식
프로그램이 실행될 때마다 메모리에 차곡차곡 올려놓는 방식
외부 조각은 생기지만 내부 조각은 생기지 않는다.
Hole: 가용 메모리 공간
동적 메모리 할당 문제 (Dynamic storage-allocation problem)
주소 공간의 크기가 n인 프로세스를 메모리에 올릴 때 가용 공간 중 어떤 위치에 올릴 것인가
- 최초적합 first-fit
- 메모리에 존재하는 가용 공간을 차례대로 살펴보면서 프로그램 크기보다 작으면 건너뛰고 그렇지 않은 가용 공간이 최초로 발견되면 거기에 프로그램 할당 (시간적 측면에서 효율적)
- 최적적합 best-fit
- 가용 공간 중에서 크기가 n 이상인 가장 작은 가용 공간을 찾아 새 프로그램 할당 (공간적 측면에서 효율적)
- 최악적합 worst-fit
- 가용 공간 중에서 크기가 가장 큰 곳에 새 프로그램 할당
컴팩션 (Compaction)
연속 할당 방식에서 발생하는 외부 조각 문제를 해결하는 방법
사용 중인 메모리 영역을 한 군데로 몰아서 큰 블록으로 만듦
비용이 많이 들기 때문에 최소한의 메모리 이동으로 compaction하는 방법이 필요하다.
또 프로그램 실행 중에 메모리 주소가 변경되기 때문에 execution time binding 방식에서만 가능한 방법이다.
불연속 할당 (Noncontinuous Allocation)
현대 시분할 시스템에서 많이 쓰이는 방식
한 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당 기법
- 페이징 기법 - 주소 공간을 동일한 크기의 페이지로 자른다
- 세그먼테이션 기법 - 주소 공간을 의미 있는 단위로 자른다 (크기가 균일하지는 않음)
- 페이지드 세그먼테이션 기법 - 세그먼테이션을 기반으로 하되 이를 다시 페이지로 나눈다
'CS > 운영체제' 카테고리의 다른 글
07. 메모리 관리 - 3, Segmentation (0) | 2023.08.04 |
---|---|
07. 메모리 관리 - 2, Paging (1) | 2023.08.03 |
07. Deadlock (0) | 2023.07.12 |
06. 프로세스 동기화 - 2 (0) | 2023.07.06 |
06. 프로세스 동기화 - 1 (0) | 2023.07.04 |