개요
- 김영한 강사님의 자바 고급 멀티스레드와 동시성 강의를 듣고 내 생각과 간단하게 작성한다.
자세한 내용은 강의를 들어주세요.
본론
프로세스와 스레드란?
프로세스
프로그램을 실행하면 프로세스가 만들어지고 프로그램이 실행된다.
프로세스는 간단히 말하면 운영체제 안에서 실행중인 프로그램을 뜻하고 자바를 예로들면 프로그램은 마치 자바 클래스, 프로세스는 해당 클래스를 객체화한 인스턴스라는 느낌을 가져가면 된다.
각 프로세스들은 자신만의 메모리 공간을 가지고 있기 때문에 프로세스끼리는 서로의 메모리에 접근할 수 없고 하나의 프로세스가 내부에서 충돌하더라도 다른 프로세스에는 영향을 끼치지 않는다.
- 마치 도커에서 컨테이너끼리 독립되어 있어 서로 컨테이너 내부에 접근할 수 없는 것 같이 느껴졌다. (컨테이너도 아마 프로세스처럼 동작할듯?)
프로세스는 다음의 정보를 가진다.
- 코드 : 실행할 프로그램의 코드가 저장되는 공간
- 데이터 : 전역 변수 및 정적 변수가 저장되는 공간
- 힙 : 동적으로 할당되는 메모리의 공간
- 스택 : 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역
→ 코테를 풀다보면 back tracking 혹은 DFS와 같이 메서드 재귀 호출의 깊이가 많이 깊어질 때가 있는데 문제를 잘못풀어서 StackOverflowError 예외가 발생할 때가 있는데 이게 스택 영역에 너무 많은 값들이 들어가서 그런 것 같고 생각한다. 이 부분에 대해서는 JVM을 공부해봐야 할 것 같다.
스레드
스레드란 프로세스 내부에서 실행되는 작업의 단위이다.
- 실이라는 뜻을 가지며 프로세스는 하나 이상의 스레드를 반드시 포함한다.
- 내가 운영체제 강의를 수강할 때 초기 스레드는 lightweight process(경량 프로세스)라는 이름을 가졌었다고 했다.
- 즉, 스레드란 프로세스 내부에서 실행되는 더 작은 단위라고 생각하면 된다.
프로세스보다 더 작은 단위이기 때문에 쉽게 생성하고 관리할 수 있으며 가볍다.
스레드는 다음과 같은 구성을 가진다.
- 프로세스 하위에 존재하기 때문에 코드, 데이터, 힙 영역을 다른 스레드와 공유하여 가진다.
- 각 스레드들은 스택 영역을 개별적(독립적)으로 가진다.
이렇게 보면 컨테이너 가상화 기술인 도커와 KVM과 같은 하이퍼바이저 기반의 가상화 기술과 유사한 것 처럼 느꼈다.
- 도커 → 애플리케이션 기반의 가상화를 지원함으로써 호스트의 OS를 공유하지만 애플리케이션끼리는 분리되는 격리성을 가진다.
- KVM같은 가상화 기술 → 각 가상머신이 게스트 OS를 가져 높은 격리성을 가진다. (어느것도 공유하지 않음)
- 이 두 기술이 마치 프로세스와 프로세스 내부의 스레드 처럼 느껴진다. (조금 다르긴 하지만 격리성의 차이가 이렇게 느껴지는 것 같다.)
정리
우리의 프로그램은 프로세스라는 작업 공간을 할당받아서 실행된다. 이때, 디스크에 있는 프로그램 파일들을 메모리로 로드하는데 이때, OS가 프로세스를 만든다.
그럼 이 시점에 프로세스는 프로그램을 실행하는데 자바로 예시를 들면 main()문이 실행된다.
이 main문을 바로 스레드가 실행한다.
- 스레드는 코드를 한줄한줄 실행한다.
- 우리가 Spring과 같은 웹 어플리케이션을 실행하면 멀티 스레드 환경에서 실행되기 때문에 여러명의 요청에 대해서 동시에 처리해줄 수 있는 것이다.!
- 더 쉽게 알아보자면 우리가 유튜브 영상을 시청하면서 댓글을 작성하는 에디터도 사용할 수 있고 검색창에 검색어도 작성할 수 있는 이유가 여러 스레드가 동작하고 있기 때문이다!
결론
OS 강의 시간에 배운 프로세스와 스레드에 대해서 더욱 자세하게 (자바 코드 관점에서) 공부할 수 있어서 좋았다.
강의에서는 그저 스케줄링 기법들과 문맥교환이 중요하다고만 배웠지만 이렇게 더욱 자세하게 자바를 예시로 들어서 공부하니 더욱 이해가 잘되었던 것 같다.
'개발 관련' 카테고리의 다른 글
[CS] 멀티태스킹과 멀티프로세싱이 뭐지? (0) | 2024.08.27 |
---|---|
[JAVA] 자바 Reflection API (0) | 2024.05.08 |
[Spring Boot] 스프링 부트 HTTPS 적용기 (0) | 2024.01.26 |