Dog foot print

[예습하는 OS] 스레드 본문

컴퓨터 구조

[예습하는 OS] 스레드

개 발자국 2020. 2. 8. 00:19

스레드

쓰레드란 ? 

쓰레드(Thread)는 프로세스처럼프로세서를 사용하는 기본 단위이며, 프로그램을 실행하는 프로세스 내의 개체이다. 즉 명령어를 독립적으로 실행 할 수 있는 하나의 제어 흐름이다. 프로세스는 하나의 목적을 달성하기 위한 프로그램이라면, 스레드는 이 목적을 달성 하기 위해 실제로 작업을 실행하는 주체이다. 따라서 프로세스는 적어도 하나 이상의 쓰레드를 가지고 있으며, 둘 이상의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라고 한다. (참고로 node.js는 단일 쓰레드를 가진다. ) 

 

쓰레드의 상태

쓰레드는 다음과 같은 것들을 가지고 있다. 

 

  • 쓰레드 실행 시의 상태(실행, 준비 등)
  • 실행 스택 
  • 지역 변수와 스레드의 특정데이터를 저장하기 위한 쓰레드 별 정적 저장소
  • 프로세스의 다른 쓰레드가 공유하는 프로세스의 메모리와 자원에 대한 접근 같은 쓰레드 실행 환경 정보 

각각의 쓰레드는 다른 쓰레드와 현재의 상태를 공유하며 한 프로세스에서 동시 작업이 가능하다. 즉 프로세스에 포함된 스레드들은 프로세스의 목적을 달성하기 위해 병렬로 수행 된다. 이를 이용하면 시스템의 성능과 효율을 향상 시킨다. 예를 들어 멜론 혹은 지니뮤직 같은 프로세스를 실행 시키며, 음악을 들으면서 프로세스가 제공하는 다른 기능들인 검색, 저장, 등과 같은 기능들도 병렬 적으로 사용 할 수 있는 이유도 이 쓰레드들이 독립적인 작업을 할 수 있기 때문이다. 

 

쓰레드를 이용하면 다음과 같은 이점을 취할 수 있다. 

 

  • 사용자에 대한 응답성 증가 (웹 브라우저에서 특정 기능을 사용하며, 다른 동작을 실행 하는 것)
  • 프로세스의 자원과 메모리 공유
  • 경제성 (쓰레드는 자원을 한 프로세스의 자원을 공유하기에 프로세스에서 프로세스를 생성하는 것보다 스레드를 생성하여 문맥 교환을하는 것이 오버헤드를 줄일 수 있다. )
  • 다중 프로세서 구조 활용 가능 (각 스레드는 다른 프로세서에서 병렬로 실행 가능하다. ) 

※ 오버 헤드 : 어떤 작업을 처리하는데 들어가는 간접적인 처리 시간 

 

단일 쓰레드와 다중 쓰레드

위의 말을 보면 하나의 프로세스에서 여러개의 스레드를 생성하여 프로세스를 가동시키는 것이 무조건 좋은 듯 하다. 그렇다면 싱글 쓰레드 프로세스는 무조건 좋지 못한 형태이고, 멀티 쓰레드 프로세스는 좋기만 한 형태일까 ? 

 

단일 쓰레드의 장점

 

  • 스레드간 동기화에 신경쓰지 않아도 된다. 
  • 문맥 교환이 일어나지 않는다.

싱글 쓰레드는 하나의 프로세스가 다른 쓰레드와 자원을 공유하며, 동기화에 신경쓸 필요가 없다. 애초에 하나의 쓰레드가 모든 자원을 관리하고 수행 하기 때문에 공용자원 (저장공간, 프로세서등)에 대한 접근을 제한 할 필요가 없다. 

 

단일 쓰레드의 단점

  • 하나의 프로세서만 사용 가능하다.

이 단점이 단일 쓰레드의 가장 큰 단점이다. 단일 쓰레드는 결국 하나의 프로세서만 점유 하고 사용하기 때문에, 컴퓨터의 자원을 전부 활용 하려면 자식 프로세스를 가지거나, 새로운 프로세스 인스턴스를 만들어야 한다. 

 

멀티 쓰레드의 장점 

  • 스레드를 각 프로세서에 할당, 병렬 처리하여 프로세서 성능을 향상 시킬수 있다.
  • 프로세스를 만드는 것보다 새로운 쓰레드를 만드는 것이 빠르다.
  • 프로세스간 문맥교환 보다 쓰레드의 문맥교환이 빠르다 

멀티 쓰레드의 단점

  • 어느 쓰레드에서 시스템 호출을 실행 할 때 해당 쓰레드가 포함된 전체 작업이 시스템 호출 결과가 돌아올 때 까지 기다려야 한다. 
  • 쓰레드간 동기화를 신경써야 하며 오히려 하나의 쓰레드가 처리할 때 보다 느릴 수 있다. 
  • 운영체제가 멀티 쓰레드를 지원해야 한다.

이 처럼 각 방식마다 장, 단점이 존재한다. 멀티 쓰레드 방식은 작은 연산이 많이 이루어지는 프로세스에서 빠르게 연산이 가능하다. (게임, 통계 등)싱글 쓰레드 방식의 경우는 빠른 응답을 필요로 하는 서버 프로세스에서 적합하다. 

 

쓰레드 life-cycle

쓰레드 또한 프로세스와 마찬가지로 대기, 준비, 실행, 종료의 주기를 거친다. 

 

  • 대기 : 쓰레드가 이벤트를 기다릴 때 쓰레드는 대기 상태가 되며 이때 자신의 정보를 실행 스택에 저장한다.
  • 준비 : 쓰레드가 프로세서에 의해 실행 될 수 있는 상태이다. 
  • 실행 : 쓰레드가 프로세서를 점유하여 실행중인 상태 
  • 종료 : 쓰레드가 작업을 종료하면 자원을 해제하고 레지스터 문맥과 스택 할당이 제거 된다.

이때 쓰레드가 대기 상태이더라도 전체 프로세스를 대기 상태로 변화시키지 않는 것이 쓰레드의 유연함이다. 다만 프로세스와 달리 쓰레드는 각 자원을 모두 공유하기에 공유하는 자원에 접근 할 수 있고, 스택을 읽거나 덮어 쓰는 것이 가능하다. 

 

반응형
Comments