스레드의 기본



■ 스레드의 구성
  1.  프로세스는 프로세스 커널 오브젝트, 가상 주소 공간(프로세스 메모리) 2개의 요소로 구성된다.
     스레드도 이와 비슷하게 스레드 커널 오브젝트, 스레드 스택 으로 구성 된다.
   - 스레드 커널 오브젝트(Thread Kernel Object) : 운영체제가 스레드를 다루기 위해 스레드에 대한 통계정보를 
                                                                     저장하는 공간(구조체)
   - 스레드 스택 (Thread Stack) : 스레드가 코드를 수행할 때 함수의 매개변수와 지역변수를 저장


  2. - 프로세스는 스스로 수행될 수 없고 적어도 하나의 스레드를(Primary Thread) 를 가져야 한다.
     - 프로세스는 어떤 것도 수행할 수 없으며 단순히 생각하면 "스레드의 저장소" 라고 볼 수 있다.
     - 스레드는 항상 프로세스의 컨텍스트 내에서 생성되며 프로세스 안에만 살아 있을 수 있다.
    
    ※ 프로세스의 컨텍스트(Context)
        OS의 스케줄러에 의해 시작될 프로세스와 그 환경에 대한 정보 집합 을 말함
        정보집합 : 정적변수, 동적 변수를 사용하는 실행 코드, 스택, 레지스터, 프로그램 카운터

     - 스레드는 프로세스의 주소공간의 코드를 수행할 책임을 가진다.
       하나의 프로세스에 여러개의 스레드가 존재할 경우 스레드 들은 프로세스의 주소 공간을 공유.
     - 커널 오브젝트 핸들 테이블은 스레드별로 존재하는 것이 아니라 프로세스별로 존재하기 때문에,
       스레드들은 커널오브젝트 핸들을 공유



     - 프로세스는 자신만의 주소 공간을 가지기 때문에 많은 시스템 리소스를 사용
       (메모리, 파일 리소스...)
     - 스레드는 프로세스에 비해 적은 시스템 리소스를 필요로 함.
       (스레드 커널 오브젝트, 스레드 스택)


■ 스레드 함수의 동작



1. 모든 스레드는 수행을 시작할 진입점 함수(Entry-point function) 를 반드시 가져야 한다.
   - 프로세스 내에 두번째 스레드를 만들때 진입점 함수의 형태

DWORD WINAPI ThreadFunc(PVOID)
{
    DWORD dwResult = 0;
    ...
    return dwResult;
}




■ 프로세스, 스레드


위의 예는 하나의 프로세스가 두 개의 스레드를 갖었을 때 프로세스 주소 공간의 모습
- 두 스레드는 코드, 리소스, 전역 데이터와 환경 변수 등을 공유 한다.
- 스레드는 각각 자신의 스택을 독립적으로 가지고 있다.
- 프로세스와 스레드를 관리하기 위해 운영체제는 Kernel Object 를 생성 및 유지 한다.

Posted by six605
,