Search

GC를 이해하기 위해 알아야 되는 OS 지식

작성일시 : 2026-01-25일
프로그램 : 명령어와 명령어의 타겟들의 집합
프로세스 : 프로그램에 램에 올라와서 실행되고 있는상태
LOAD R1 from b LOAD R2 from c ADD R3, R1, R2 store R3 to a
Java
복사
위와 같은 명령어가 동작할때 IR (instruction register)를 통해 데이터를 읽고 CPU에서 해당하는 레지스터에 값을 저장하여 RAM에 올림.
일반적으로 프로그램이 하드웨어를 직접 사용하려고 하면 문제가 발생됨
사용자의 프로그램에 따라 시스템 전체에 문제가 야기될수 있음.
여러 프로세스를 실행할때 자원관리의 분배를 잘해야됨 등
컴퓨터를 좀 더 쉽게 효율적이고 안전하게 중재할수 있는 프로세스가 필요함 이것이 OS

OS 역할

1.
쉽게
a.
systemCall : 컴퓨터의 기능들을 쉽게 사용할수 있게 하드웨어를 추상화하여 제공하는 인터페이스
b.
OS standard libray : 여러 유용한 핵심 기능을 함수 형태로 제공
i.
systemCall을 wrapping하여 제공
2.
효율적
a.
process/thread scheduling : 한정된 cpu 자원을 적절히 분배
i.
time sharing :
b.
virtual memory : 필요한 Page만 RAM에 올려 RAM을 여러 프로세스가 더 효율적으로 사용
3.
안전
a.
system call: 크리티컬한 instruction set은 kernel만 사용하도록 보호.
b.
virtual memory : 독립된 가상의 주소 공간을 제공해서 RAM에 직접 접근하지 못하게 막음
c.
Synchronization : 공유 자원에 동시에 접근해서 race condtion이 발생하는 것을 막을 수 있는 기능을 제공

RAM 은 유한한 자원

RAM은 유한한 자원인데, 프로그램은 다양하고 점점더 커짐 > RAM이 부족한 현상이 발생됨
동시에 프로그램을 올리려고하니, RAM의 용량이 부족함
메모리의 파편화로 RAM에 여유가 있어도 쓰지 못하는 현상이 발생(external fragmentation)
프로그램의 일부분은 잘 사용하지 않은 기능들이나 로직인데도 RAM을 차지
Locality
Spatial Locality : 특정 메모리 위치에 접근하면, 그 근처의 메모리 위치도 곧 접근될 가능성이 높다는 원리
// 배열의 연속된 요소들을 순차적으로 접근 int[] array = new int[1000]; for (int i = 0; i < array.length; i++) { array[i] = i * 2; // 메모리상 연속된 위치를 순차 접근 }
Java
복사
Temporal Locality : 최근에 접근한 데이터가 가까운 미래에 다시 접근될 가능성이 높다는 원리
// 반복문에서 같은 변수를 계속 참조 for (int i = 0; i < 1000; i++) { sum += i; // sum 변수가 반복적으로 접근됨 }
Java
복사
이러한 유한한 RAM의 특성을 해결하기 위해 나온 것이 Virtual Memory
프로세스는 자신만의 Virtual memory space를 갖는다.
주소공간만 확보하고 실제 데이터는 RAM에 있다.
RAM에 데이터가 없을시 데이터를 읽어와서 가상주소에 주소값을 셋팅한다.
이때문에 RAM은 다른 프로세스에서도 동시에 사용할수 있다.
Demand paging
프로세스가 실행 중에 실제로 코드나 데이터가 필요한 순간에 해당 Page를 RAM에 올리는 방식.
그렇다면 RAM이 꽉차면 어떻게 되는가?
여러 알고리즘을 통해서 내린다.
1.
버린다.
a.
코드는 이미 세컨더리 스토리지에 저장되어 있기 때문에 다시읽을수 있음.
2.
swap space에 작성
a.
Heap 사용자가 사용하는 데이터 > swap space에 저장하고 필요할때 다시 사용한다.
3.
write-back
RAM이 꽉 차게되면 자동으로 관리를 함, 하지만 swap space는 하드디스크이기 때문에 속도측면에서 다른 RAM, CPU 보다 현저하게 속도가 느림. 때문에 현재 Swap sapce의 작업이 많다는 것은 RAM이 꽉차서 부하가 발생되고 있는 것이고, 이는 모니터링의 대상이 됨.

Process VS Thread

CPU에서 실행되는 가장 기본 단위
같은 프로세스에 속하는 스레드는 같은 가상 주소 공간을 공유
스레드가 추가되면 stack영역만 추가 확보하면 됨
같은 프로세스에 속한 스레드 간의 context switching이 더 빠른 이유는 같은 주소 공간을 공유하기 때문.
프로세스가 다르면 mmu의 table도 변경해야되고 virtual memory에 해당하는 모든 것들을 변경해야됨.
즉 컨텍스트 스위칭 비용이 비싸다.
즉) 컴퓨터는 다양한 프로그램과 다양한 가상메모리가 공유하는 CPU와 RAM을 사용하고 있다.
결국 JVM도 하나의 프로세스 이다.
때문에 이러한 동작 방식을 알아야지, 좀 더 JVM을 상세하고 폭넓게 이해할수 있다.
GC 1부: GC 공부를 위해 알아야할 OS 지식
안녕하세요 백엔드 전문채널 쉬운코드입니다! 🫡 지난 라이브 방송 사고로 다시 한번 라이브를 진행합니다 이번에는 분량을 좀 줄여서 OS 배경 지식을 다루도록 하겠습니다.! ⏰ 일시 : 1월 21일 월요일 밤 10시 30분에 멤버십 전용 라이브로 진행 그럼 많관부❤️ 🔥 GC 강의는 Improver 이상의 멤버십 전용으로 진행됩니다. 👉 멤버십 가입 링크 : https://www.youtube.com/channel/UCReNwSTQ1RqDZDnG9Qz_gyg/join 00:00 세팅 03:37 시작 03:59 감사 04:18 1. 컴퓨터의 기본 구성 07:09 2. CPU와 명령어 집합(instruction set) 설명 09:45 3. 프로그램 개념 설명 10:19 4. 프로그램 vs 프로세스 11:21 5. 프로세스가 실행되는 흐름 16:08 6. 우리는 개발할 때 직접 기계어로 개발하진 않음 16:47 7. 컴파일 방식 vs 인터프리팅 방식 20:45 8. OS의 등장 배경 24:00 9. OS와 프로그램의 관계 25:11 10. OS의 역할 (system call, scheduling, time-sharing, virtual memory, synchronization) 34:54 11. 시스템 콜 심화. 시스템 콜이 실행되는 흐름 45:33 12. CPU instruction set은 non-privileged vs privileged로 구분 49:12 13. 중간 정리 50:47 14. RAM이 유한한 자원이라서 발생하는 이슈들 56:01 15. locality : 프로그램의 메모리 접근 특징! 58:16 16. virtual memory의 핵심은 가상주소공간!(virtual address space) 1:03:34 17. virtual memory 동작 예제 (page fault, demand paging, swap) 1:26:25 18. virtual memory 요약 1:28:41 19. 가상주소공간에 있는 kernel space 1:33:03 20. Process & Thread 1:34:57 21. 같은 프로세스에 속한 thread들끼리는 컨텍스트 스위칭이 더 빠른 이유 1:37:22 22. 두 프로세스가 동시에 실행될 때 모습 1:38:10 23. OS 관점에서는 JVM도 프로세스다! 1:39:03 마무리 및 Q&A