* 해당 포스팅은 김영한님의 자바 고급 편에 있는 멀티스레드 영상을 보고 정리한 내용입니다.
개요
처음 자바를 학습할때 이 코드 제일 먼저 보지 않나요?
public static void main(String[] args) {
//처음 자바 실행하는 코드
System.out.println("hello world!")
}
저도 처음 시작할때 위 코드를 출력하는거 부터 시작했던 기억이 나는거 같습니다.
몇분들은 아마 의문점을 가질 수 있는데요
프로세스와 스레드라는 주제로 왜 이 코드를 보여주냐?
그 이유는 바로 위 main 함수부터 메인 스레드가 시작지점이 바로 여기 이기 때문입니다.
처음 자바를 학습 할때는 멀티 스레드 라는 개념을 인지하지 않고 메인 함수에서 많은 함수와 프로그램을 실행 시켰는데요
사실 자바는 처음부터 멀티 스레드라는 개념을 탑재한 언어라는 사실을 알고 계신가요?
멀티 스레드를 잘 활용한다면 기존에 가지고 있는 성능 문제를 획기적으로 해결 할 수 있는 멋진 개념이지만
기본적인 동작방식을 모른 상태에서 사용한다면 어마 어마한 버그를 안겨줄 수 있습니다.
따라서 자바를 사용하는 개발자라면 멀티 스레드의 개념을 확실하게 잡고 응용하셔서
회사에서 인정받는 웹 서버 엔지니어로 거듭 날 수 있을거라 생각이 듭니다.
본문
멀티 스레드가 왜 필요한지
앞에서도 설명했지만 더 자세히 이야기 하자면
하나의 프로그램도 그 안에서 여러 작업이 필요합니다
- 워드 프로그램으로 문서를 작성하면서 문서가 자동으로 저장되고, 맞춤법 검사도 수행된다
- 유튜브는 영상을 보는 동안, 댓글을 달 수 있다.
제가 멀티 스레드를 사용한 경험은 이메일 보내기 작업입니다
이메일을 자바 코드로 보낼때 네트워크 속도가 빠르지 않아서 이메일을 전송하고 응답을 받기까지
3초 정도 시간이 걸렸는데 이때 스레드를 사용하여서 사용자가 빠르게 응답을 받을 수 있도록 사용한 경험이 있습니다.
프로세스 와 스레드 의 차이
면접에서도 자주 나오는 질문입니다, 핵심을 이야기 하자면 스레드는 메모리를 공유 할 수 있지만 반면 프로세스는 서로 메모리를 공유할 수 없습니다.
메모리를 공유할 수 있다는 점이 어쩌면 멀티 스레드의 가장 중요한 내용일 수 있겠다 라는 생각이 듭니다
멀티 스레드를 사용해서 생기는 문제점이 바로 공유하는 메모리에서 발생하고 이 문제를 해결 하기 위해서 선배 개발자분들이 많은 고생을 하셨으니까요
프로세스와 스레드의 그림을 통해서 보면 확실히 알 수 있습니다.

위 사진이 바로 프로세스와 스레드의 차이를 명확하게 볼 수 있는 이미지입니다.
프로세스끼리는 어떠한 자원도 공유하지 않지만
스레드 끼리는 코드, 메모리, 기타 영역을 공유하고 있다는 사실을 알 수 있습니다.
하지만 여기서 중요한점은 스레드끼리 공유하지 않는 영역 또한 있다는 사실인데요
바로 스택 부분입니다.
즉 함수안에 지역 변수로 선언된 영역은 공유가 되지 않고 해당 영역에서는 스레드 끼리의 충돌도 일어나지않습니다
스레드를 처음 입문 하시는분이라면 이 내용이 이해가되지 않겠지만 지금은 단순하게 아~ 그렇구나 하고 넘어가면 될꺼 같습니다.
프로세스 와 스레드의 핵심 요약
프로세스
- 프로그램은 실제 실행하기 전까지는 단순한 파일에 불과합니다.
- 프로그램을 실행하면 프로세스가 만들어지고 프로그램이 실행됩니다.
- 운영체제 안에서 실행중인 프로그램을 프로세스라 합니다.
- 프로세스는 실행 중인 프로그램의 인스턴스입니다.
- 자바 언어로 비유를 하자면 클래스는 프로그램이고, 인스턴스는 프로세스입니다.
스레드
프로세스는 하나 이상의 스레드를 반드시 포함한다.
스레드는 프로세스 내에서 실행 되는 작업의 단위입니다. 한 프로세스 내에서 여러 스레드가 존재할 수 있으며, 이들은 프로세스가 제공하는 동일한 메모리 공간을 공유합니다. 스레드는 프로세스보다 단순하므로 생성 및 관리가 단순하고 가볍습니다.
싱글 스레드와 멀티 스레드의 차이
싱글 스레드: 한 프로세스 내에 하나의 스레드만 존재 (예: 자바스크립트 싱글 스레드)
멀티 스레드: 한 프로세스 내에 여러 스레드가 존재 (예: 자바의 멀티 스레드)
번외 -
자바스크립트는 싱글 스레드이지만 스케쥴링 큐, 이벤트 루프를 활용하여
블럭킹 이슈를 해결했습니다, 여기서는 자바스크립트의 싱글 스레드를 다루지는 않겠습니다만, 나중에 한번 자바스크립트의 싱글 스레드도
다뤄보겠습니다
스레드와 스케쥴링
운영체제와 스케줄링 과정을 그림을 통해서 자세히 살펴보겠습니다.
cpu 코어는 1개이고, 프로세스는 2개일때, 프로세스 A는 스레드1개 프로세스B는 스레드가 2개 있습니다.
프로세스는 실행환경과 자원을 제공하는 컨테이너 역활을 하고, 실제 cpu를 사용해서 코드를 하나 하나 실행하는 것은 스레드 입니다.

