오늘 이력서 작성 중, 같이 교육받았던 형님이 Slack에 메시지를 올렸다.
CS 기술 면접에서 첫 질문으로 프로세스와 스레드의 차이점에 대해 설명하라는 질문을 받았다고 하셨다.
그러고 곰곰히 생각해봤다.
나는 프로세스랑 스레드의 차이점을 확실히 이해하고 설명할 수 있나?
12월에 pintOS 운영체제를 학습하면서 그토록 스레드와 프로세스를 가지고 놀면서 마스터했다고 생각했지만, 막상 설명하려고 생각해보니 명확히 설명하지 못할 것 같았다.
그래서 ! 오늘 다시 프로세스와 스레드의 정의를 바로 지난달에 발표를 마친 let's Note 프로젝트에 적용하여 한번 이해해보는 시간을 가져보려고 한다.
프로세스란 ?
프로세스는 죽어있는 프로그램에 생명이 부여되어 실행되고 있는 상태를 말한다는 운영체제 속 문구가 생각난다.
프로세스는 컴퓨터에서 현재 실행되고 있는 프로그램을 의미한다.
다른 말로 정확히 이야기 하면 RAM(메모리)에 올라와 있는 프로그램의 독립적인 인스턴스 이다.
그리고 이 프로세스에게 시스템 자원을 정해진 규칙하에 할당해 주는 것이 운영체제의 역할이다.
프로세스는 운영체제로 부터 다음의 시스템 자원을 제공받는다.
- CPU 시간 (프로세스에 제공되는 스케줄)
- 독립된 메모리 주소 공간
- heap, stack, code seg, data seg 메모리 영역
프로세스는 기본적으로 적어도 한 개 이상의 쓰레드(메인 쓰레드)를 가지고 있다.
쓰레드란 ?
쓰레드란 사전적으로 프로세스 내에서 실행되는 여러 흐름의 단위이다.
쓰레드는 프로세스의 특정한 경로로 수행되는 흐름이며, 프로세스가 할당받은 자원(코드,데이터,힙,스택)을 사용하여 실행된다.
쓰레드는 프로세스 내에서 각각 Stack 만 따로 할당받고, Code Data, Heap 영역은 공유한다.(이 떄문에 동시성 문제가 발생)
그리고 각각의 쓰레드는 할당받은 Stack과 함께 레지스터를 가지며(인터럽트 프레임이 있는 이유),
힙 메모리를 서로 읽고 쓰는 방식을 수행한다.
따라서 한 스레드가 프로세스 자원(Heap)을 변경하면, 다른 이웃 스레드도 그 변경 결과를 즉시 볼 수 있다.
이때 ,Code segment와 Data segment는 읽기 전용이라 변경이 불가하다.
자바 쓰레드
일반 스레드와 거의 차이가 없고, 운영체제는 JVM(자바 가상 머신)이 역할을 대신 수행한다.
자바에는 프로세스가 존재하지 않고 스레드만 존재한다.
그리고 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다.
멀티 프로세스 VS 멀티 스레드
멀티 프로세싱이란 하나의 응용프로그램을 여러 개의 프로세스로 각 태스크(작업)를 병렬로 처리하도록 하는 것이다.
멀티 프로세스의 장점 :
- 자식 프로세서에 문제가 발생하면 자식 프로세스를 죽이면 되고 응용 프로그램의 실행에는 영향이 가지 않는다.
멀티 프로세스의 단점 :
- 프로세스 단위의 Context Switching은 과정에서 캐쉬 메모리 초기화 등의 무거운 작업이 진행되어 오버헤드가 쓰레드의 Context Switching보다 심하다!
- 프로세스 별로 메모리 영역이 독립되어 있기 때문에 한 응용프로그램 내에서도 서로 다른 프로세스는 IPC 통신 기법을 사용해야 프로세스 간의 메모리 공유가 가능하다.
멀티 스레딩이란 하나의 프로세스 내에서 여러 개의 스레드로 구성하여 작업을 처리하는 것이다.
(웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.)
멀티 스레드의 장점 :
- 멀티 프로세스에서는 프로세스를 생성하는 과정을 여러번 수행하면서 프로세스 실행 시스템콜을 수행하는데, 멀티 스레드는 이러한 시스템 단위의 호출이 줄어들어 CPU 자원을 효율적으로 관리할 수 있다.
- 프로세스 내부의 스레드 간의 데이터 공유가 가능하므로 시스템 자원을 복사하는 소모가 필요없게 된다.
- 스레드는 작업의 작은 수행 단위이므로 Context Switching이 빠르다.
멀티 스레드의 단점 :
- 설계의 부주의로 인해 스레드 구동 방식에 문제가 생길 여지가 많다. (데드락)
- 디버깅이 까다롭다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
- 공유 공간의 동기화 문제가 발생할 우려가 있다.
- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받게 된다.
'Java' 카테고리의 다른 글
[TIL] AWS S3를 이용하여 Spring JPA에 미디어 API 구현하기 (3) | 2024.01.20 |
---|---|
[TIL] Spring Security에 JWT 필터 추가하기 (0) | 2024.01.12 |
Spring-boot 빌드 오류 : java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.cfg.DatatypeFeature (0) | 2024.01.07 |
[TIL] JAVA : @Bean, IoC 컨테이너, 의존성 주입 (2) | 2024.01.03 |
Errorfix : compatible version of org.hibernate.dialect.MySQL57Dialect (0) | 2024.01.02 |