본문 바로가기
IT 및 프로그래밍

프로세스와 스레드 중 스레드의 개념과 상태 변화에 관해

by 데이터 석사 2024. 10. 22.

프로세스는 두 가지 특성인 제어와 자원으로 구별할 수 있다. 이 중 제어만 분리한 실행 단위를 스레드라고 하는데, 프로세스는 하나는 스레드 한 개 이상으로 나눌 수 있다. 우리는 이러한 스레드의 개념과 상태 변화에 대해 살펴볼 것이다.

프로세스와 스레드 중 스레드의 개념과 상태 변화

스레드의 개념

스레드들은 프로세스의 직접 수행 정보를 제외한 나머지 프로세스 관리 정보를 공유한다. 프로그램 카운터와 스팩 포인터 등을 비롯한 스레드 수행 환경 정보, 지역 데이터, 스택을 독립적으로 가지면서 코드, 전역 데이터, 힙을 달 다른 스레드와 함께 나눈다.

 

프로세스 하나에 포함된 스레드들은 공통의 목적을 완수하려고 병렬로 실행한다. 곧, 프로세스가 하나인 서로 다른 프로세서에서 프로그램의 다른 부분을 같은 순간에 수행할 수 있는데, 스레드를 사용하면 다음 이점이 있다.

 

- 다중 처리로 성능과 효율 향상한다. 각 스레드를 여러 프로세서에서 병렬로 실행하여 성능과 효율성을 증폭할 수 있다.

 

- 사용자 응답성이 증가한다. 응용 프로그램의 작은 부분을 봉인하거나 긴 작업을 실행하더라도 병렬 프로그래밍으로 프로그램을 계속 수행할 수 있어 사용자 응답성을 높여준다. 예시를 들면, 다중 스레드를 적용한 웹 브라우저는 스레드 한 개가 파일을 로딩하는 동안 다른 스레드는 사용자와 상호작용이 가능하다.

 

- 경제성이 좋다. 프로세스를 만드는 것보다 스레드를 만들어 문맥을 교환하면 오버헤드가 줄어든다.

 

- 프로세스의 자원과 메모리 공유가 가능하다. 스레드들이 프로세스 자원 하나와 메모리를 공유하므로 응용 프로그램 하나가 같은 주소 공간에서 스레드를 다수 실행하여 시스템 성능을 업그레이드할 수 있다.

 

응용 프로그램에는 적어도 프로세스가 하나 있고, 프로세스에는 스레드가 한 개 이상 있다. 그리고 동일한 프로세스의 스레드들은 같은 주소 공간을 공유한다.

 

스레드는 일반적으로 다른 프로시저를 부르고 다른 수행을 기록한다. 그러므로 별도의 스택이 필수이고, 프로그램 카운터가 독립적이라서 같은 프로세스의 스레드들이 같은 순간에 코드와 같은 부분이나 다른 일부분을 수행할 수 있다. 스레드는 관련 자원과 함께 메모리를 함께 나눌 수 있는데, 이 때문에 손실된 데이터나 스레드의 이상 작동을 생각해야 한다. 스레드 중에서 프로세스의 속성 중 일부가 들어 있는 것을 경량 프로세스라고 한다. 반면에 스레드 하나에 프로세스 하나인 전통적인 경우를 중량 프로세스라고 한다.

단일 스레드와 다중 스레드

모든 스레드가 해당 프로세스의 자원을 나눠 받고, 동일한 주소 공간에 있고, 같은 데이터에 접근한다. 그러므로 스레드 한 개가 전역 데이터를 바꾸면 다른 스레드도 이 데이터에 접근하여 바꾼 결과를 체크할 수 있다. 또 스레드 한 개가 읽기 권한으로도 힙에 있는 파일을 확인하면 같은 프로세스의 다른 스레드도 이 파일을 확인할 수 있다. 이런 스레드의 특성은 프로세스의 생성과 종료 과정에 있어 많이 유용하다.

 

이런 스레드의 특성 때문에 프로세스보다 스레드를 만드는 것이 더 빠르고, 같은 프로세스에 있는 스레드 간의 교환이나 스레드 종료도 훨씬 원활하게 빠르다. 그래서 프로그램을 바꾸지 않고 스레드를 병렬로 처리하여 효율의 극대화가 가능하다. 물론 스레드별로 실행 환경 정보가 따로 있지만 서로 많이 공유하므로, 프로세스보다 같은 프로세스의 스레드에 프로세서를 같이 나눠주거나 스레드 간의 문맥 교환이 더 경제적이다.

 

