컴퓨터엔 다양한 메모리들 존재

CPU엔 레지스터라는 메모리 있었고, 캐시메모리, RAM, 하드디스크 등 메모리도 있음.
얘네들은 계층구조를 형성.
레지스터는 CPU안에서 연산을 위한 저장소를 제공, 속도가빠르지만 용량은 크지 않음.
CPU와 RAM사이에 중간 저장소 역할을 하는 메모리, 레지스터와 RAM사이에 데이터 이동이 있을 때 그 속도를 보완하는 역할을 하는 메모리. 캐시는 이미 사용된 데이터를 임시로 저장해서 메인메 모리인 RAM으로부터 데이터를 가져오는 시간보다 더 빠르게 데이터를 가져올 수 있게 해줌.
CPU입장에서는 바로 꺼내 쓸 수 있는 주머니인셈.
캐시메모리는 용도에 따라 L1과 L2캐시로 나누어짐.
RAM은 컴퓨터의 메인메모리로 불림. 메인메모리는 프로세스와 운영체제들이 올라가는 공간이다.
HDD나 SSD같은 보조기억장치보다 비싸서 데이터를 저장하기 보다는 실행 중인 파일을 올리기 위해 사용함
크고 작은 파일들을 저장하기 위한 용도로 주로 사용됨. 계층구조에서 제일 끝단에 있는 만큼 속도가 느리지만 그만큼 용량은 크다. 일반적으로 가장 저렴하고 보조기억장치의 용량이 가장 크다.
컴퓨터 전원이 꺼졌을 때 데이터가 사라지는 것을 휘발성이라고 하는데
레지스터, 캐시, 메인메모리는 휘발성 메모리, 보조기억장치는 비휘발성 메모리이고 컴퓨터가 꺼져 도 데이터를 저장한다.
멀티프로세스 운영체제에서 메모리를 관리하는 방법
여러개의 프로세스를 메모리에 올려야 한다면, 선택할 수 있는 방식은 두가지이다. 가변 분할 방식과 고정 분할 방식이 있다.
가변분할방식
프로세스의 크기에 따라 가변적으로 나누는 방식. 프로세스 크기가 크면 큰대로, 작으면 작은데로 할당해줌. 연속 메모리 할당 또는 세브먼테이션 이라고 불리기도 함.
고정분할방식
메모리를 고정으로 미리 나누어 놓은 후 나누어진 메모리를 프로세스 크기만큼 할당해주는 것.
비연속 메모리 할당 또는 페이징으로 불리기도 함.
연속 메모리 할당
실행상태의 프로세스는 메인 메모리에 올리고, 실행상태가 아닌 프로세스들은 보조장치에 따로 마련된 스왑 영역 에 올린 다음 프로세스의 상태변화에 따라 두 공간 사이에서 프로세스가 이동하는(교환되는)것을 '스와핑'이라함.
실행상태가 아닌 프로세스들을 이 영역으로 부터 가져다가 메인 메모리에 올려 실행하는 '스왑 인'
실행중인 것을 스왑 영역으로 보내는 것을 '스왑아웃', 두가지를 처리하는 것을 통틀어 스와핑이라고 부름.

<출처:유노코딩>
스와핑을 통한 프로세스관리의 예
주황색이 실행중인 프로세스임
돌려야하는 총량이 메인메모리의 용량을 초과할 경우 스왑영역이 있어 실행 시킬 수 있다.
프로세스를 메모리에 연속 배치하는 작업을 하다보면 메모리가 낭비되는 '외부 단편화'상황이 발생 하기도 함.

조각모음이라는 방법을 통해 공간을 올려주어 들어갈 수 있게 만들 수 있지만
이는 시스템에 무리를 주는 방법이라 빈번하게 쓰면 안된다.
<실습.py>
# 메모리를 아끼기 위해 존재하는 레퍼런스 카운트와 가비지 컬렉션에 대한 에제
# 문자열 객체를 변수 my_name이 참조했다
# 레퍼런스 카운트가 1인 상태
my_name = "goguma" # 고구마
# 레퍼런스 카운트가 2인 상태
your_name = my_name
my_name = 1
your_name = 2
# 레퍼런스 카운트가 0이 되었다. 0이되면 제거 대상이고 이를 가비지컬렉션(쓰레기 모음)이라고 한다.
# 소멸 대상
<실습.js>
// 객체가 두개, 그에 대한 참조가 2개가 됬다.
let players = {
boys: {
Bergkamp : "Striker"
}
}
let persons = players
// 레퍼런스 카운트는 올라가고 가비지 컬렉션은 참조힐게 없는 상태임.
players = ["Son", "Park"]
// 이제 players는 레퍼런스카운트에서 빠짐. 손과 박을 가르키는 변수가 됨.
// persons가 유일한 boys참조하는 애됨.
let human = persons.boys
persons = "persons"
// 이제 boys가르키는 애 human 뿐임
human = null
// 이제 boys 참조하는애 없음 레퍼런스 0됨.
// 제거대상