[Computer] Process와 Thread란? ft.멀티쓰레드

2022. 8. 2. 19:46Dokhak/컴퓨터

위키백과

 

프로세스 (Process) 는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.

종종 스케줄링의 대상이 되는 작업 (Task) 이라는 용어와 거의 같은 의미로 쓰인다.

여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을

띄우는 시분할 방식을 멀티태스킹이라고 한다.

프로그램은 일반적으로 하드 디스크 등에 저장되어 있는 실행코드를 뜻하고,

프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는

작업 단위를 지칭한다.

예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다.

 

Thread 는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.

일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의

스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드 (Multi-Thread) 라고 한다.

스레드도 프로세스와 마찬가지로 하나의 실행 흐름이므로 실행과 관련된 데이터가 필요하다.

일반적으로 스레드는 자신만의 고유한 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택을 가진다.

코드, 데이터, 파일 등 기타 자원은 프로세스 내의 다른 스레드와 공유한다.

 

 

TCPschool.com

 

프로세스란 단순히 실행 중인 프로그램이라고 할 수 있다.

즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.

이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.

 

스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.

모든 프로세스에는 하나 이상의 스레드가 존재하여 작업을 수행한다.

또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.

 

 

프로세스와 스레드의 비교

 

멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다.

하지만 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를

차지하고 있는 것과 달리 멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다.

또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.

 

 

멀티스레딩

 

멀티스레딩의 장점

 

1)  응답성

 대화형 프로그램을 멀티스레드화하면, 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속되어, 사용자에 대한 응답성이 증가된다. 예를 들어, 멀티스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에 사용자와의 상호 작용이 가능하다.

 

2) 자원 공유

 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 활동성 스레드를 가질 수 있다는 점이다.

 

3) 경제성

 프로세스 생성에 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥교환을 하는 편이 보다 경제적이다.

 

4) 멀티프로세서 활용

 멀티프로세서 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다. 단일 스레드 프로세스는 CPU가 많아도 CPU 한개에서만 실행된다. 즉, 다중 스레드화를 하면 다중 CPU에서 병렬성이 증가된다.

 

멀티스레드의 장점으로는 CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을

담당하는 방법으로 속도를 높일 수 있다는 것이다. 이러한 시스템에서는 여러 스레드가 실제

시간 상으로 동시에 수행될 수 있기 때문이다.

 

 

멀티스레드의 단점

 

스레드 스케줄링은 멀티스레딩의 주요 문제이다.

각각의 스레드 중 어떤 것이 먼저 실행될 지 그 순서를 알 수 없다는 것이다.

예를 들어, 두 스레드가 특정 공유 변수 i의 값을 1 증가시키는 명령을 다음과 같은 방식으로 수행할 때,

 

1) 공유되는 변수 i 의 값을 레지스터에 저장

2) 레지스터의 값을 1 증가

3) 변수 i 에 그 값을 저장

 

두 스레드 중 어떤 스레드가 먼저 실행될지 보장되지 않으므로 아래와 같이 2가지의 경우가 발생한다.

여기서는 한 스레드가 명령을 모두 끝마치고 그 다음 스레드가 명령을 수행하기 때문에

최종 결과로 i는 2가 된다. 하지만 다음과 같이 실행된다면

최종 결과로 i는 1이 되고, 이것은 원래 프로그램의 의도와 다를 수 있다.

또한 이러한 문제는 스레드의 실행 조건에 따라 결과가 다르게 나오므로, 

오류가 발생했을 때 그 원인을 찾기 힘들다.

이러한 문제를 경쟁 조건이라고 하며, 문제를 막기 위해 세마포어와 같은 방법을 통해

공유 데이터에 접근하는 스레드의 개수를 한개 이하로 유지하는 방법을 사용할 수 있다.

 

'Dokhak > 컴퓨터' 카테고리의 다른 글

[Computer] 공용 언어 런타임 (CLR) 이란?  (0) 2022.08.05
[Computer] 닷넷 프레임워크란?  (0) 2022.08.05
[Computer] 컴파일러란?  (0) 2022.08.03
[Computer] 운영 체제란?  (0) 2022.08.03
[Computer] 런타임이란?  (0) 2022.08.03