스레드 (Thread)

tycode·2021년 4월 20일
0

C.S (Computer Science)

목록 보기
7/40
post-custom-banner

스레드 (Thread)

  • Light Weigth Process라고도 함
  • 프로세스
    • 프로세스 간에는 각 프로세스의 데이터 접근이 불가 (IPC사용 해야한다)
  • 스레드
    • 하나의 프로세스에 여러개의 스레드 생성 가능
    • 스레드들은 동시에 실행 가능
    • 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능 (IPC 사용 안해도된다)
    • 하나의 프로세스에 생성된 스레드끼리 그 해당 프로세스의 영역을 공유한다.

멀티 스레드 (Multi Thread)

  • 소프트웨어 병행 작업 처리를 위해 Multi Thread를 사용함

하나의 부모 프로세스 안에 쓰레드A 와 B가 생성되었을 경우
Code, Data, Heap 영역은 공유하고 있고 해당 쓰레드를 위한 Stack영역만 별도로 갖고 있다.

멀티 프로세싱과 Thread

  • Thread를 여러개 만들면 여러 CPU에 실행 시킬 수 있다

Thread 장점

1. 사용자에 대한 응답성 향상

여러개의 클라이언트들에게 웹페이지 요청을 받았을 때 바로 응답하기 위해, 또는 새로운 클라이언트가 오면 그 클라이언트를 위해 별도의 프로세스/스레드를 만들어서 처리하여 빠르게 웹페이지 보여준다.

2. 자원 공유 효율

  • IPC 기법과 같이 프로세스간 자원 공유를 위해 번거로운 작업이 필요 없음
  • 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능

한 쓰레드를 만들면 4GB공간 한곳에 6개의 프로세스로 실행한 24GB 자원들을 공유함으로써 추가적인 공간은 필요 없다. 즉, 자원효율이 생긴다.

3. 코드가 간결

  • 작업이 분리되는 것처럼 보여서 코드가 간결해 보인다.
    (사실 작성하기 나름이다)

Thread 단점

  • 스레드 중 한 스레드만 문제가 있어도, 전체 프로세스가 영향을 받음

  • 스레드를 많이 생성하면, Context Switching이 많이 일어나, 성능 저하됨
  • 예: 리눅스 OS에서는 thread를 process와 같이 다룸
    • 스레드를 많이 생성하면, 모든 스레드를 스케쥴링해야 함으로, context switching이 빈번함.

Thread vs Process

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

PThread

  • 스레드는 무엇으로 코드를 만드느냐?
  • POSIX 스레드 (POSIX Threads, 약어: PThread)
    • Thread 관련 표준 API

중간정리

  • Thread개념 정리
    • 프로세스와 달리 스레드간 자원 공유
  • 스레드 장점
    • CPU 활용도를 높임
    • 성능 개선 가능
    • 응답성 향상
    • 자우너 공유 효율 (IPC를 안써도 됨)
  • 스레드 단점
    • 하나의 스레드 문제가, 프로세스 전반에 영향 미침
    • 여러 스레드 생성시 성능 저하 가능

동기화 (Synchronization) 이슈

  • 동기화: 작업들 사이에 실행 시기를 맞추는 것
  • 스레드들은 실행순서가 정해져 있지 않기 때문에 (스케쥴러에 의해서만 결정) 데이터를 공유하는 과정에서 비정상 동작(동기화 이슈)이 생길 수 있다. 즉, 동일 자원을 여러 스레드가 동시 수정시, 각 스레드 결과에 영향을 준다.
  • 그래서 스레드 관리가 필요로 하다.

동기화 이슈 해결 방안

  • Mutual exclusion(상호 배제):
    동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용
  • 스레드는 프로세스 모든 데이터를 접근할 수 있으므로,
    • 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access필요
    • 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시 접근하지 못하도록 막는다

👉 예로, lock.acquire() - lock.release()를 통해 한 스레드가 열쇠를 받고 반납하는(코드를 실행 중) 동안에는 다른 스레드는 코드를 진행하지 않고 기다리게 된다.

Mutex와 세마포어 (Semaphore)

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

세마포어 (Semaphore)

  • P: 검사 (임계영역에 들어갈 때 - lock.acquire)
    • S값이 1이상이면, 임계 영역 진입 후, S값이 1차감(S값이 0이면 대기)
  • V: 증가 (임계영역에서 나올 때 lock.release)
    • S값이 1더하고, 임계 영역을 나옴
  • S: 세마포어 값 (동시에 임계 영역 접근할 수 있는 스레드 수)

의사 코드/슈도 코드(pseudo code):
프로그램을 작성할 때 각 모듈이 작동하는 논리를 표현하기 위한 언어이다. 특정 프로그래밍 언어의 문법에 따라 쓰인 것이 아니라, 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드를 말한다.

  • wait()은 S가 0이라면, 임계영역에 들어가기 위해, 반복문 수행

프로그래밍은 근본적으로는 중단이 없다. 끊임없이 코드를 실행한다.

  • 중단은 대부분 loop로 표현하고
  • loop는 CPU에 부하를 걸리게 함

대기큐

운영체제 기술로 보완할 수 있다.

  • S가 음수일 경우, 바쁜 대기 대신, 대기큐에 넣는다.
    • 스케쥴러 상에서 ready상태로 빼놓던가 특별한 queue를 만들어서 빼서 loop를 없앤다. (block() 또는 sleep()으로)

이 함수를 깨우기 위해선,

  • wakeup() 함수를 통해 대기큐에 있는 프로세스 재실행

참고: 주요 세마포어 함수 (POSIX 세마포어)

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

교착상태(Deadlock)

: 여러 프로세스가 동일 자원 점유를 요청할 때 발생

  • 무한 대기 상태: 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 (waiting상태), 다음 단계로 진행하지 못하는 상태

참고: 교착상태 발생 조건

  • 다음 네 가지 조건이 모두 성립될 떄, 교착상태 발생 가능성이 있음
  1. 상호배제(Mutual exclusion): 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
  2. 점유대기(Hold and wait): 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
  3. 비선점(No preemption): 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
  4. 순환대기(Circular wait): 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.

기아상태(Starvation)

: 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원 할당이 안되는 경우를 주로 의미함

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

0개의 댓글