[컴퓨터공학] 스레드의 이해

2 minute read

스레드의 이해

패스트캠퍼스 강의 보면서 정리하고 있습니다

Thread

  • Light Weight Process

  • 프로세스
    • 프로세스 간 데이터 접근 불가
  • 스레드
    • 하나의 프로세스에 여러개의 스레드 생성 가능
    • 스레드들은 동시에 실행 가능
    • 프로세스 안에 있으므로 프로세스의 데이터를 모두 접근 가능

Thread 장점

  • 사용자에 대한 응답성 향상
  • 자원 공유 효율 : 프로세스 데이터를 모두 접근 가능
  • 작업이 분리되어 코드가 간결

Thread 단점

  • 한 스레드만 문제가 있어더 전체 프로세스에 영향을 받음
  • 스레드를 많이 생성하면 Context Switching이 만힝 일어나 성능 저하
    • 리눅스 OS는 Thread를 Process 처럼 다룸
    • 스레드를 많이 생성하면 모든 스레드를 스케줄링해야 하므로 Context Switching이 빈번할 수 밖에 없음

Thread vs Process

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

동기화(Synchronization) 이슈

  • 동기화 : 작업들 사이에 실행 시기를 맞추는 것
  • 여러 스레드가 동일한 자원(데이터) 접근시 동기화 이슈 발생

동기화 이슈 해결 방안

  • Mutual Exclusion (상호 배제)
    • 임계 자원(critical resource)
    • 임계 영역(critical section)
  • 스레드는 프로세스 모든 데이터를 접근 할 수 있음
    • 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access 필요
    • 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시 접근하지 못하도록 막음

Mutex와 세마포어(Semaphore)

  • 임계 구역에 대한 접근을 막기 위해 Locking 메커니즘 필요
    • Mutex(Binary Semaphore)
      • 임계 구역에 하나의 스레드만 들어갈 수 있음
    • Semaphore
      • 임계 구역에 여러 스레드 들어갈 수 있음
      • Counter를 두어 동시에 리소스에 접근 할 수 있는 허용 가능한 스레드 수를 제어

세마포어(Semaphore)

  • P:검사 (임계 영역에 들어갈 때)
    • S값이 1이상이면 임계 영역 진입 후 S값 1 차람 (S값이 0이면 대기)
  • V:증가 (임계 영역에서 나올 때)
    • S값을 1더하고 임계 영역을 나옴
  • S:세마포어 값 (초기 값만큼 여러 프로세스가 동시 임계 영역 접근 가능)
P(S): wait(S) {
  while S <= 0 //대기 (접근 가능하지 않으면 loop)
  ;
  S--; // 다른 프로세스 접근 제한
}
V(S): signal(S) {
  S++; //다른 프로세스 접근 허용
}
  • 세마포어 - 바쁜 대기
    • wait()는 S가 0이라면 임계 영역에 들어가기 위해 반복문 수행
    • CPU 성능 저하
  • 세마포어 - 대기 큐
    • 운영체제 기술로 보완
      • S가 음수일 경우, 바쁜 대기 대신 대기 큐에 넣는다
        wait(S) {
        S->count--;
        if(S->count <= 0){
        add this process to S->queue;
        block()
        }
        }
        
      • wakeup()함수를 통해 대기 큐에 있는 프로세스 재실행
        signal(S){
        s->Count++;
        if(S->Count >=1){
        remove a process P from S->queue;
        wakeup(P)
        }
        }
        

주요 세마포어 함수 (POSIX 세마포어)

  • sem_open() : 세마포어 생성
  • sem_wait() : 임계 영역 접근 전 세마포어를 잠그고 세마포어가 잠겨 있다면 풀릴 때까지 대기
  • sem_post() : 공유자원에 대한 접근이 끝났을 때 세마포어 잠금을 해제

교착상태(Deadlock)

  • 무한 대기 상태
    • 두 개 이상의 작업이 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 다음 단계로 진행하지 못하는 상태
    • 배치 처리 시스템에서는 일어나지 않는 문제
    • 프로세스, 스레드 둘 다 이와 같은 상태가 일어날 수 있음
  • 교착상태 발생 조건
    1. 상호배제(Mutual exclusion) : 프로세스들이 필요로하는 자원에대해 배타적인 통제권 요구
    2. 점유대기(Hold and wait) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다림
    3. 비전섬(No preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없음
    4. 순환대기(Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있음

기아상태(Starvation)

  • 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태

  • 기아상태 해결 방안

    • 프로세스 우선순위를 수시로 변경
    • 오래 기다린 프로세스의 우선순위를 높이기
    • 우선순위가 아닌 요청 순서대로 처리하는 FIFO 기반 요청 큐 사용

교착상태와 기아상태

  • 교착상태는 여러 프로세스가 동일 자원 점유를 요청할 때 발생
  • 기아상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때 특정 프로세스는 영원히 자원할당이 안되는 경우를 주로 의미