Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions 03주차/Memory & Virtual Memory
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# 3주차 - OS - Memory / Virtual Memory

- Memory 구조

메모리란.. 프로그램을 실행시키기 위해서는 이 메모리에 올라가야 함. 여기서 동작중인 프로그램을 “프로세스” 라고 하는 것.

메모리는 총 4개의 영역으로 구성되어 있다.

1. 코드 영역: 실행할 프로그램의 코드가 들어간다.

CPU가 실행해야하는 코드들.. 바로 이곳에 저장되어 실행되는 것이다. 즉, 실행될 코드들의 영역이다.

특징: cpu는 오직 이 영역에서 명령어를 하나씩 가져와 실행한다. 또한, 해킹과 무결성의 이유로 read-only로 관리됨.

2. 데이터 영역: 전역 변수, 정적 변수가 저장되는 곳.

즉, 프로그램이 시작될 때 만들어져서, 프로그램이 끝날 때까지 계속 유지되어야 하는 데이터가 머무는 곳이다. 예를 들자면 static 키워드가 붙은 정적 변수나 프로그램 전체에서 공유하는 전역 변수들.. 이라고할 수 있다.

3. 힙 영역: 사용자의 동적 할당

프로그램이 실행되는 도중에 필요할 때마다 데이터를 생성하고 보관하는 가장 넓은 자유 공간이다. 예를 들자면.. new 키워드를 통해 생성한 모든 인스턴스 (Entity, DTO, 컬렉션, 배열 등)가 이곳에 무작위로 쌓이게 된다. (JVM의 힙도 여기에 해당.)

특징: GC가 이곳을 주기적으로 순찰하며 사용하지 않는 객체를 치워줌. 이 공간이 다 찼을 시 발생하는 에러가 → **OutOfMemoryError**

4. 스택 영역: 함수가 호출될 때마다 잠깐 사용하고 버리는 임시 메모리.

메서드 안에서 선언된 지역 변수, 매개변수, Heap 영역에 있는 거대한 객체들의 위치가 이곳에 저장됨.

특징: 후입선출 구조로 동작하며, 메서드가 종료되는 순간 그 메서드가 썼던 스택 공간은 흔적도 없이 자동으로 날라감. 이 공간을 다 쓸시 나타나는 에러가 → **StackOverflowError**


- Stack/Heap

메모리 관점에서의 스택과 힙은.. “누가 어떻게 데이터를 치우는가”를 대상으로 대조되는 두 구역이라고 할 수 있다.

Heap → new Member 를 통해 생성된 큰 객체는 힙 영역의 빈 공간을 찾아 자리를 잡습니다.

Stack → member라는 변수는 스택 영역에 생성되며, 힙에 있는 실체 객체의 메모리주소만 가벼운 숫자로 기억한다.

비유하자면, 스택은 함수가 끝나면 즉시 소멸하지만, 힙은 GC가 지울 때까지 무한정 생존이 가능하다.

- Virtual Memory

가상메모리란.. 운영체제가 컴퓨터에서 실행되는 프로그램들이 각자 넓은 메모리를 쓰도록 느끼게 하는 기술.

그런데 이 기술은 왜 쓰는걸까? 즉, 왜 굳이 가상 메모리라는 것을 쓰는거지? … → 물리적 메모리는 면적이 좁고 매우 한정적이라 금방 공간이 다 참. 또한 하드디스크와 SSD를 사용하자니 너무 느리다.. 이를 보완하기 위해 나온 것이 가상 메모리이다.

가상메모리의 동작 방식.

1. 페이징 (잘게 쪼갠다.) → 프로그램 자체를 통째로 RAM에 오르내리는 것은 너무 무겁고 비효율적.. 운영체제는 가상 메모리와 물리적 RAM을 모두 보통 4KB 크기의 작은 조각
2. 페이지 테이블 → 운영체제가 가상 메모리를 관리하기 위해 사용하는 ‘가상 주소와 실제 물리 주소를 짝지어 놓은 거대한 번역 지도’
3. MMU → 즉, 가상 메모리는 가상 주소와 물리 주소가 필요한데… 가상 주소는 프로세스가 참조하는 주소이고, 물리 주소는 실제 메모리 주소. 이때 어떤 가상주소가 어떤 물리 주소에 매핑되어있는지 알 수 있어야 한다… 이때 필요한 것이 MMU.
→ CPU에 코드 실행시, 가상 주소 메모리 접근이 필요할 때, 해당 주소를 물리 주소 값으로 변환해주는 하드웨어 장치. 즉, CPU는 가상 메모리를 다루고, 가상 메모리의 가상 주소 접근시 MMU 하드웨어를 통해 물리 주소로 변환되어 물리 메모리에 접근할 수 있다.

- Paging

: 가상 메모리 시스템을 구현하는 다양한 방법 중 가장 많이 쓰이는 방법이 페이징 시스템이다.
위에서 말한 것과 같이, 프로그램을 통째로 RAM에 오르내리는 것은 너무 무겁고 비효율적이기 때문에, 운영체제는 가상 메모리와 물리적 RAM을 모두 보통 4KB 크기의 작은 조각으로 나누어 관리하는 것.

- Page Fault
: 어떤 페이지가 물리 메모리에 없을 때 발생하는 인터럽트로 page fault가 발생하면, 운영체제가 해당 페이지를 물리 메모리에 올려준다.
19 changes: 0 additions & 19 deletions 03주차/README.md

This file was deleted.