- 프로세스A에 있는 스레드 A1을 실행한다.

- 프로세스A에 있는 스레드A1의 실행을 잠시 멈추고 프로세스B에 있는 스레드 B1을 실행한다.

- 프로세스B에 있는 스레드 B1의 실행을 잠시 멈추고 같은 프로세스의 스레드 B2를 실행한다.
- 이후에 프로세스A에 있는 스레드A1을 실행한다.
- 이 과정을 반복한다.
단일 코어 스케줄링
운영체제가 스레드를 어떻게 스케줄링 하는지, 스케줄링 관점으로 확인해보겠습니다
운영체제는 내부에 스케줄링 큐를 가지고 있고, 각각의 스레드는 스케줄링 큐에서 대기합니다.




이런 과정을 반복해서 수행합니다.
멀티 코어 스케줄링
CPU 코어가 2개 이상이면 한 번에 더 많은 스레드를 물리적으로 진짜 동시에 실행할 수 있다.




이런 과정을 반복해서 수행한다.
프로세스, 스레드와 스케줄링 - 정리
멀티태스킹과 스케줄링
멀티태스킹이란 동시에 여러 작업을 수행하는 것을 말한다. 이를 위해 운영체제는 스케줄링이라는 기법을 사용한
다. 스케줄링은 CPU 시간을 여러 작업에 나누어 배분하는 방법이다.
프로세스와 스레드
프로세스는 실행 중인 프로그램의 인스턴스이다. 각 프로세스는 독립적인 메모리 공간을 가지며, 운영체제에서 독
립된 실행 단위로 취급된다.
스레드는 프로세스 내에서 실행되는 작은 단위이다. 여러 스레드는 하나의 프로세스 내에서 자원을 공유하며, 프
로세스의 코드, 데이터, 시스템 자원등을 공유한다. 실제로 CPU에 의해 실행되는 단위는 스레드이다.
프로세스의 역할
프로세스는 실행 환경을 제공한다. 여기에는 메모리 공간, 파일 핸들, 시스템 자원(네트워크 연결) 등이 포함된다.
이는 프로세스가 컨테이너 역할을 한다는 의미이다.
프로세스 자체는 운영체제의 스케줄러에 의해 직접 실행되지 않으며, 프로세스 내의 스레드가 실행된다. 참고로 1
개의 프로세스 안에 하나의 스레드만 실행되는 경우도 있고, 1개의 프로세스 안에 여러 스레드가 실행되는 경우도
있다.
이렇게 프로세스와 스레드의 개념을 마치겠습니다.
다음 포스팅은 컨테스트 스위칭 개념에대해 알아보겠습니다
감사합니다!
'Java' 카테고리의 다른 글
| Socket을 활용한 채팅 네트워크 프로그램 객체지향을 곁들인... (0) | 2025.03.16 |
|---|---|
| Java 리플랙션<Reflection> (2) | 2025.02.21 |
| [Java] 스레드 풀과 Excutor 프레임워크 (4) | 2024.09.29 |
| [Java]ReentrantLock (9) | 2024.09.18 |
| 자바의 고오급 동기화 concurrent.Lock (7) | 2024.09.14 |