관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

프로세스와 스레드 4 - 스레드 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

프로세스와 스레드 4 - 스레드

huenuri 2024. 10. 17. 22:56

스레드라는 말을 프로그래밍에서 많이 들어본다. 드디어 스레드에 대해 공부해 본다. 스레드는 프로세스를 구성하는 실행의 흐름 단위이다. 이 말이 정확히 무엇을 의미하는지, 멀리스레드와 멀티 프로세스의 차이를 알아볼 것이다.

여기서는 소프트웨어적인 스레드를 학습하게 된다.

 

 

개발자로서 일을 하게 된다면 반드시 스레드를 다루게 될 날이 올 것이다. 하지만 스레드와 관련한 내용은 프로그래밍 기본서만 가볍게 학습하면 놓치기 쉬운 부분이기도 하다. 이번 절을 통해 스레드와 멀티스레드란 무엇인지, 멀티스레드는 멀티프로세스와 어떤 차이가 있는지 학습해 보겠다.


 

 

 

프로세스와 스레드

전통적인 관점에서 보면 하나의 프로세스는 한 번에 하나의 일만을 처리했다. 가령 웹 브라우저, 게임, 워드 프로세서 프로세스가 있을 때 이 모든 프로세스가 하나의 실행 흐름을 가지고 한번 에 하나의 부분만 실행되는 프로세스를 가정했다.

 

 

하지만 스레드라는 개념이 도입되면서 하나의 프로세스가 한번에 여러 일을 동시에 처리할 수 있게 되었다.


 

 

스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다. 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있다.

여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다는 점이다. 프로세스의 자원을 공유한다는 것이 스레드의 핵심이다. 위 그림을 보면 스레드 1만의 코드/데이터/힙 영역이 있고, 스레드 2만의 코드/데이터/힙 영역이 있는 게 아니라는 의미이다.

 

정리하면, 프로세스가 실행되는 프로그램이라면 스레드는 프로세스를 구성하는 실행의 흐름 단위이다. 실제로 최근 많은 운영체제는 CPU에서 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달한다. 그리고 스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행된다.

 

 

리눅스 운영체제에서 프로세스 VS 스레드

많은 운영체제가 프로세스와 스레드를 구분하지만, 프로세스와 스레드 간의 명확한 구분을 짓지 않는 운영체제도 있다. 대표적으로 리눅스가 그러하다. 리눅스는 프로세스와 스레드 모두 실행의 문맥이라는 점에서 동등하다고 간주하고 이 둘을 크게 구분 짓지 않는다. 프로세스와 스레드라는 말 대신 태스크(task)라는 이름으로 통일하여 명명한다.

 

아래 문서는 "프로세스와 스레드의 개념을 조금 더 분명히 구분 지을 필요가 있다"는 말에 대한 리눅스 운영체제 창시자 리누스 토르발스의 반응이다. 

 

리눅스에서 프로세스와 스레드를 바라보는 관점

 

Linux-Kernel Archive: Re: proc fs and shared pids

Re: proc fs and shared pids Linus Torvalds (torvalds@cs.helsinki.fi) Tue, 6 Aug 1996 12:47:31 +0300 (EET DST) On Mon, 5 Aug 1996, Peter P. Eiserloh wrote: > > We need to keep a clear the concept of threads. Too many people > seem to confuse a thread with a

lkml.iu.edu


 

 

 

 

멀티프로세스와 멀티스레드

여러 프로세스를 동시에 실행하는 것을 멀티프로세스, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고 한다.

 

예를 들어, "hello, os"를 화면에 출력하는 간단한 프로그램이 있다고 해보자. 이 프로그램을 세 번 fork하여 실행하며 화면에는 "hello, os"가 세 번 출력된다. 이 프로그램 내에 "hello, os"를 출력하는 스레드를 세 개 만들어 실행해도 화면에는 "hello, os"가 세 번 출력된다. 이 둘은 무엇이 다를까?

 

여기에는 큰 차이가 있다. 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점이다.

 

 

이는 어찌 보면 낭비이다. 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재하는 것이기 때문이다.

 

 


 

 

 

 

같은 프로세스 내의 모든 스레드는 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스 자원을 공유한다. 여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있다.

 

 

 

멀티프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 적거나 없지만, 멀티스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다. 모든 스레드는 프로세스의 자원을 공유하고, 하나의 스레드에 문제가 생기면 다른 스레드도 영향을 받기 때문이다.

 

 

프로세스 간 통신

'통신'은 네트워크를 통해 데이터를 주고받는 방식만을 떠올리기 쉽지만, 같은 컴퓨터 내의 서로 다른 프로세스나 스레드끼리 데이터를 주고받는 것도 통신으로 간주한다. 가령 프로세스 A는 'hello.txt' 파일에 새로운 값을 쓰는 프로세스, 프로세스 B는 'hello.txt' 파일을 읽는 프로세스라면 두 프로세스는 'hello.txt' 파일 속 데이터를 주고받으므로 프로세스 간의 통신이 이루어져야 한다. 이는 파일을 통한 프로세스 간 통신으로 볼 수 있다.

 

프로세스들은 서로 공유하는 메모리 영역을 두어 데이터를 주고받을 수 있다. 프로세스들이 공유할 수 있는 메모리 영역을 공유 메모리라고 한다. 가령 프로세스 A와 B가 공유하는 메모리 영역 내에 'name'이라는 전역변수가 있다고 가정해 보자. 프로세스 A가 name 안에 값을 저장한 뒤, 프로세스 B가 name 변수 값을 읽어 들인다면 두 프로세스는 전역 변수 name을 통해 서로 값을 주고받았다고 볼 수 있다.


 

 

 

단원 마무리하기

 

 


 

 

 

학습을 마치고

스레드에 대해서 배울 수 있는 중요한 시간이었다. 프로세스와 스레드의 차이점을 확실히 알 것 같다. 자바에서도 스레드 단원이 있는데 아직 공부하지는 못했지만 이 학습을 마치고 자바도 이어서 공부해보고 싶어졌다. 비동기 통신을 다루는 내용도 정말 재미있을 것 같다.

이어서 스레드 실습도 진행해 볼 것이다.