-
메모리
메인메모리
- 프로그램이 실행되려면 해당 부분이 메모리에 올라가 있어야 한다.
- 다수의 프로세스들이 나누어 사용할 수 있도록, 서로의 영역을 침범하지 않도록 유지해야 한다. 이와 같은 기능을 OS에서 제공한다.
프로세스 메모리 구조
- stack영역: 함수 호출과 관계되는 지역변수, 매개변수가 저장된다. 함수 호출 시 생성되고 함수가 끝나면 반환된다. 메모리의 높은 주소부터 할당된다. heap영역과 같은 공간을 공유한다.
- heap영역: 메모리를 동적으로 할당할 때 사용하는 메모리 영역으로 동적 메모리 영역이라고 부른다. 메모리의 낮은 주소부터 할당된다. stack영역과 같은 공간을 공유한다.
- data영역: 전역 변수, 정적 변수, 배열, 구조체 등이 저장된다. 프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환된다.
- code영역: 실행 명령을 포함하는 코드들이 들어가는 부분이다. 읽기 전용 영역이다.
메모리 구조의 순서
- 레지스터 -> CPU 캐시 메모리 -> 메인 메모리 -> 보조기억장치 -> 외부 기억장치 순으로 CPU와 멀어진다.
- CPU와 멀어질수록 데이터를 저장하는 용량이 커지고 접근 속도는 느려진다.
고정 분할 기법(페이징)
-
물리적 메모리를 n개의 고정된 크기로 분할한다. 분할된 크기보다 큰 프로그램은 적재할 수 없다.
- 분할된 고정 단위를 페이지라고 한다.
-
내부 단편화(고정된 크기의 메모리를 할당하면서 분할된 메모리 내부에 생기는 빈 공간)가 발생한다.
가변 분할 기법(세그멘테이션)
-
매 시점 프로그램의 크기에 맞게 메모리를 분할한다. 물리적 메모리 크기보다 큰 프로그램은 실행할 수 없다.
- 분할된 가변 크기의 단위를 세그멘테이션이라고 한다.
-
외부 단편화(메모리의 할당과 해제가 반복되면서 메모리 사이에 생기는 할당할 수 없을 정도로 작은 크기로 생기는 빈 공간)가 발생한다.
가상 메모리 기법
-
가장 널리 사용되는 방법으로 물리적 메모리보다 더 큰 프로그램을 실행할 수 있도록 보조 기억장치의 일부를 메모리처럼 사용하는 방법이다.
- OS는 가상 메모리의 주소를 물리적 메모리 주소로 매핑하여 주소 변환 후 프로그램을 물리적 메모리에 올린다. 사용되고 있는 부분만 메모리에 적재하고 나머지 부분은 보조 기억 장치(SWAP영역)에 저장해 두었다가 필요할 때 적재한다.
- 페이지 교체 알고리즘: 필요한 정보가 메모리가 아닌 보조 기억 장치에 있을 경우 페이징 폴트를 발생시킨 후 메모리에 적재하는 과정. 이때 어떤 페이지를 선택하여 보조 기억 장치의 페이지와 교체할 것인지 결정하는 알고리즘.
- FIFO(First In First Out): 먼저 적재된 페이지를 교체한다.
- LRU(Least Recently Used): 가장 오래 사용되지 않은 페이지를 교체한다.
- LFU(Least Frequently Used): 가장 자주 사용되지 않은 페이지를 교체한다.
단편화
-
메모리 상에서 적재되고, 해제되는 과정에서 발생하는 메모리 사이의 사용하지 못할 정도로 작은 빈 공간을 의미한다.
- First Fit: 메모리 할당시 가장 먼저 발견한 곳에 집어 넣는다.
- Best Fit: 메모리 할당시 사용 가능한 공간 중 가장 작은 곳에 집어 넣는다. (공간 정렬 필요)
- Worst Fit: 메모리 할당시 사용 가능한 공간 중 가장 큰 곳에 집어 넣는다. (공간 정렬 필요)
- 공간 효율성: Best Fit > Fist Fit > Worst Fit
- 시간 효율성: First Fit > Best Fit = Worst Fit
reference
kyu9341.github.io/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/2020/10/04/OS_Process_Structure/
velog.io/@goserimgoserimgo/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
'CS > OS' 카테고리의 다른 글
[OS] CPU 작동원리 (0) 2021.08.06 [OS]Process VS Thread (0) 2021.07.10 OS - 은행원 알고리즘 (0) 2021.02.20 OS - CPU스케줄링 (0) 2021.02.16 OS - 프로세스와 쓰레드 (0) 2021.02.15