'Thread'에 해당되는 글 1건

  1. 2008.06.28 O/S - 쓰레드
2008. 6. 28. 20:27

O/S - 쓰레드

쓰레드 - 프로그램 실행 흔적

멀티 스레드 - 실행 흔적 여러개 ?????????, 여러개 함수를 동시에 실행 시킬 수 잇는것
                 - 일종의 fork ()  포크 개념

단일 쓰레드 - 하나의 함수가 긑나가 다른 함수를 실행 가능하다.

멀티 프로그램 - 하나의 운영체제에 여러개의 프로그램을 동시에 수행

멀티 프로세싱 - 하나의 컴퓨터에 여려개의 cpu를 가진것


--------------------------------------------------------------------------------------------------------------------------------------------------
스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
프로세스와 스레드의 비교

멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다. 하지만 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리 멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다. 또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.

멀티스레드의 다른 장점은 CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다는 것이다. 이러한 시스템에서는 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다.

멀티스레드의 단점에는 각각의 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다는 것이 있다. 예를 들어, 두 스레드가 특정 공유 변수 i의 값을 1 증가시키는 명령을 실행할 때, 다음과 같은 방식으로 수행될 수 있다.

  1. 공유되는 변수 i의 값을 레지스터에 저장한다.
  2. 레지스터의 값을 1 증가시킨다.
  3. 변수 i에 그 값을 저장한다.

이때 두 스레드가 실행될 때 어떤 스레드가 먼저 실행될지는 보장되지 않으며, 만약 다음과 같은 순서로 실행된다면:

스레드 동작 i의 값 스레드 1의 레지스터 스레드 2의 레지스터
스레드 1 i의 값을 레지스터에 저장 0 0
스레드 1 레지스터 값을 1 증가 0 1
스레드 1 i에 값 저장 1 1
스레드 2 i의 값을 레지스터에 저장 1 1 1
스레드 2 레지스터 값을 1 증가 1 1 2
스레드 2 i에 값 저장 2 1 2

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

스레드 동작 i의 값 스레드 1의 레지스터 스레드 2의 레지스터
스레드 1 i의 값을 레지스터에 저장 0 0
스레드 2 i의 값을 레지스터에 저장 0 0 0
스레드 1 레지스터 값을 1 증가 0 1 0
스레드 2 레지스터 값을 1 증가 0 1 1
스레드 1 i에 값 저장 1 1 1
스레드 2 i에 값 저장 1 1 1

i는 2가 증가되고, 이것은 원래 프로그램의 의도(각각의 스레드가 i를 1씩 증가하는 동작)와 다를 수 있다. 또한 이러한 문제는 스레드의 실행 조건에 따라 결과가 다르게 나오므로, 오류가 발생했을 때 원인을 찾기가 힘들다. 이러한 문제를 경쟁 조건이라고 하며, 문제를 막기 위해 세마포어와 같은 방법을 통해 공유 데이터에 접근하는 스레드의 개수를 한개 이하로 유지하는 방법을 사용할 수 있다.

[편집] 멀티스레드 프로그래밍의 장점

  1. 응답성 : 대화형 프로그램을 멀티스레드화하면, 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속되어, 사용자에 대한 응답성이 증가된다. 예를 들어, 멀티스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에 사용자와의 상호 작용이 가능하다.
  2. 자원 공유 : 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 활동성 스레드를 가질 수 있다는 점이다.
  3. 경제성 : 프로세스 생성에 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥교환을 하는 편이 보다 경제적이다.
  4. 멀티프로세서 활용 : 멀티프로세서 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다. 단일 스레드 프로세스는 CPU가 많아도 CPU 한개에서만 실행된다. 즉, 다중 스레드화을 하면 다중 CPU에서 병렬성이 증가된다.

[편집] 스레드의 종류

스레드를 지원하는 주체에 따라 2가지로 나눌 수 있다.

[편집] 사용자 스레드

사용자 스레드는 커널 영역의 상위에서 지원되며 일반적으로 사용자 레벨의 라이브러리를 통해 구현되며, 라이브러리는 스레드의 생성 및 스케줄링 등에 관한 관리 기능을 제공한다. 동일한 메모리 영역에서 스레드가 생성 및 관리되므로 속도가 빠른 장점이 있는 반면, 여러 개의 사용자 스레드 중 하나의 스레드가 시스템 호출 등으로 중단되면 나머지 모든 스레드 역시 중단되는 단점이 있다. 이는 커널이 프로세스 내부의 스레드를 인식하지 못하며 해당 프로세스를 대기 상태로 전환시키기 때문이다.

[편집] 커널 스레드

