자바 멀티 스레드를 이해하기 위해 OS 수준의 프로세스와 스레드 환경을 이해해야 한다
학교 운영체제 시간에 다 배우기는 했지만 맨날 헷갈리니 다시 정리
멀티 태스킹
멀티 태스킹과 프로세싱을 이해하기 위해 단일 CPU라고 가정하자 (하나의 CPU 코어)
하나의 코어가 하나의 일만 할 수 있다면?
즉 하나의 프로그램만 실행할 수 있다면 A프로그램이 다 돌아가고 B프로그램이 돌아가게 될 것이다.
밑에 그림처럼
이를 해결하기 위한 것이 멀티 태스킹이다.
멀티 태스킹이 가능하다면 위 사진처럼
프로그램 A, B를 짧은 시간동안 번갈아가며 실행한다
그리고 사용하는 입장에서는 A와 B가 동시에 실행되는 것 처럼 느껴질 것이다.
(현대 CPU는 1초에 수십억번의 연산이 가능하기 때문에 우리는 이렇게 번갈아 가며 수행하는 것을 느끼지 못한다)
구체적으로 0.01초 (10ms)로 번갈아 가며 실행하는 것 -> 시간으로 분할 하는 것을 Time Sharing이라고 한다
-> 어떤 프로그램을 얼마나 실행시킬 것인가에 대한 OS 개념은 Scheduling 기법 (라운드 로빈 등..)
멀티 프로세싱
위에서는 CPU 코어가 하나라고 가정했는데
CPU가 여러개일 때 나오는 개념이다.
그림으로 보면 직관적인데
완전히 물리적으로 여러개의 프로그램을 동시에 실행하는 것을 의미한다.
정리하면
멀티 태스킹은 소프트웨어 관점
멀티 프로세싱은 하드웨어 관점
멀티 태스킹 | 멀티 프로세싱 | |
관점 | 소프트웨어 관점 | 하드웨어 관점 |
CPU | 단일 CPU (단일 코어) | 여러 CPU |
프로세스
OS 안에서 실행중인 프로그램을 프로세스라고 한다.
자바에 비유하면
프로그램을 클래스
프로세스를 인스턴스라고 할 수 있다.
그림에서 볼 수 있듯이
각 프로세스는 독립적인 메모리를 가지고 있다.
그러므로,
서로 간섭하지 못한다.
이렇게 프로세스는 격리되어 관리되기 때문에
하나의 프로세스가 충돌되어도 다른 프로세스에 영향을 미치지 않는다
실행활 예시로
인텔리제이가 다운되어도
크롬은 돌아가는 상황
프로세스 내부에서 메모리는
- 코드 영역
말그대로 코드 저장
- 데이터 영역
전역 변수 / 정적 변수 저장
- 힙 영역
동적으로 할당되는 메모리 영역
- 스택 영역
메서드 호출 시 생성되는 지역 변수, 반환 주소가 저장되는 영역
스레드
스레드는 프로세스 내에서 실행되는 작업의 단위이다.
이렇게 생각하면
프로세스 내에서는 어떤 작업이 실행 될 것이므로
프로세스는 하나 이상의 스레드를 반드시 포함한다.
그리고 사진에서 볼 수 있듯이
스레드는 프로세스가 제공하는 동일한 메모리 공간을 공유한다.
-> 프로세스보다 생성/관리가 단순하고 가볍다.
스레드의 메모리 구성은
- 공유 메모리
위에서 본 코드 영역, 데이터 영역, 힙 영역
- 개별 스택
스택 영역만 스레드가 따로 가진다
프로그램의 실제 실행 과정
OS가 디스크에 있는 파일 덩어리를(프로그램)
메모리로 불러오면서
프로세스를 만든다
구체적으로
- 프로세스가 코드를 메모리에 올린다 (당연히 코드 영역이겠지?)
- 스레드가 코드를 한줄 한줄 실행한다 (작업의 단위니까 당연하다)
그럼 많이 들어본 멀티 스레드는? 그냥 하나의 프로세스 안에서 여러개의 스레드가 존재할때를 의미한다
그럼 멀티스레드가 왜 필요할까?
단순하다
하나의 프로세스 내부에서도 동시에 여러가지 작업을 수행해야 하기 떄문
예를 들어
microsoft word를 사용할때
문서를 편집하면서, 자동 저장, 맞춤법 검사를 수행해야 한다
그리고 동시에 유튜브를 시청할 수 있다
단일 코어 상황
멀티 코어 상황
컨텍스트 스위칭
멀티태스킹이 항상 효율적일까?
아니다
스레드 A, 스레드 B를 멀티 태스킹을 수행한다고 하면
스레드 A를 멈추고 스레드 B를 실행해야 한다.
이후 다시 스레드 A를 실행하기 위해 돌아갈때
그냥 돌아갈 수 없으므로
스레드 A의 코드가 어디까지 수행되었는지 위치를 찾아야 한다
그러므로 스레드 A를 멈추는 시점에 이러한 변수들을 메모리에 저장해야한다.
그 후 스레드A를 다시 시행할때 이 값들을 CPU에 다시 불러와야 한다.
이 과정을 컨텍스트 스위칭 context switching이라고 한다.
컨텍스트는 한국어로 문맥
--> 이 컨텍스트 스위칭 과정에서 약간의 비용이 발생한다.
그러므로 멀티 스레드는 대부분 효율적이지만
컨텍스트 스위칭 과정이 필요하므로 항상 효율적이지는 않다.