본문 바로가기
CS/운영체제

11. 스레드 주소 공간과 컨텍스트

by D.O.T 2024. 4. 22.

스레드의 주소 공간

스레드의 주소공간은 생각보다 간단하다.

프로세스 주소공간을 그대로 나누어가지고 있다.

 

기존 프로세스의 코드, 데이터, 힙, 스택 영역은 공유 영역이되고 개별 스레드마다 코드 영역, 데이터 영역, 스택 영역, 커널 영역으로 나누어 사용되고 있다.

 

※ 프로세스와 스레드는 유사하다는 것을 알 수 있다.


스레드 생명 주기

 

프로세스에서 스레드로 바뀌었으니 유사한 것은 당연하다. 그럼 프로세스에서 있는 개념들은 웬만하면 스레드에도 적용된다는 것을 알 것이다. 스레드 또한 생명주기가 있다.

 

프로세스는 NEW, Ready, Running, Blocked, Zombie, Out 상태가 있었다.

스레드는 Ready, Running, Blocked, Terminated 상태가 있다. 각 상태에 대한 기본적이 내용은 프로세스와 동일하다.

각 각 실행을 대기, 시작, 인터럽트 및 시스템 호출, 종료 상태를 의미한다.

스레드의 생명 주기

 

pthread_create : 스레드의 생성도 fork()와 마찬가지로 부모 스레드가 자식 스레드를 생성할 수 있다. 

pthread_exit() - 스레드를 종료한다. main에서 실행할 경우 main 스레드만 종료된다. 프로세스 종료와 다르다.

pthread_join() - 다른 스레드가 종료할 때까지 대기한다. (부모 스레드)

yield() - 스레드가 자발적으로 다른 스레드를 실행하도록 양보한다.

 

프로세스는 TCB에 컨텍스트 정보와 스레드 정보, 스케줄링 정보 등이 저장되는데 커널에 의해 관리된다.

프로세스의 PCB에서 TCB가 Linked List로 연결된다 PCB -> TCB1 -> TCB2

 

스레드는 언제 컨텍스트 스위칭이 발생할까?

 

Process에서는 Interrupt나 SystemCall에 의해 프로세스 스케줄링의 변경이 생길 때 컨텍스트 스위칭이 발생했다.

Thread도 마찬가지다. 시스템 호출이나 Interrupt 또는 TimeSlice가 소진된 경우에 컨텍스트 스위칭이 발생한다.

다만 스레드에서는 추가적으로 yield()와 같이 자발적으로 다른 스레드에게 양보하는 시스템 호출에서도 컨텍스트 스위칭이 발생할 수 있다. 크게 보면 System 호출, Interrupt, TimeSlice 소진인 것은 동일하다.

 

이 때, PCB의 컨텍스트 스위칭과 동일하게 CPU의 스레드 컨텍스트를 TCB에 저장하고 다음 링크에 있는 TCB를 CPU에 적재한다. TCB를 적재하면서 SP 레지스터를 통해 이전의 중단된 위치에서 실행을 이어나갈 수 있다.

 

스레드는 컨텍스트 스위칭의 오버헤드가 없을까?

 

스레드도 마찬가지로 컨텍스트 스위칭에 오버헤드가 발생한다.

컨텍스트 스위칭은 CPU 작업으로 마찬가지로 CPU 시간이 소모되지만, 하나의 프로세스 덩어리를 컨텍스트 스위칭 할 필요가 없어졌으므로 프로세스에 비해 많이 가벼워졌다는 장점이있다.

 

오버헤드 발생의 두 가지 경우

 

1. 동일한 프로세스에서 다른 스레드로 스위칭

이 경우, CPU 컨텍스트 정보를 TCB에 저장하고 다음 스레드의 TCB 정보를 CPU에 적재하는 시간이 소모된다.

또, TCB 리스트에서 ready인지 block인지 상태를 처리하고 Cache가 가득찼을 경우, 컨텍스트 스위칭하는 Thread의 Cache Memory를 Flush하는데 추가적인 시간이 소모가 된다.

 

2. 다른 프로세스의 스레드로 스위칭

이 경우, 프로세스 컨텍스트 스위칭과 거의 동일한 시간이 소모될 것이다.

다른 프로세스의 스레드에 접근한다는 것은 스레드 컨텍스트 이전에 프로세스 컨텍스트가 발생하기 때문이다. 하지만 멀티 스레드 OS에서는 스레드를 스케줄 단위로 처리하는 점은 명시하고 있어야 한다.

 

 프로세스와 스레드에 대한 정리

 

  • 프로세스는 스레드들에 대해 저장 공간을 공유하고 있다.
  • 프로세스는 운영체제가 응용프로그램을 적재하는 단위이다.
  • 스레드는 실행 단위이다.
  • PCB는 환경 컨텍스트(environment context)라 하고 TCB는 실행 컨텍스트(execution context)라고 한다.
  • 프로세스에 속한 모든 스레드가 종료될 때 프로세스도 종료된다.