가상 메모리
- 프로세스가 메모리 외부에서 실행될 수 있도록 하는 유용한 메모리 관리 기술
- Swap영역, 실제 메모리에서 공간이 부족할 경우 보조기억장치에서 임시로 사용하는 영역
- OS에서 관리하며 프로세스는 실제 메모리인지 Swap영역인지 구별 못함
- 실제 메모리가 아니기 때문에 지연시간이 많이 발생
- 가급적이면 Swap메모리 사용하지 않게 설계하는 것이 중요
구현 기법
- 페이징(Paging) : 보조기억장치를 이용한 가상 메모리를 같은 크기의 블록으로 나눈 것
- 주기억장치를 페이지와 같은 크기로 나눈 것을 Frame이라고 함
- 사용하지 않는 프레임을 페이지에 옮기고(Swap-Out), 필요한 메모리를 페이지 단위로 프레임에 옮기는(Swap-In) 기법
- 커다란 크기의 작업을 잘게 나누어 처리하는 것으로 불연속적인 메모리 요청 등에 유연하게 처리 가능
- 메모리를 페이지 단위로 가져오기 때문에 프로세스의 효율적인 운영이 가능
- 외부 단편화는 해결되지만, 내부 단편화는 해결되지 않음
- 세그멘테이션(Segmentation) : 가상 메모리를 사용하는 것으로 페이징 기법과 유사하지만 서로 다른 크기로 나누고 단위는 Segment라고 함
- 내부 단편화는 해결되지만, 외부 단편화는 해결되지 않음
컴파일러와 인터프리터
원시 코드를 기계어로 변환하는 역할을 수행
컴파일러
- 원시 코드를 기계어로 모두 변환시킨 후 변환된 코드를 실행하는 언어
- C, C++...
- 모두 해석한 뒤 실행시키기 때문에 실행 속도가 빠름
- 플랫폼에 종속적
인터프리터
- 원시 코드를 기계어로 변환하는 과정 없이 한 줄씩 해석하여 바로 실행하는 언어
- Python, JS, Ruby...
- 한 줄씩 해석하며 실행시키기 때문에 컴파일 언어보다 실행 속도가 느림
- 모든 플랫폼에 독립적
메모리 계층 구조
메모리를 필요에 따라 여러 종류로 나눈 구조. 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함
- 레지스터와 캐시는 CPU 내부에 존재하므로 CPU는 아주 빠르게 접근 가능
- 메모리는 CPU외부에 존재하기 때문에 레지스터와 캐시보다 더 느리게 접근 가능

