Search

TCB

class
운영체제
상태
완료
날짜
목차

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는 스레드 간의 컨텍스트 스위칭을 관리합니다. 스레드 간 컨텍스트 스위칭은 일반적으로 프로세스 간 전환보다 오버헤드가 적습니다.