지난 게시글에서 Concurrency(동시성/병행성)와 Parallelism(병렬성)을 정리해보았다.
그러면 이어서 프로세스와 쓰레드의 차이점에 대해 정리해보자.
프로세스를 말하기 전, 우리는 '프로그램'이라는 단어의 정의를 파악해야 한다.
📍 프로그램은 뭘까?
쉽게 말해 '코드 덩어리'이다. 파일이 보조기억장치(HDD,SSD)에 저장되어 있긴 하지만, 아직 주기억장치(메모리)에 적재되지 않은 상태이다.
이 메모리와 관련된 개념은 매우 중요해서 꼭 알아두면 좋다.
다시 돌아와서 그럼 프로세스는 무엇일까?
👉 프로그램이 메모리에 적재된 상태이다. 이것을 '동적'인 상태라고도 부르며 간단히 말해 실행되고 있는 컴퓨터 프로그램이라고 생각하면 된다.
이 프로세스의 구조에는 크게 4가지가 있다.
(사진출처 : https://becomeweasel.me/process-and-thread/)
code, data, heap stack으로 구성되어 있는데
이렇게 나뉘게 된다.
프로세스 내 실제로 작업을 수행하는 주체를 의미한다.
📍그럼 왜 쓰레드가 나왔을까?
과거에는 프로그램 실행 시작부터 끝까지 한 프로세스만을 사용하여 실행되었으나 이제는 프로세스 하나가 단순이 한 작업만을 하는 경우가 없음.
이 문제에 대해 "프로세스를 여러개 만들어서 사용하면 되지 않을까?"라는 답이 나왔지만, 한가지 문제가 생겼다.
프로세스는 안정성을 위해 자신에게 할당된 메모리 내의 정보에만 접근할 수 있다.
그래서 다른 메모리도 접근할 수 있는 "쓰레드"라는 개념이 나오게 되었다.
모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재한다. 이 것을 "멀티쓰레드"라고 한다.
멀티쓰레드는 하나의 프로세스 내에서 여러개의 쓰레드가 동시에 작업함을 의미한다.
하지만 실제로는 한 개의 CPU에서 한 개의 작업(프로세스)만 수행할 수 있기 때문에 짧은 시간동안 여러 작업을 번갈아 가며 수행하게 된다.(동시성)
앞에서 말했다시피
쓰레드는 메모리를 공유하며 동작할 수 있다.
프로세스의 구조 내 stack 부분만 독립적으로 가지고 있고 나머지 부분은 공유한다.
📌 메모리를 공유하게 되면 아래와 같은 이점이 생긴다.
1. cpu 사용률을 향상시킨다.
2. 자원을 효율적으로 사용할 수 있다.
3. 사용자 응답성이 증가한다.
4. 작업이 분리되어 코드가 간결해진다.
📌 단점은
1. 동기화 문제
2. 교착상태
3. 디버깅의 어려움
이 있다.