필요성
- 비용 : 메모리 구조에서 상층에 속할수록 더 비쌈
- 속도 : CPU와 가장 가까이 있는 레지스터가 가장 빠르게 접근 가능
레지스터
컴퓨터에서 제일 빠른 메모리로 CPU 계산 과정에서 작동함
컴퓨터 프로세스 내에서 자료를 보관하는 아주 빠른 기억 장치
캐시 메모리
레지스터 다음으로 빠른 메모리
크기는 작지만 속도가 빠름
주기억장치(메인 메모리)
- RAM : 사용자가 자유롭게 내용을 읽고, 쓰고 지울 수 있는 기억장치로 휘발성 메모리
- 어느 위치에 저장된 데이터든지 접근하는데 동일한 시간이 걸림
- ROM : 기억된 내용을 읽을 수만 있는 기억장치로 비휘발성 메모리
- 변경 가능성이 희박한 시스템 SW를 기억시키는데 주로 이용
- Flash Memory : 기록된 내용을 보존한다는 측면에서는 ROM과 유사
- USB 메모리, microSD 카드
논리적 주소와 물리적 주소
논리적 주소 = 가상 주소
- CPU가 생성하는 프로세스의 독자적인 주소 공간
- CPU가 보는 주소
물리적 주소
- 물리 메모리에 실제로 올라가는 위치
주소 바인딩
프로그램이 실제로 메모리에 올라갈 때 주소를 결정하는 것
페이지 교체 알고리즘
페이지 폴트가 발생한 경우 필요한 페이지를 주 기억장치에 적재해야 하는데, 이때 주기억장치가 가득 차 있다면 퇴출시킬 페이지를 정하는 알고리즘
페이지 폴트
자신의 가상 메모리 공간에는 존재하지만, 시스템의 RAM에는 없는 데이터나 코드에 접근 시도한 경우 발생
FIFO(First In First Out)
페이지가 주 기억장치에 적재된 시간을 기준으로 교체될 페이지를 선정하는 기법
단점 : 중요한 페이지가 오랫동안 있었다는 이유만으로 교체될 수 있음
LFU(Least Frequently Used)
주기억장치에 적재되어있는 페이지들이 참조된 횟수를 기준으로 교체할 페이지를 선정하는 기법
단점 : 참조될 가능성이 많아도 횟수에 의한 방법이므로 최근에 사용된 프로그램을 교체시킬 수 있음
LRU(Least Recently Used)
최근에 가장 오랫동안 참조되지 않은 페이지를 교체하는 기법
단점 : 프로세스가 주기억장치에 접근할 때마다 참조된 페이지에 대한 시간을 기록해야 함
메모리 단편화
주 기억장치에서 메모리의 공간이 작은 조각으로 나뉘어 사용하기에 충분한 양의 메모리가 존재하긴 하지만, 사실상 사용이 불가능한 경우
내부 단편화
필요한 양보다 더 큰 메모리가 할당되어 할당된 메모리 내부에 사용하는 메모리 공간 외에 빈 공간이 발생한 경우
페이징에서 발생됨
외부 단편화
분할된 영역이 할당될 프로그램의 크기보다 작아서 모두 빈 공간으로 남아있는 전체 영역
세그먼테이션에서 발생됨
해결방법
- 압축(Compaction) : 메모리 공간들을 재배치해 단편화로 인해 분산되어있는 메모리 공간들을 하나로 합치는 기법
- 통합(Coalescing) : 단편화로 인해 분산된 메모리 공간들을 인접한 것들끼리 통합시켜 큰 공간으로 합치는 기법
- 압축은 재배치가 일어나지만, 통합은 인접한 공간들끼리 통합된다는 차이
- 메모리 풀(Memory Pool) : 동적 할당과 비슷하지만, 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정해 미리 할당받아 놓는다는 점에서 차이가 있음
- 미리 할당받아 메모리 풀을 만들어 놓고 필요할 때마다 사용하고 반납하는 방식
- 메모리 풀 없이 동적 할당과 해제를 반복하면 랜덤 위치에 할당과 해제가 반복돼 단편화를 일으킬 수 있음
- 미리 공간을 할당해놓으면 공간을 쓰고 반납하기 때문에 외부 단편화가 생기지 않음
- 필요한 크기만큼 할당을 해놓기 때문에 내부 단편화 또한 생기지 않음
- 메모리 단편화로 인한 메모리 낭비량보다 메모리 풀에서 쓰이지 않는 메모리 양이 더 클 경우엔 사용 X
RAID
Redundant Array of Independent Disks
- 하드디스크를 병렬로 배열해 사용하는 기법
- 저장장치 여러 개를 묶어 고용량, 고성능 저장장치 한 개와 같은 효과를 얻기 위해 개발된 기법
- 전체 성능을 향상하기 위해 동일한 데이터를 중복 저장하는 데 사용
| RAID 0 | 두 개 이상의 하드디스크를 병렬로 연결해 하나의 하드디스크 처럼 사용하는 기법 |
| RAID 1 | 두 개 이상의 하드디스크를 병렬로 연결해 똑같은 복사본을 생성하는 기법 |
| RAID 2 | 메모리 스타일 오류 수정 코드 |
| RAID 3 | 비트 인터리브 패리 |
| RAID 4 | 블록 인터리브 패리티 |
| RAID 5 | 블록 인터리브 분산 패리티 |
| RAID 6 | P + Q 이중화 |
메모리 영역(힙 영역과 스택 영역)
코드 영역
실행할 프로그램의 코드가 저장되는 텍스트 영역
CPU는 코드 영역에서 저장된 명령어를 하나씩 가져가서 처리
데이터 영역
전역 변수와 정적 변수가 이에 해당
프로그램 시작과 함께 할당되며 프로그램이 종료 시 소멸됨
스택 영역
함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역
함수의 호출과 함께 할당되며 함수의 호출이 종료 시 소멸됨
힙 영역
사용자가 직접 관리할 수 있는 메모리 영역
사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨
CPU와 GPU
CPU(Central Processing Unit)
- 복잡한 계산을 코어 개수만큼씩 직렬로 처리함
- 간단하고 많은 계산식은 오래 걸림
GPU(Graphics Processing Unit)
- 간단하고 많은 계산식을 동시에 빠르게 병렬 처리 가능
- 초기에 알고리즘을 하드웨어에 병렬식으로 부여해야 함
- 복잡한 식을 입력하면 CPU보다 느릴 수 있음
캐싱(Caching)
특정 데이터를 빠르게 접근할 수 있도록 임시적인 저장 위치에 데이터를 저장해두는 방법
속도가 빠른 장치와 느린 장치 사이에서 발생하는 병목 현상 줄일 수 있음
신경 써야 하는 문제
얼마나 데이터가 많이 참조되는 지를 고려해 많이 참조되는 데이터들을 캐싱해야 함. 즉, 적중률을 극대화해야 함
캐시와 버퍼
Cache
- 속도가 빠른 중앙처리장치와 상대적으로 느린 RAM 사이의 원활한 데이터 통신을 위해 주기억장치의 정보를 일시적으로 저장하는 고속 기억 회로 버퍼와 같은 개념이지만 인공지능이라는 점에서 속도가 훨씬 빠름
- 처리 속도를 최대한 올리기 위한 기술로 주로 빠른 속도의 장치 편에 서서 보조함
- CPU, GPU, HDD/SDD
Buffer
- 일시적인 데이터 저장소로 이용하는 기억장치
- 서버와 클라이언트 속도차로 인해 서버가 버퍼에 내용을 저장해 놓으면 클라이언트는 버퍼의 내용을 가져감
- 처리 속도가 떨어지는 것을 방지하기 위한 기술로 주로 느린 속도의 장치 편에서 보조함
- 랜카드, 사운드카드
Cache와 Buffer
- 공통점 : 작동 속도가 차이나는 두 장치 사이에서 완충역할을 담당하여 시스템이 효율적으로 구동되는 것을 보조함
- Buffer는 Cache에 비해 처리 크기가 큰 편이라 모든 데이터를 저장할 수 없어서 사용 후 데이터를 폐기함
- Cache는 특정 데이터를 한 번만 쓰지 않고 계속해서 저장하고 있음
- Buffer는 저장된 데이터를 순차적으로 접근할 수 있고, Cache는 원하는 데이터에 직접 접근할 수 있음
다중 프로그래밍
- 하나의 CPU와 주기억장치를 이용해 여러 개의 프로그램을 동시에 처리하는 방식
- 하나의 주기억장치에 2개 이상의 프로그램을 기억시켜놓고, 하나의 CPU와 대화하면서 동시 처리
메모리 할당 알고리즘
다중 프로그래밍에서 다양한 프로그램들이 메모리 적재/종료를 반복하게 되어 불규칙적인 빈 공간이 계속 발생할 때, 프로세스를 어느 곳에 할당해줄지 정하는 알고리즘
First-Fit
메모리를 처음부터 검사하며 가장 첫 번째로 사용 가능한 공간에 할당
- 장점 : 빠른 메모리 할당 가능
- 단점 : 공간 활용률이 떨어짐
Best-Fit
메모리 공간 중 프로세스가 들어갈 수 있는 가장 작은 공간에 할당
- 장점 : 공간 활용률이 높아짐
- 단점 : 사용 가능한 메모리가 크기순으로 정렬되어있지 않으면 검색 시간이 걸림
Worst-Fit/Next-Fit
프로세스를 메모리 공간 중 가장 큰 곳에 할당
- 장점 : 큰 메모리에 바로 할당하므로 검색시간이 빠름
- 단점 : 사용 가능한 메모리의 정렬이 필요하고 공간 활용률이 떨어짐
References
'Study > Tech Interview' 카테고리의 다른 글
| Spring 면접 (0) | 2021.06.09 |
|---|---|
| 기타 면접 (0) | 2021.05.31 |
| OS 면접 #1 (0) | 2021.05.30 |
| Java 면접 (0) | 2021.05.28 |
| Data Structure 면접 (0) | 2021.05.24 |
댓글