Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Express
- nodejs
- MySQL
- jest
- GIT
- 자료구조
- nestjs
- Sequelize
- Dinosaur
- cookie
- mongoose
- react
- flask
- dfs
- MongoDB
- 공룡게임
- AWS
- Bull
- TypeScript
- Nest.js
- Queue
- Python
- game
- OCR
- 정렬
- 게임
- class
- typeORM
- JavaScript
Archives
- Today
- Total
포시코딩
[운영체제] 7. Memory Management (1) 본문
728x90
키워드
memory, binding, mmu, dynamic loading, dynamic linking, overlay, swapping
Memory란?
- 주소를 통해 접근하는 매체
- 주소는 두가지로 나눌 수 있다.
- Logical Address: 논리적 주소
- Physical Address: 물리적 주소
Logical vs. Physical Address
Logical Address
(=Virtual Address)
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스마다 0번지부터 시작
- CPU는 하드웨어라 physical address를 바라볼 것 같지만
CPU가 바라보는 주소는 logical address임
-> 컴파일 되면 안에 들어가 있는 주소를 바꿀 수 없기 때문에
즉, 메모리 상의 주소는 바뀌지만 코드 상의 주소는 logical address로 남아있을 수 밖에 없다.
Physical Address
- 메모리에 실제 올라가는 위치
주소 바인딩
(=Address Binding)
- 어떤 프로그램이 물리적인 메모리 어디로 올라갈지 메모리 주소를 결정하는 것
- Symbolic Address -> Logical Address -> Physical Address
- Symbolic Address: 프로그래머 입장에서는 숫자로된 주소를 사용하지 않고 심볼로 된 주소를 사용
여기서 이 심볼로 된 주소를 Symbolic Address라고 함
ex) 변수 이름, 함수 이름 등 - 위 순서에서 Logical Address -> Physical Address 될 때 이 주소 바인딩 되는 시점이
정확히 언제인지? -> 아래 세 가지 시점으로 나뉨
Compile time binding
- compiile 시점에 이미 물리적인 메모리 주소가 결정
- 프로그램을 물리적인 메모리에 올릴 때 이미 결정되있는 주소로 올려야 되기 때문에
물리적인 메모리에 다른 주소가 많이 비어있음에도 0번지 위치부터 올려야 하기 때문에
굉장히 비효율적 - 예전에 컴퓨터 안에서 프로그램이 하나만 실행되는 환경에서는
다른 프로그램이 같이 올라갈 일이 없기 때문에 사용되었지만
현재는 사용하지 않음 - 논리적 주소이자 물리적 주소로 fix 되는 것이기에
Compile time binding에 의해서 만들어진 코드를 절대 코드(absolute code)라고 부른다. - 만약 메모리에 올라갈 위치를 바꾸고 싶다면 컴파일을 다시 해야함
Load time binding
- 실행이 시작될 때 주소 변환이 이루어짐
- 즉, 메모리에 올라갈 때 물리적인 메모리 주소가 결정
- 항상 특정 위치에 올라가야 되는게 아니라 비어있는 위치면 실행 시 어느 위치든 올라갈 수 있는
재배치 가능 코드(relocatable code)라고 부른다.
Execution time binding
- (=Run time binding)
- 프로그램이 시작된 이후에도 물리적인 주소가 바뀔 수 있는 방법
- 실행 시 주소가 결정되는 것까진 Load time binding과 동일하지만
실행 도중 주소가 바뀔 수 있음 - 현재의 컴퓨터 시스템은 Run time binding(=Execution time binding)을 지원
- 프로그램 시작 시 이미 주소가 결정되어 있는 위 방법들과 달리
실행중에도 주소가 계속 바뀌기 때문에
CPU가 어떤 메모리 주소를 요청할 때 마다 binding을 체크해봐야 함
-> 때문에 하드웨어적인 지원이 필요 (MMU)
Memory-Management Unit(MMU)
- logical address를 physical address로 매핑해주는 hardware device
Dynamic Relocation
- MMU에서 주소 변환을 할 때 register 두 개를 통해 진행
- 운영체제 및 사용자 프로세스 간의 메모리 보호를 위해 사용하는 레지스터
- Relocation register(=Base register): 접근할 수 있는 물리적 메모리 주소의 최소값
- Limit register: 논리적 주소의 범위
- limit register를 벗어나는 logical address를 요청하면 trap에 걸려
프로세스는 하던 일을 멈추고 CPU 제어권이 운영체제에 넘어감
MMU scheme
- 위 register 두 개를 이용한 Dynamic Relocation 참고
- 사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소값에 대해
base register(=relocation register)의 값을 더한다.
User program
- logical address만을 다룬다.
- 실제 physical address를 볼 수 없으며 알 필요가 없다.
몇가지 용어
- Dynamic Loading
- Overlays
- Swapping
- Dynamic Linking
* Loading: 메모리로 올리는 것
Dynamic Loading
- 프로그램을 메모리에 동적으로 올린다.
- 즉, 프로세스 전체를 메모리에 미리 다 올리는 것이 아닌
해당 루틴이 불려질 때 메모리에 load - memory utilization의 향상
- 가끔씩 사용되는 많은 양의 코드의 경우 유용 ex) 오류 처리 루틴
- * 현재의 페이징 기법과 Dynamic loading은 다름!
- 보통의 Dynamic loading은 운영체제가 지원해주는게 아니라 프로그래머가 직접 하는 것임
- 그렇다고 프로그래머가 수동으로 직접 다 하는게 아닌 OS가 라이브러리 형태로 지원
Overlays
- 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
- 작은 공간의 메모리를 사용하던 초창기 시스템에서 수작업으로 프로그래머가 구현
- Manual Overlay
- 프로그래밍이 매우 어렵고 복잡
- 운영체제의 지원없이 사용자에 의해 구현
- Dynamic loading과 개념적으론 동일하지만 목적이 다름
Swapping
- 프로세스를 일시적으로 메모리에서 backing store(하드디스크)로 쫓아내는 것
- Backing store(=swap area)
- 쫓겨나서 backing store로 내려가는 걸 swap out이라 부르고
메모리로 다시 올라오는 걸 swap in이라 부른다. - 일반적으로 중기 스케줄러(swapper)에 의해 swap out 시킬 프로세스 선정
- priority-based CPU scheduling algorithm
- priority가 낮은 프로세스를 swapped out
- priority가 높은 프로세스를 메모리에 올림
- Swapping이 효율적으로 사용되기 위해선 Execution time binding(=Run time binding)이 지원되는게 좋다.
- 메모리에서 프로그램을 통째로 쫓아내고 다시 올려놓는 일은 파일 입출력과 다르게
많은 양을 한꺼번에 올리고 내리는 일이라
Swap time은 대부분 transfer time(swap 되는 양에 비례하는 시간)이다.
Dynamic Linking
- Linking: 여러군데 존재하던 컴파일된 파일들을 묶어 하나의 실행파일로 만드는 과정
- Linking을 실행 시간(execution time)까지 미루는 기법
Static Linking vs. Dynamic Linking
- Static Linking
- 내가 소스파일을 여러 개 따로 코딩해서 Linking
- 라이브러리가 프로그램의 실행 파일 코드에 포함됨
- 실행 파일의 크기가 커짐
- 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비
ex) printf 함수의 라이브러리 코드
- Dynamic Linking
- 컴파일해서 실행 파일이 만들어질 때 포함되지 않은 상태로 남아있다가
실행 후 라이브러리가 실행 시 연결(link)됨 - 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 둠
- 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고
없으면 디스크에서 읽어옴 - 운영체제의 도움이 필요
- Dynamic Linking을 해주는 라이브러리를 shared library라고 부른다.
or Shared Object
or DLL(Dynamic Linking Library)
- 컴파일해서 실행 파일이 만들어질 때 포함되지 않은 상태로 남아있다가
728x90
'CS (Computer Science)' 카테고리의 다른 글
[운영체제] 7. Memory Management (3) (0) | 2023.05.17 |
---|---|
[운영체제] 7. Memory Management (2) (0) | 2023.05.11 |
[운영체제] 6. Deadlock (0) | 2023.05.09 |
[운영체제] 5. Process Synchronization (5) - 정리 + monitor (0) | 2023.05.08 |
[운영체제] 5. Process Synchronization (4) - semaphore를 통한 동시성 문제 해결 방법, monitor (0) | 2023.05.05 |