오늘은 프로세스
와 스레드
의 차이점에 대해 다룬다.
Velog 탐방 중, 기술 면접 질문 모음이라는 포스트를 보며 하나씩 정리하면 좋을 것 같다고 생각했다.
사실 컴퓨터 공학도라면 기초적으로 알아야 하는 지식이지만, 워낙에 배워야 할 것은 많고.. 나의 뇌 용량은 한계가 있기 때문에 주기적으로 Remind
하기로 했다.
프로세스
를 이해하려면프로그램
과 비교하면 편하다.
프로그램
은 실행가능한 명령어의 집합인데, 컴파일된 바이너리 이미지 형태일 수도 있고, 파이썬 스크립트 같이 해석되는 고급어 형태일 수도 있다.
프로그램
에 대한 예제로는 정말 많지만, 우리가 자주 쓰는 파워포인트, 워드 이런 것들이 모두 프로그램
이다.
여기서 프로세스
란 실행되고 있는 프로그램
을 뜻한다. 즉 메모리에 Load
되어 실행되고 있는 프로그램
이다.
'프로세스
는 프로그램
의 인스턴스
다' 라고도 표현할 수 있다고 한다.
실제 객체지향의 클래스
/ 인스턴스
관계와프로그램
/프로세스
관계는 공통점이 존재하는데, 이는 하나의 클래스
가 여러개의 인스턴스
를 만들 수 있는 것처럼 하나의 프로그램
에서 여러개의 프로세스
를 생성할 수 있다. 예를 들어 윈도우즈에서 메모장 프로그램
을 여러개 실행 시키는 것과 같다.
(그림 1 - 프로세스 구조)
프로세스
는 OS Kernel
에 의해 직접 관리된다.
Kernel
메모리 내부에는 각 프로세스
마다 관리되는 프로세스
에 대한 데이터
가 존재한다. 이 정보를 PCB (Process Control Block)
라고 하며, PCB에 대해선 관련 링크를 첨부한다. PCB(Process Control Block)란?
각 프로세스
는 별도의 주소공간에서 실행되며, 한 프로세스
는 다른 프로세스
의 변수
나 자료구조
에 접근할 수 없다. 한 프로세스
가 다른 프로세스
의 자원의 접근하려면 프로세스
간 통신(IPC, Inter-Process Communication)을 사용해야 한다. 예를 들어 파이프
, 소켓
등이 이에 해당된다.
위 내용을 바탕으로 정리하면 아래와 같이 요약할 수 있다.
프로그램(Program)
:프로세스
-PCB
프로세스(Process)
:프로세스
+PCB
스레드
를 말할때는 아래와 같이 정의하면 좋다고 한다.
프로세스
내에서 실행되는 흐름
일반적으로 하나의 프로세스
는 하나의 스레드
로 시작되며, 이를 메인 스레드
라고한다.
스레드
를 별도로 추가하지 않으면 모든 프로그램은 메인 스레드
에서 실행된다.
(그림 2 - 스레드 구조)
스레드
는 프로세스
의 특정한 수행 경로이다. 프로그램
상태에서 PCB
를 받아 프로세스
상태가 되면 자원을 할당받게 되는데, 이 자원을 이용하는 실행의 단위 라고 정의할 수 있다.
MS-DOS 같은 Single Threading OS
와 달리 현대 운영체제
에서는 하나의 프로세스
내에 여러 개의 스레드
가 동시에 존재할 수 있는 Mult-Threading
을 지원한다. 이는 실행 중인 프로세스
내에 여러 흐름이 존재할 수 있다는 뜻이 된다.
Mult-Threading
이 필요한 이유는 아래와 같다.
- 어떤 작업이 필요한데 내용을 업데이트 해서 데이터 베이스에 저장 해야한다.
- 먼저 파일을 읽어와서
- 내용을 업데이트 하고
- 디스크에 다시 저장한 후에
- 데이터 베이스로 넣는다.
여기서 핵심은 Single Threading
환경에서는 이러한 작업을 순차적으로 처리해야 하고, 위 작업 중 하나의 작업이 오래걸리면 전체 프로그램이 지연되는 병목현상
이 발생할 수 있다.
Mult Threading
환경에서는 이러한 작업의 흐름, 즉 스레드
를 여러개 두면 병목현상
에 걸리지 않고 전체 작업시간을 줄일 수 있다는 것이다.
또한 프로세스
간 통신에 비해서 스레드
간 통신이 훨씬 간단하다.
이유는 서로 공유하는 변수를 변경하기만 하면 되기 때문이다. 반면 프로세스
간 통신은 그 위험성으로 까다롭게 관리된다.
- 프로세스
간 통신에 비해 스레드
간 통신이 훨씬 간단함
- 시스템
의 자원 소모가 줄어든다
- 전체 응답 시간
이 단축된다.
- 여러 스레드
를 이용하는 프로그램
을 작성하는 경우에는 설계를 더 신경써야 한다.
- 디버깅
이 어렵다고 한다.(사실 이유를 잘 모르겠다 아시는분 댓글좀..)
우선 근본적인 둘의 차이는 프로세스
는 운영체제
로 부터 독립된 시간, 공간 자원을 할당받아 실행된다는 점이고, 스레드
는 한 프로세스
내에서 많은 자원을 공유하며 병렬적으로
실행된다는 것이다.
이로부터 파생되는 차이는 아래와 같다.
프로세스
는 독립적이다. 서로 구분되는 자원을 할당 받아 정말 필요한 경우가 아니라면 다른 프로세스
에 영향을 미치지 않고 실행된다.
반면, 스레드
는 프로세스
의 하위 집합으로 여러 스레드
가 같은 프로세스
자원을 공유하기 때문에 독립적이지 않다.
비슷한 의미로 프로세스
는 보유한 자원에 대한 별개 주소 공간을 갖지만 스레드
는 이 주소 공간을 공유한다.
- https://shoark7.github.io/programming/knowledge/difference-between-process-and-thread
- https://jwprogramming.tistory.com/16