본문으로 바로가기

[운영체제(OS)] 스레드

category Computer Science/OS 2021. 7. 9. 20:22

스레드

스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.

스레드의 특징

  • 하나의 프로세스에 여러 개의 스레드 생성 가능
  • 프로세스 안에 있기에 프로세스의 데이터를 모두 접근 가능.(스레드 간 접근 가능)
  • 하나의 프로세스 안에 각자의 stack을 가짐
  • 멀티 코어를 활용한 병렬처리(Multi Processing) 가능

▲ 프로세스와 스레드

 

스레드의 장점

  • 사용자에 대한 응답성 향상
  • 병렬 처리로 CPU 활용도를 높임
  • 자원 공유로 효율 향상(IPC 기법같은 번거로운 작업이 필요 없음)
  • 작업이 분리되어 코드가 간결함.(물론 설계하기 나름이지만)

스레드의 단점

  • 스레드 중 한 스레드만 문제가 있어도 전체 프로세스가 영향을 받음
  • 스레드를 많이 생성하면 ContextSwitching이 많이 일어나 성능 저하

스레드와 프로세스의 차이

  • 프로세스는 독립적, 스레드는 프로세스의 서브셋
  • 프로세스는 각각 독립적인 자원을 가짐. 스레드는 프로세스 자원을 공유
  • 프로세스는 자신만의 주소영역을 가짐, 스레드는 주소 영역 공유
  • 프로세스 간에는 IPC 기법으로 통신해야 함, 스레드는 필요 없음

스레드 동기화

여러 스레드가 동일 자원을 동시 접근 시 신뢰성을 보장할 수 없는 문제가 발생한다. 이 문제를 해결하기 위해 작업들 사이에 실행 시기를 조정하는 기법을 스레드 동기화라 한다.

Mutual exclusion (상호배제, Mutex)

여러 스레드가 변경하는 공유 변수에 대한 배타적 접근을 보장하는 기법이다. 임계 구역에는 하나의 스레드만 들어갈 수 있다.

lock.acquire()  # 임계 구역에 대한 권한 획득
for i in range(100000):
    g_count += 1  # 임계 데이터 접근
lock.release()  # 임계 구역에 대한 권한 회수

Semaphore (세마포어)

Mutex기법과 다르게 임계 구역에 여러 스레드가 들어갈 수 있다. 대신 counter를 두어 동시에 리소스에 접근 할 수 스레드 수를 제한한다.

  • S: 세마포어 값. 임계 영역에 접근 가능한 스레드의 수를 초기값으로 지정
  • P: 임계영역에 들어가기 위한 검사. S값이 1이면 진입 후 S값 1 차감.
  • V: 임계 영역에 나오기위한 처리. S값에 1을 더한 후 나옴.
P(S): wait(S) {
    while S <= 0 // 바쁜 대기
        ;
    S--; // 다른 프로세스 접근 제한
}
V(S): signal(S) {
    S++; // 다른 프로세스 접근 허용
}

P 함수에서 스레드는 임계영역에 들어가기 위해서 loop문을 계속 도는 바쁜 대기를 하고 있다. 이 부분은 운영체제 기술인 대기 큐를 활용하여 보완할 수 있다.

wait(S) {
    S->count--;
    if (S->count <= 0) {
        add this process to S->queue;
        block()
    }
}
signal(S) {
    S->count++;
    if (S->count > 0) {
        remove a process P from S->queue;
        wakeup(P)
    }
}

교착상태와 기아상태

  • 교착 상태: 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태. 여러 프로세스가 동일 자원 점유를 요청할 때 발생.
  • 기아 상태: 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때 발생.