티스토리 뷰
Logical address VS physical address
Logical address(=vitual address)
프로세스마다 독립적으로 가지는 주소공간
각 프로세스마다 0번지 부터 시작
CPU가 보는 주소는 logical address
physical address
메모리에 실제 올라가는 위치(실행되기 위해서)
*주소바인딩 : 주소를 결정하는 것
Symbolic address(프로그래머가 지정/호출하는 변수/함수) -> Logical address -> physical address
물리적 메모리가 결정되는 시점
Compile time biniding
- 물리적 메모리에 다른 주소가 비어있어도, 컴파일시에 이미 물리적주소가 정해져서 그 위치로 올려야함
(다른 메모리가 비어져있어도, 컴파일시에 미리 결정되어서 그곳에 올려야함 -> 현재 OS에서는 안씀)
- 시작 위치 변경시 재 컴파일
Load time binding
- 프로그램이 시작되어서 메모리에 올라갈때 물리적인 메모리 주소가 결정이 됨
- Loader의 책임하에 물리적 메모리 주소 부여
Run time binding
- 실행시에 주소가 결정되나, 주소가 실행도중에 바뀔 수 있음(메모리에 쫓겨남)
- 수행이 시작된 이후에도 프로세스의 메모리상 위치를 옮길 수 있음
- CPU가 주소를 참조할때마다 binding을 점검(address mapping table)
*CPU가 변수나 함수를 참조할 때마다 binding을 점검하는 이유?
변수나 함수의 위치, 메모리 주소, 데이터 타입 등을 확인하여 올바른 값을 참조할 수 있도록 하기 위한 것
- 다른 함수나 모듈에서 사용되는 변수나 함수의 위치가 변경될 수 있음
- 동적으로 메모리를 할당하거나 해제하는 경우에는 할당된 메모리의 주소가 바뀔 수 있음
- 다양한 데이터 타입이 존재하며, 이에 따라 데이터의 크기가 달라질 수 있습니다. 따라서 변수나 함수를 참조할 때마다 데이터의 크기를 확인
*동적으로 메모리를 할당하거나 해제하는 경우?
- 프로그램 실행 중에 사용자 입력에 따라 메모리를 동적으로 할당하는 경우 ex.배열이나 리스트를 동적으로 할당
- 동적으로 생성된 객체를 사용하는 경우
- 메모리를 효율적으로 관리하기 위해 필요한 경우 일부 프로그램에서는 동적 메모리 할당을 사용하여 메모리 사용량을 최적화
MMU
MMU(Memeory Management Unit)
메모리 관리를 담당하는 하드웨어이다. CPU 코어 안에 탑재되어 가상 주소를 실제 메모리 주소로 변환해주는 장치이다. 두개의 register : base register와 limit register로 작업을 한다.
limit register : 혹시 이 논리주소가 프로그램 크기보다 큰 논리주소를 요청한것인지 먼저 확인
base register(=relocation register) : 접근할 수 있는 물리적 메모리 주소의 최소값
경계레지스터
고정분할방식 가변분할방식
고정 분할 방식 | 가변 분할 방식 | |
특징 | 메모리를 동일한 크기의 고정된 파티션으로 나누는 방식 | 메모리를 프로세스 크기에 따라 유동적으로 분할하는 방식 메모리에서 할당 가능한 공간을 검색하여, 요청한 프로세스 크기에 맞게 분할 |
단점 | - 프로세스 크기가 파티션 크기보다 작은 경우에는 남는 공간이 불필요하게 낭비 - 프로세스 크기가 파티션 크기보다 큰 경우에는 해당 프로세스를 수용할 수 없기 때문에, 메모리 낭비와 같은 문제가 발생 |
- 메모리에서 사용 가능한 공간이 분산되어 있어서, 큰 프로세스를 수용할 수 없는 상황( 파편화) 발생 |
장점 | 메모리 크기가 고정되어 있고, 프로세스 크기가 비교적 작을 때 유용 | 고정 분할 방식은 구현이 간단하고, 작은 프로세스에 대해서는 좋은 성능 메모리 크기가 유동적이고, 다양한 크기의 프로세스를 처리해야 할 때 유용 |
예시 | First-Fit, Best-Fit, Worst-Fit |
메모리의 연속할당 방식 세 가지를 설명해주세요. (first-fit, best-fit, worst-fit)
외부조각,내부조각
외부조각
- 메모리가 할당 및 해제 작업의 반복으로 작은 메모리가 중간중간에 존재 중간중간에 생긴 사용하지 않는 메모리가 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황
- 여유 공간이 여러 조각으로 나뉘는 현상
ex.고정 분할 방식에서는 할당된 파티션 크기보다 작은 프로세스는 해당 파티션을 사용할 수 없어서, 메모리 낭비와 외부 조각 문제가 발생 -> 분할하여 할당할 수 없으므로 프로세스D를 할당할 수 없는 문제가 발생합니다.
해결방법
메모리 할당 방식을 변경하거나, 파편화 문제를 해결하기 위한 알고리즘을 사용
내부조각
내부 조각은 메모리 할당 후에, 사용한 메모리 공간이 요청한 크기보다 큰 경우에 발생
발생하는 경우
외부 단편화는 메모리 할당과 해제가 반복되면서 발생하는 경우
1.메모리에서 프로세스를 실행하기 위해 할당된 메모리 블록을 해제하고,
2.다시 새로운 프로세스를 실행하기 위해 메모리 블록을 할당하는 경우
3.외부 단편화가 발생할 수 있습니다.
4.사용 가능한 메모리가 작은 조각으로 나누어지고, 이를 다른 프로세스가 사용하려고 해도 해당 메모리 조각이 충분히 크지 않아서 메모리 할당이 실패하게 됩니다.
ex. 메모리를 할당하는 최소 블록 크기를 10K라고 가정합시다. 만약 7K만큼의 공간을 사용하더라도 10K를 할당해야되고 나머지 3K를 낭비하게 됩니다.
해결방법
메모리 블록 크기를 동적으로 할당하거나, 할당된 메모리 블록을 다른 프로세스에 할당하는 방법을 사용
ETC
운영 체제에서 메모리 부족 상황을 해결하기 위해 사용되는 기법
Dynamic Loading
프로세스 전체를 메모리에 미리 다 올리는 게 아닌 해당 루틴이 불려질때 메모리에 load하는것(동적(필요할때마다) 로딩)
보통 프로그래머가 직접 올라가도록 함 -> 가끔씩 사용되는 많은 양의 코드의 경우 유용(오류 처리 루틴)
Overlays
메모리에 프로세스의부분 중 실제 필요한 정보만을 올림
프로세스의 크기가 메모리보다 클 때 유용, 사용자에 의해 구현
Swapping
프로세스를 일시적으로 메모리에서 backing store(=swap area)로 쫓아냄
일반적으로 중기 스케쥴러에서 swap out 시킬 프로세스 선정
- priority가 낮은 프로세스를 swapped out 시킴
- priority가 높은 프로세스를 메모리에 올려 놓음
Compile time/load time binding에서는 원래 메모리 위치로 swap in 해야함
swap out : 메모리에 올라온 프로세스 중 일부 -> 하드 디스크
swap in : 하드 디스크에 있는 프로세스 중 일부 -> 메모리
swap time : 대부분 treansfer time(= swap되는 양에 비례하는 시간)임
*출처
https://junghyun100.github.io/%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%8B%A8%ED%8E%B8%ED%99%94/
https://lass.cs.umass.edu/~shenoy/courses/fall12/lectures/Lec12.pdf
https://jhi93.github.io/category/os/2019-12-20-operatingsystem-08-1/
'OS' 카테고리의 다른 글
[OS] DeadLock(데드락) (0) | 2023.03.19 |
---|---|
[OS] Process 동기화 - 싱글코어가 아니라 멀티코어라면, 어떻게 동기화가 이뤄질까요? (3) | 2023.03.14 |
[OS] Process 동기화(세마포어,뮤텍스,모니터) (1) | 2023.03.13 |
[OS] Process (0) | 2023.03.06 |
[OS] CPU Scheduler (1) | 2023.03.06 |