프로세스와 스레드의 차이에 대해 설명해 주세요
1. 메모리
메모리는 컴퓨터에서 작업을 수행하기 위해 처리 대상이나 결과 등을 저장하기 위한 공간입니다. 프로그램을 실행하기 위한 정보들은 메모리에 저장되어 처리됩니다.
2. 프로세스
2-1. 정의
- 컴퓨터에서 프로그램을 실행하는 작업 단위( 실행된 프로그램)
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
2-2. 특징
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
Ex) 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
3. 쓰레드
3-1. 정의
- “프로세스 내에서 실행되는 여러 흐름의 단위”
- 프로세스의 특정한 수행 경로
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
3-2. 특징
- 쓰레드는 프로세스 내에서 Stack만 따로 할당 받고, Code, Data, Heap 영역은 공유한다.
(Stack을 분리한 이유는 Stack에는 함수의 호출 정보가 저장되는데, Stack을 공유하면 LIFO 구조에 의해 실행 순서가 복잡해지기 때문에 실행 흐름을 원활하게 만들기 위함이다.)
- 쓰레드는 프로세스의 자원을 공유하기 때문에 다른 쓰레드에 의한 결과를 즉시 확인할 수 있다.
3-1 동시성(Concurrency) vs 병렬적 (Parallelism)
3-1-1. ❄️ 동시성
- 동시성은 적어도 두 개의 스레드가 진행 중 일때 존재하는 조건이며 , 가상 병렬 처리의 형태의 시간분할(time-slicing)을 포함합니다.우리가 흔히 '동시'라고 이야기 하지만 컴퓨터(코어)는 한번에 하나의 명령어만 처리를 할 수 있다. 즉 두개 이상의 알고리즘이 하나의 코어에서 스레드간을 빠르게 교차되면서 실행되기 때문에 '동시'라고 느끼는 것입니다. 이를 이라고 한다.
3-1-2. ❄️ 병렬적
- 적어도 2개 이상의 코어가 있어야 합니다. 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말합니다. 그러므로 두개의 알고리즘이 정확히 같은 시점에 실행될 때 이를 병렬적이라고 말할 수 있습니다.
컨텍스트 스위칭(Context Switching)이란?
Context Switching이란 인터럽트를 발생시켜 CPU에서 실행중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정입니다. Context Switching는 현재 실행중인 프로세스의 상태(Context)를 먼저 저장하고, 다음 프로세스를 동작시켜 작업을 처리한 후에 이전에 저장된 프로세스의 상태를 다시 복구합니다. 여기서 인터럽트란 CPU가 프로세스를 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요함을 CPU에게 알리는 것을 말합니다.
4. 멀티 프로세스 VS 멀티 쓰레드
4-1. 멀티 프로세스
- 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 것이다.
4-1-1. 장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
4-1-2. 단점
1 ) Context Switching에서의 오버헤드 증가
- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching가 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 해서 오버헤드가 발생합니다.
2 ) 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)
- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 별도의 설비가 없이는 서로간에 통신이 어렵습니다. 이를 위해서는 커널 영역에서 제공하는 ipc설비를 이용하여 프로세스 간의 통신을 할 수 있게 됩니다.
- IPC(Inter Process Communication) : 커널 영역에서 제공하는 내부 프로세스간의 통신
4-2. 멀티 스레드
- 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것이다.
- 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
- ❄️ 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
4-2-1. 장점
1 ) 시스템 자원 소모 감소 (자원의 효율성 증대)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
2 ) 시스템 처리량 증가 (처리 비용 감소)
스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
-> 스레드 사이의 작업량이 작아 -> Context Switching이 빠르므로 시스템 처리량이 증가하여 처리비용이 감소한다.
3 ) 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 응답 시간이 단축됩니다.
4-2-1. 단점
1 ) 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
2 ) 구현이 어렵다. 자원 공유인 동기화 문제가 발생한다.
쓰레드간의 동기화를 하기 위한 구현이 어려운데 , 쉽게 동기화를 구현하면
Context Switching 오버헤드가 있기 때문에 동기화를 잘못하면 오히려 더 느려진다.
(OS에서 하드웨어의 CPU에 동작이 제한이 걸려있어서 동작하는 CPU를 바꿔가면서 동작하도록 하기 때문에 Context Switching을 하면 오버헤드가 발생한다.)
3 ) 디버깅이 어렵다.
쓰레드가 동시에 동작하기 때문에
디버거를 쓰거나, 디버깅을 하기 위한 코드를 추가하면 나노 세컨드로 작업을 하기때문에 동작의 순서가 바뀌면 동작이 크게 바뀔수 있어 디버깅이 어렵습니다.
4 ) 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
4-3. 멀티 프로세스 대신 멀티 스레드를 사용하는 이유?
쉽게 설명하면, 프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.
여러 프로세스(멀티 프로세스)로 할 수 있는 작업들을 하나의 프로세스에서 여러 스레드로 나눠가면서 하는 이유?
1 ) 자원의 효율성 증대
멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
–> 이유 :
❄️ 프로세스 간의 Context Switching시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐쉬 메모리에 대한 데이터까지 초기화되므로 오버헤드가 크게 발생하지만
❄️ 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
스레드는
2 ) 처리 비용 감소 및 응답 시간 단축
또한 프로세스 간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어든다.
–> 이유 :
❄️ 프레세스의 경우 통신을 하기 위해선 커널에서 제공하는 IPC설비를 별도로 해야되지만
❄️스레드는 stack 영역을 제외한 모든 메모리를 공유하므로 Context Switching시 스레드간의 전환속도가 빠릅니다.
⚠️주의할 점!
❄️ 동기화 문제
동기화 문제는 멀티 스레드가 프로세스 내의 같은 자원을 공유함으로써 발생하게 됩니다.
❄️ 해결
따라서 이러한 문제를 방지하기 위해 스레드들에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법을 사용합니다 (동기화 시킨다).
4-2-3. 동기화 기법
유명한 Toilet Problem 예제를 통해 이 둘을 간단하게 비교할 수 있습니다.
뮤텍스(Mutex)
공유된 자원의 데이터를 여러 프로세스나 스레드가 접근
하는 것을 막는 것
임계영역을 가진 스레드나 프로세스의 Running Time 이 서로 겹치지 않도록 각각 단독으로 실행하는 기법입니다.
뮤텍스는 화장실이 하나밖에 없는 식당과 비슷합니다. 화장실을 가기 위해서는 카운터에서 열쇠를 받아가야 합니다.
다른 사용자들은 열쇠가 없으면 화장실을 갈 수 없으며 카운터에서 대기합니다. 화장실을 이용을 끝낸 사람이 카운터에 키를 반납하게 되면 카운터에서 대기하던 다음 사용자가 키를 가지고 화장실을 사용할 수 있습니다.
여기서 화장실은 공유자원, 화장실 키는 공유자원에 접근하기 위한 오브젝트, 사람들은 프로세스 혹은 스레드 입니다.
즉 뮤텍스는 화장실 키에 해당하는 오브젝트가 있으며 이 오브젝트를 소요한 자만이 공유자원에 접근할 수 있습니다.
세마포어(Semaphore)
공유된 자원의 데이터에 대한 최대 허용치 값을 두어
프로세스나 스레드의 동시 접근을 것을 막는 것
공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있습니다.
세마포어는 여러개의 화장실이 있는 식당과 비슷합니다. 화장실에는 여러개의 칸이 있으며 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있습니다.
모든 화장실칸에 사람이 들어갈 경우 빈 화장실칸은 0 이 됩니다. 빈 칸의 개수가 1이 될 때까지 다음 사용자는 기다려야 합니다.
여기서 화장실이 공유자원이며 사람들이 스레드 혹은 프로세스 입니다. 그리고 화장실 빈 칸의 개수(설정한 한계치) 는 현재 공유자원에 접근할 수 있는 스레드와 프로세스의 개수를 나타냅니다.
참고
https://velog.io/@wonseok97/%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%95%B4%EA%B2%B0%EB%B2%95