오늘도 개발

프로세스와 스레드 본문

CS

프로세스와 스레드

Sueeeeeee 2022. 10. 27. 17:31

1. 프로세스와 스레드

프로그램

코드가 들어있는 파일.

저장 장치에 저장되어있지만 RAM에는 올라가있지 않은 정적인 상태.

프로세스

실행중인 프로그램. RAM에 적재된 동적인 상태.

프로그램을 실행하면 OS가 해당 프로그램을 위한 프로세스 인스턴스를 만들어 RAM에 적재한다.

OS는 프로세스 인스턴스를 만들 때 해당 프로세스가 사용할 수 있는 자원을 할당해준다.

 

OS가 할당하는 자원은 다음과 같다.

- 해당 프로세스가 차지할 수 있는 CPU의 시간

- 운영을 위해 필요한 주소 공간

- 독립된 메모리 영역(Code, Data, Stack, Heap으로 구성)

 

출처 : Heee's Development Blog

정리하자면 프로세스는 OS로부터 자원을 할당받은 작업 단위라고 할 수 있다.

한 개의 프로세스는 최소 한 개의 스레드를 갖는다.

 

과거에는 프로그램을 실행하면 처음부터 끝까지 하나의 프로세스로만 진행했다.

하지만 프로그램이 복잡해지면서 프로세스 하나로 실행하기에는 점점 무리가 갔다.

 

한 프로그램을 처리하기 위한 프로세스를 여러 개 만드는 방법(멀티 프로세싱)도 있지만 번거로움이 컸다.

이러한 문제를 해결하기 위해 스레드가 등장했다.

스레드

스레드는 프로세스 안에서 실행되는 작업 흐름의 단위이다.

 

 

프로세스는 Code, Data, Stack, Heap을 갖는다.

프로세스 내의 각 스레드는 각각의 Stack 메모리와 레지스터를 할당받지만,

프로세스의 Code, Data, Heap 영역은 공유하며 서로 읽고 쓸 수 있다. 

 

출처 : UNIX Threads

스레드는 프로세스와 달리 자원을 다른 스레드와 공유한다.

따라서 한 스레드에 오류가 나면 다른 스레드도 강제로 종료된다.

 

2. 멀티프로세스, 멀티스레드

멀티 프로세스

한 프로그램을 여러 개의 프로세스가 맡도록 구성하는 방식.

각 프로세스가 하나의 작업(태스크)을 처리한다.

 

싱글코어인 경우 멀티 프로세싱을 사용해도 한번에 한 프로세스만 실행한다.

대신 한 프로세스가 대기 상태에 들어가면 다른 프로세스를 깨우는 Context Switching이 일어난다.

즉, 한 번에 한 프로세스만 실행되지만 빠르게 switching해서 동시에 프로세스를 실행하는 것 처럼 보이게 한다.(=concurrent, 동시적

 

멀티코어에서는 여러 코어에서 여러 프로세스를 동시에 실행할 수 있다(=parallel, 병렬적).

 

* Core: CPU의 핵심 부품

* Multi-core : 한 CPU 안에 여러 코어가 있는 것

출처 : [Code Project] Concurrency VS Parallelism

 

장점

프로세스 중 하나에 문제가 발생해도 다른 프로세스에 영향을 미치지 않는다 = 안정성이 높다.

 

단점

1) 싱글코어인 경우 Context Switching에 의한 오버헤드

동작 중인 프로세스를 대기 상태로 만들 때는 해당 프로세스의 상태(Context)를 저장한 후 캐시 메모리를 리셋한다.

이후 프로세스를 깨울 때는 보관했던 상태를 복구하는데

프로세스를 깨우고 재우는 과정은 무겁고 시간이 많이 걸린다.

 

2) 멀티코어인 경우 프로세스 사이의 통신(IPC = Inter-Process Communication)이 복잡함

멀티 스레드

한 프로그램을 여러 개의 스레드가 맡도록 구성하는 방식.

각 스레드가 하나의 작업을 처리한다.

 

싱글코어인 경우 멀티 스레드를 사용해도 한번에 한 스레드만 실행한다.

대신 한 스레드가 대기 상태에 들어가면 다른 스레드를 깨우는 Context Switching이 일어난다.

멀티코어에서는 각 스레드를 여러 프로세서에서 병렬로 실행할 수 있다.

 

장점

1) 경제적이다.

프로세스 자원을 공유하기 때문에 메모리 공간, 시스템 자원 소모가 적다.

Context Switching 시에도 캐시 메모리를 비울 필요가 없기 때문에 효율적이다. 

 

2) 스레드 간 통신 방법이 간단함 

메모리를 공유하기 때문에 통신이 쉽다 => 프로그램 응답 시간 단축 

 

3) 응답성을 높일 수 있다.

A 스레드는 네트워크 i/o 바운드 작업을 하고 있고

B 스레드는 빠르게 끝나는 작업을 하는 경우 

 

단점

1) 싱글코어에서 멀티스레드 방식을 쓰는 경우 오히려 단일 스레드보다 느릴 수 있다.

 

2) 동기화 필요

공유하는 자원에 여러 스레드가 동시에 접근하는 경우

동기화가 되지 않아 문제가 발생할 수 있기 때문에 해결해야 한다.

예를 들어 데이터를 저장하는 동안에는 읽지 못하게, 읽는 동안에는 쓰지 못하게 막아야 한다. 

하지만 이런 작업이 병목 현상을 일으킬 수도 있으므로 유의해야 한다.

 

3) 디버깅이 까다롭다.

 

4) 안정성 문제가 있다. 

한 스레드에 문제가 발생하면 전체 스레드가 영향을 받는다.

 

 

참고

[개발장] 프로세스와 스레드의 차이

싱글스레드(Single thread) vs 멀티스레드 (Multi thread)

'CS' 카테고리의 다른 글

동기화(프로세스 동기화, 스레드 동기화)  (1) 2022.10.28
컴파일 VS 인터프리팅  (0) 2022.05.25