커널 스레드는 운영체제가 지원하는 스레드 기능으로 구현되며, 커널이 스레드의 생성 및 스케줄링 등을 관리한다. 스레드가 시스템 호출 등으로 중단되더라도, 커널은 프로세스 내의 다른 스레드를 중단시키지 않고 계속 실행시켜준다. 다중처리기 환경에서 커널은 여러 개의 스레드를 각각 다른 처리기에 할당할 수 있다. 다만, 사용자 스레드에 비해 생성 및 관리하는 것이 느리다.

[편집] 스레드 데이터

[편집] 스레드 기본 데이터

스레드도 프로세스와 마찬가지로 하나의 실행 흐름이므로 실행과 관련된 데이터가 필요하다. 일반적으로 스레드는 자신만의 고유한 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택을 가진다. 코드, 데이터, 파일 등 기타 자원은 프로세스 내의 다른 스레드와 공유한다.

[편집] 스레드 특정 데이터

위의 기본 데이터 외에도 하나의 스레드에만 연관된 데이터가 필요한 경우가 있는데, 이런 데이터를 스레드 특정 데이터(Thread-Specific Data, 줄여서 TSD)라고 한다. 멀티스레드 프로그래밍 환경에서 모든 스레드는 프로세스의 데이터를 공유하고 있지만, 특별한 경우에는 개별 스레드만의 자료 공간이 필요하다. 예를 들어 여러 개의 트랜잭션을 스레드로 처리할 경우, 각각의 트랜잭션 ID를 기억하고 있어야 하는데, 이 때 TSD가 필요하다. TSD는 여러 스레드 라이브러리들이 지원하는 기능 중의 하나이다.

[편집] 멀티스레드 모델

[편집] 다-대-일(Many-to-One)

여러 개의 사용자 레벨 스레드들이 하나의 커널 스레드(프로세스)로 매핑되는 방식으로, 사용자 레벨에서 스레드 관리가 이루어진다. 주로 커널 스레드를 지원하지 않는 시스템에서 사용하며, 한번에 하나의 스레드만이 커널에 접근 가능하다는 단점이 있다. 하나의 스레드가 커널에 시스템 호출을 하면 나머지 스레드들은 대기해야 하기 때문에, 진정한 의미의 동시성을 지원하지 못한다. 즉, 여러 개의 스레드가 동시에 시스템 호출을 사용할 수 없다. 또한 커널의 입장에서는 프로세스 내부의 스레드들을 인식할 수 없고 하나의 프로세스로만 보이기 때문에 다중처리기 환경이라도 여러 개의 처리기에 분산하여 수행할 수 없다.

[편집] 일-대-일(One-to-One)

사용자 스레드들을 각각 하나의 커널 스레드로 매핑시키는 방식이다. 사용자 스레드가 생성되면, 그에 따른 커널 스레드가 생성되는 것이다. 이렇게 하면 다-대-일 방식에서 시스템 호출 시 다른 스레드들이 중단되는 문제를 해결할 수 있으며, 여러 개의 스레드를 다중처리기에 분산하여 동시에 수행할 수 있는 장점이 있다. 다만, 커널 스레드도 한정된 자원을 사용하기 때문에 무한정 생성할 수는 없기 때문에, 스레드 생성할 때 그 개수를 염두에 두어야 한다.

[편집] 다-대-다(Many-to-Many)

여러 개의 사용자 스레드를 여러 개의 커널 스레드로 매핑시키는 모델이다. 대-다-일 방식과 일-대-일 방식의 문제점을 해결하기 위해 고안되었다. 커널 스레드는 생성된 사용자 스레드와 같은 수 또는 그 이하로 생성하어 스케줄링한다. 다-대-일 방식에서 스레드가 시스템 호출시 다른 스레드가 중단되는 현상과, 일-대-일 방식에서 사용할 스레드의 수에 대해 고민할 필요가 없다. 커널이 사용자 스레드와 커널 스레드의 매핑을 적절히 조절한다.

[편집] 프로세스 관리의 변화

멀티스레드 환경이 확산됨에 따라 전통적인 프로세스 관리 방식에도 변화가 필요해졌다. 예를 들어, fork 또는 exec와 같은 시스템 호출시에 어떻게 처리할 것인가 하는 문제가 대두된 것이다.

  • fork 문제 : 어떤 프로세스 내의 스레드가 fork를 호출하면 모든 스레드를 가진 프로세스를 생성할 것인지, 아니면 fork를 요청한 스레드만 가진 프로세스를 생성할 것인지 하는 문제이다. 유닉스에서는 각각 2가지 버전의 fork를 지원하고 있다.
  • exec 문제 : fork를 통해 모든 스레드를 복제하고 난 후, exec를 수행한다면 모든 스레드들이 초기화된다. 그렇다면 교체될 스레드를 복제하는 작업은 필요가 없기 때문에 애초에 fork를 요청한 스레드만을 복제했어야 한다. 한편, fork를 한 후에 exec를 수행하지 않는다면 모든 스레드를 복제할 필요가 있는 경우도 있다.
                                                                                                   
  • 출처 :  위키백과   ,    http://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C