목차
TCB
TCB는 운영 체제가 스레드의 정보를 관리하기 위해 사용하는 중요한 데이터 구조입니다.
이 구조는 스레드의 상태, 컨텍스트, 우선순위 등을 포함하여, 스레드가 시스템 내에서 효율적으로 실행되도록 돕습니다.
스레드는 프로세스 내에서 실행되는 경량의 실행 단위로, 프로세스의 자원을 공유하면서 동작합니다.
TCB의 구성 요소
1.
스레드 식별자
•
각 스레드에는 고유한 식별자가 있어, 운영 체제가 스레드를 구별하고 관리할 수 있게 합니다.
2.
스레드 상태
•
스레드의 현재 상태(생성, 실행, 준비, 대기, 종료)를 나타냅니다. 이 상태 정보는 스케줄링 결정에 중요한 역할을 합니다.
3.
프로그램 카운터
•
스레드가 다음에 실행할 명령어의 메모리 주소를 가리킵니다. 이는 스레드가 현재 어떤 작업을 수행 중인지를 나타냅니다.
4.
레지스터 세트
•
CPU 레지스터의 현재 값을 저장합니다. 스레드가 중단되었다가 다시 실행될 때, 이 값을 통해 실행 상태를 복원합니다.
5.
스택 포인터
•
스레드의 스택 메모리에 대한 포인터로, 함수 호출과 로컬 변수 등의 정보를 관리합니다.
6.
우선순위
•
스레드의 실행 우선순위를 나타내며, 스케줄러가 CPU 시간을 어떤 스레드에 할당할지 결정하는 데 사용됩니다.
TCB의 공유영역과 공유하지 않는 영역
스레드가 공유하는 영역
1.
코드 영역 : 프로세스의 실행 코드가 저장된 영역입니다. 함수, 조건문, 루프 등 프로그램의 명령어가 포함되며, 모든 스레드가 동일한 실행 코드를 공유합니다.
2.
데이터, BSS 영역 : 전역 변수, 정적 변수 등 프로그램의 전역 데이터를 저장하는 영역입니다. 모든 스레드가 이 데이터에 접근하고 수정할 수 있으므로, 동시성 제어가 중요합니다.
3.
힙 영역 : 동적 메모리 할당이 일어나는 영역입니다. 예를 들어, C#에서 new 키워드를 사용하여 생성한 객체들이 이 영역에 저장됩니다. 힙은 프로세스 내의 모든 스레드에 의해 공유되므로, 여러 스레드가 동시에 동적 할당된 데이터에 접근할 때 동기화 문제가 발생할 수 있습니다.
스레드가 공유하지 않는 영역
1.
스택 영역 : 함수 호출 시 전달되는 매개변수, 반환 주소, 지역 변수 등이 저장되는 영역입니다. 각 스레드는 자신만의 스택을 가지며, 이를 통해 독립적인 함수 호출과 실행이 가능합니다.
2.
CPU 레지스터 세트 : 프로그램 카운터, 스택 포인터 등 현재 스레드의 실행 상태를 나타내는 레지스터 값들입니다. 컨텍스트 스위칭 시, 이러한 레지스터 세트는 스레드의 TCB에 저장되어 다음 실행 때 복원됩니다.
3.
스레드 로컬 스토리지 : 각 스레드가 별도로 가지는 저장 공간으로, 다른 스레드와 공유되지 않습니다. TLS는 스레드별로 고유한 데이터를 저장하는 데 사용되며, 예를 들어, 스레드별로 다른 사용자 세션 정보를 관리할 때 유용합니다.
a.
C#에서는 ThreadLocal<T> 클래스를 사용하여 TLS를 구현할 수 있습니다. ThreadLocal<T>는 제네릭을 지원하여, 저장하려는 데이터 타입에 따라 TLS 변수를 선언할 수 있습니다.
i.
예시
using System;
using System.Threading;
class Program
{
// 각 스레드별로 독립적인 카운터를 생성합니다. 초기 값은 0입니다.
private static ThreadLocal<int> _threadLocalCounter = new ThreadLocal<int>(() => 0);
public static void Main()
{
// 스레드를 4개 생성하고 실행합니다.
for (int i = 0; i < 4; i++)
{
var t = new Thread(() =>
{
// 각 스레드는 카운터를 10번 증가시킵니다.
for (int j = 0; j < 10; j++)
{
_threadLocalCounter .Value++;
Console.WriteLine($"스레드 ID: {Thread.CurrentThread.ManagedThreadId}, 카운터: {threadLocalCounter.Value}");
}
});
t.Start();
}
}
}
C#
복사
TCB와 PCB의 차이점
TCB와 PCB의 차이점
•
관리 대상 : TCB는 스레드를, PCB는 프로세스를 각각 관리합니다. 프로세스는 메모리 공간과 자원을 독립적으로 할당받는 반면, 스레드는 프로세스 내에서 코드, 데이터, 자원을 공유합니다.
•
정보의 범위 : PCB는 프로세스의 전반적인 정보를 포함하여 자원 할당, 메모리 관리 정보 등을 관리하는 반면, TCB는 스레드별 실행 상태, 스택, CPU 레지스터 등 스레드 실행에 직접적으로 관련된 정보에 더 중점을 둡니다.
•
사용 목적 : PCB는 프로세스의 생명주기와 자원 관리에 중점을 두는 반면, TCB는 스레드의 실행 제어와 멀티스레딩 환경에서의 스케줄링에 더 초점을 맞춥니다.
•
컨텍스트 스위칭 : PCB와 TCB 모두 컨텍스트 스위칭에 필수적입니다만, PCB는 프로세스 간, TCB는 스레드 간의 컨텍스트 스위칭을 관리합니다. 스레드 간 컨텍스트 스위칭은 일반적으로 프로세스 간 전환보다 오버헤드가 적습니다.