Thread(스레드)

devjune·2021년 10월 27일

운영체제

목록 보기
9/10

쓰레드란

  • 프로세스 내에서 실행되는 흐름의 단위

특징

  1. 하나의 프로세스에 여러개의 스레드 생성 가능
  2. 스레드들은 동시에 실행 가능
  3. 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근할 수 있음.

쓰레드 작동 원리

스택과 힙 사이 영역에 쓰레드 전용 공간이 있다.
쓰레드마다 고유의 pc와 sp가 있어서 고유하게 동작할 수 있다.

다만, 프로세스와의 차이점은
프로세스는 프로세스간에 통신이 필요할 때는 IPC기법을 사용해야 했지만, 쓰레드는 쓰레드간에 직접 통신이 가능하다.

나머지 힙, 데이터, 코드 영역은 동일한 프로세스 영역이기 때문에 모두 공유한다.

쓰레드의 장단점

장점

  1. 사용자에 대한 응답성 향상
    • 하나의 서버에 여러 클라이언트의 요청이 있을 때 서버는 클라이언트 요청마다 쓰레드를 생성하여 각각 대응
  2. 자원 공유 효율
    • IPC같은 번거로운 작업이 필요없음.
    • 프로세스 내에 있기 때문에 프로세스 내 모든 자원 공유 가능.
  3. 작업이 분리되어 코드가 간결
    • 이부분은 개발자의 코드 작성 역량에 따라 갈림.

단점

  1. 하나의 쓰레드만 문제가 생겨도 전체 프로세스가 영향을 받음.

  2. 쓰레드를 많이 생성할 경우, Context Switching이 많이 일어나 성능이 저하.

    • 리눅스의 경우 쓰레드를 프로세스 같이 취급하여 모든 스레드를 스케쥴링 해야함.

쓰레드 동기화 문제

10만을 50번 더하니까 결과는 5천만이 나와야 하지만 훨씬 적은 숫자가 결과로 나왔다.
이유는 다음 그림과 같다.

계산된 값이 레지스터에 저장 되기 전에 컨텍스트 스위칭이 일어나고, 다시 돌아 왔을 때 이어서 작업을 진행하는데, 각각의 쓰레드에서 레지스터에 저장된 값은 1이기 때문에 쓰레드1과2는 g_count값에 1을 저장한다.

쓰레드별 작업 순서를 보장함으로 정상적인 동작이 가능.

세마포어

임계영역: 여러 쓰레드가 공유하고 있는 작업
임계자원: 임계영역에서 사용하는 변수

임계영역에 접근을 막기 위한 Locking 메커니즘

  1. Mutex : 임계구역에 하나의 쓰레드만 들어갈 수 있게 하는 기법
  2. Semaphore : 임계 구역에 여러 스레드가 들어갈 수 있게 하는 기법(counter를 두어 동시에 리소스에 접근할 수 잇는 허용 가능한 스레드 수를 제어)

세마포어 기법

  • P: 검사(임계영역에 들어갈 때)
    • S값이 1이상이면, 임계 영역 진입 후, S값 1 차감(S값이 0이면 대기)
  • V: 증가(임계영역에서 나올 때)
    • S값을 1더하고, 임계영역을 나옴.
  • S: 세마포어 값(초기값 만큼 여러 프로세스가 도시 임계 영역 접근 가능

대기 상황의 무한 루프를 보완하기 위해 대기큐 기술로 보완

S가 0보다 작거나 같을 경우 S를 queue에 넣고 대기 시킨다(block()).

작업이 완료되면 queue에 있는 S를 제거하고 활성화 시킨다(wakeup(P))

위 로직은 운영체제를 직접 수정하여 개선 시킨 방법이다.

교착상태(Deadlock), 기아상태(Starvation)

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

교착상태 해결 방법
1. 교착상태 예방
2. 교착상태 회피
3. 교착상태 발견
4. 교착상태 회복

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

해결방법
1. 우선순위 변경

  • 수시 변경
  • 대기시간이 긴 프로세스 우선순위 높이기
  • 요청 순서대로 처리(큐FIFO)
profile
개발자준

0개의 댓글