단일 스레드를 지원하는 운영체제는 프로세스 하나에 스레드 한 개를 수행하는 전통적인 수단으로 아직 스레드 용어가 생성되기 전이라 개념이 확실하지 않다. 도스가 대표적인 예시이다.

 

현대 운영체제는 대다수 다중 스레드이다. 다중 스레드는 프로그램 하나를 여러 수행 단위로 나누어 실행한다는 측면에서 다중 처리와 의미가 비슷하다. 하지만 같은 프로세스의 스레드는 자원을 공유하므로 자원 생성과 관리의 중복성을 최소화하여 수행 능력을 업그레이드할 수 있다. 그리고 각 스레드는 커널이 지원하지 않고도 독립적으로 수행할 수 있어 서버에서 많은 요청을 효과적으로 작업할 수 있다.

 

스레드의 사용 예

현재 실행 중인 스레드를 대기 상태로 변환하고 컨트롤을 다른 스레드로 옮기는 상태 변화를 사용하여 많은 요구를 효율적으로 처리할 수도 있다. 예시를 들면, 다중 스레드의 개념을 적용한 웹 브라우저는 스레드 한 개가 이미지나 텍스트를 로딩하는 동안 다른 스레드는 네트워크에 이어지게 하여 데이터를 찾아볼 수 있다. 또 다른 스레드는 사용자와 상호작용 등이 가능하다. 그래서 웹 서버는 여러 사용자가 같은 순간에 접근하여 요구한 웹 페이지나 이미지를 효율적으로 작업할 수 있다.

 

공유 메모리가 있는 다중 처리 시스템에서는 프로그램을 공유 메모리에 지니게 하고 각 프로세서에 스레드를 나눠 받게 하여 병렬로 작업하면 성능을 월등히 업그레이드할 수 있다. 데이터베이스 시스템에서도 스레드를 사용할 수 있다. 그러나 스레드는 단점이 있다. 사용자 수준 스레드는 커널 자체가 스레드 한 개로 구성되어 스레드에서 시스템 호출을 수행하면 전체 작업이 이 시스템의 호출 결과를 받을 때까지 대기해야 한다.

 

현대 운영체제에서 실행하는 다수의 프로그램은 다중 스레드를 보조하여 스레드의 개념을 사용자 수준에서 적용할 수 있다. 그리고 프로그램의 비동기적 요소를 재현하는 데 이용할 수도 있다. 특히 스레드를 사용자 수준에서 적용하면 운영체제와 무관하므로 속도가 매우 빠르다. 예시를 들면, 단일 사용자 다중 처리 시스템에서는 스레드 한 개로 사용자의 데이터를 확인하여 메뉴를 표시하고, 다른 스레드로는 사용자 명령을 수행하도록 하여 이전 명령을 완수하기 전에 다음 명령을 빠르게 준비해서 속도를 향상시킬 수 있다.

 

스레드를 이용하여 프로그램의 비동기적 요소를 재현한 예로는 워드 편집기를 들 수 있다. 메모리의 내용을 지정한 시간에 디스크에 백업하도록 정기적인 백업 스레드를 만드는 경우가 여기에 해당한다.

 

스레드의 상태 변화

스레드와 프로세스는 동일한 점이 상당히 많다 프로세스처럼 준비, 실행, 대기, 종료 상태가 있다. 스레드는 프로세서를 다 같이 이용하고 항상 하나만 수행한다. 그리고 한 프로세스에 있는 스레드는 순서대로 수행하고, 해당 스레드의 정보를 저장하는 레지스터와 스택이 존재한다.

스레드의 제어 블록

프로세서가 프로세스 제어 블록에 정보를 지니게 하듯 스레드도 스레드 제어 블록에 정보를 지니게 한다. 그런데 프로세스는 스레드를 한 개 이상 가질 수 있으므로, 결국 프로세스 제어 블록은 스레드 컨트롤 블록의 리스트를 지칭하는 것이다.

 

요약 및 결론

• 프로세스는 제어와 자원의 두 가지 특성으로 구분되며, 제어만 분리한 실행 단위를 스레드라고 한다. 

• 스레드는 프로세스의 직접 실행 정보를 제외한 나머지 프로세스 관리 정보를 공유한다. 

• 프로세스 하나에 포함된 스레드들은 공동의 목적을 완수하려고 병렬로 실행된다. 

• 스레드를 활용하면 다중 처리로 성능과 효율을 향상시키고, 사용자 응답성을 증가시키며, 경제성을 높일 수 있다. 

• 스레드는 프로세스의 자원과 메모리를 공유할 수 있다. 

• 현대 운영체제는 대부분 다중 스레드이며, 스레드를 이용하여 프로그램의 비동기적 요소를 구현할 수 있다.