스레드

2020. 9. 7. 02:45OS

스레드는 CPU 이용의 기본 단위이다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 자원을 공유한다. 

 

다중 스레드의 경우 코드, 데이터, 파일들을 공유한다. 프로세스가 다중 스레드를 가지고 있다면 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다. 

 

웹서버는 일반적으로 다수의 클라이언트로 부터 접속을 받는다. 하지만 싱글스레드이면 클라이언트를 순서대로 처리하게 되면 속도에 문제가 발생할 것이다. 

그래서 서버는 클라이언트에서 요청이 올때마다 새로운 스레드를 생성해 작업을 처리해준다. 

 

스레드 장점

1. 응답성

 

하나의 응용프로그램이 길게 실행되고 있는걸 하나의 스레드로 실행시키고 다른 스레드를 활용해서 해당 응용프로그램을 계속 실행시킬 수 있다. 

 

2. 자원 공유 

 

프로세스는 ipc(공유 메모리, 메시지 전달 기법)방법을 사용해서 프로세스간에 자원을 공유할 수 있다. 그러나 스레드의 경우 자기가 속한 프로세스의 자원들과 메모리를 공유한다.

 

3. 경제성

 

프로세스 생성을 위해 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에 스레드를 생성하고 문맥 교환하는 것이 보다 더 경제적이다. 

 

다중코어 프로그래밍

최근의 유사한 경향은 하나의 칩 안에 여러 계산 코어를 넣는 것이다. 각 코어는 운영체제에게는 독립된 처리기로 보인다. 

그래서 효율적으로 각 코어에 한개의 스레드를 할당해 병렬적으로 실행시킬 수 있다. 

 

병렬 실행

하나 이상의 태스크를 동시에 수행할 수 있는 시스템에 대해 병렬적이라고 말한다. 

병렬 실행의 종류

1. 데이터 병렬 실행
  동일한 데이터의 부분집합을 다수의 계산 코어에 분배한 뒤 각 코어에서 동일한 연산을 실행하는데 초점을 맞춘다. 
ex) 1 ~ 100까지 숫자의 합을 더하는데 코어 1에는 1 ~ 50까지의 합을 할당 코어 2에는 50 ~ 100까지의 합을 구하는 연산을 할당하는 것이다. 

2. 태스크 병렬 실행
  태스크(스레드)를 다수의 코어에 분배해서 고유의 연산을 실행시킨다. 

 

병행 실행

 

병행실행은 모든 태스크가 진행하게끔 함으로써 하나 이상의 태스크를 지원한다. 즉 빠르게 교체되어 실행되는 방법이다. 

 

다중 스레드 모델

다대일 모델

다대일 스레드

많은 사용자 스레드를 하나의 커널 스레드로 사상한다. 스레드 관리는 사용자 공간의 스레드 라이브러리에 의해 행해진다. 

단점이 있다. 한 스레드가 봉쇄형 시스템 콜(call이 완전히 실행될 때 까지 반환되지 않는 것을 의미함)을 할 경우 전체 프로세스가 봉쇄된다. 또 한 번에 하나의 스레드만이 커널에 접근할 수 있기 때문에 다중 스레드가 다중 코어에 병렬적으로 실행될 수 없다.

 

일대일 모델

일대일 모델

사용자 스레드를 각각 항나의 커널 스레드로 사상한다. 이 모델은 사용자 스레드가 봉쇄현 시스템 콜을 호출하더라도 다른 스레드가 실행될 수 있기 때문에 다대일 모델보다 더 많은 병렬성을 제공한다. 그래서 다중처리기에서 다중 스레드가 병렬적으로 처리하는 것을 허용한다. 

 

단 하나의 단점은 사용자 스레드르 만들 때마다 커널 스레드를 만들어야 하기 때문이다. 

 

 

다대다 모델

다대다 모델

여러 개의 사용자 수준 스레드를 그보다 작은 수 혹은 같은 수의 커널 스레드로 멀티플렉스한다. 커널 스레드의 수는 응용 프로그램이나 특정 기계에 따라 결정된다. 

 

즉 요약하면 

 

다대일 모델은 사용자 마음대로 스레드를 만들 수 있지만 한번에 하나의 커널 스레드가 생성되기 때문에 진정한 병렬성을 가질 수 없다. 

 

일대일 모델은 병렬을 실행할 수 있지만 너무 많은 사용자 스레드를 생성하면 안된다. 

 

일대다 문제는 위 두개의 문제를 어느 정도 해결했다. 시스템 콜이 발생해도 다른 커널 스레드를 사용할 수 있다. 또한 필요한 만큼의 사용자 수준 스레들 생성할 수 있다. 

 

스레드 라이브러리

스레드 라이브러리는 프로그래머에게 스레드를 생성하고 관리하기 위한 API를 제공한다. 스레드 라이브러리를 구현하는 데에는 주된 두가지 방법이 있다.

 

첫 번째 방법은 커널의 지원 없이 완전히 사용자 공간에서만 라이브러리를 제공하는 것이다. 

  코드와 자료 구조는 사용자 공간에 존재한다. 라이브러리를 모든 코드와 자료구조는 사용자 공간에 존재한다. 라이브러리의 함수를 호출하는 것은 시스템 호출이 아니라 사용자 공간의 지역 함수를 호출하게 된다는 것을 의미한다. 

 

두번재 방법은 운영체제에 의해 지원되는 커널 수준 라이브러리르 구현하는 것이다. 

   라이브러리를 위한 코드와 자료구조는 커널 공간에 존재한다. 라이브러리 API를 호출하는 것은 커널 시스템 호출을 부르는 결과를 낳는다. 

 

ex) 자바 스레드, pthreads

 

암묵적 스레딩

스레드의 생성과 관리 책임을 응용 개발자로부터 컴파일러와 실행시간 라이브러리에게 넘겨주는 것이다.(사용자 x 자동화 o) 이를 암묵적 스레딩이라고 부른다.

 

스레드 풀

이전에 서버 클라이언트 모델의 경우 요청이 올때 마다 스레드를 생성해주었다. 좋은 방법이긴 하지만 여러 문제를 갖고 있다. 

 

1. 서비스를 할때 마다 스레드를 생성하는 시간이 걸린다. 

 

2. 사용 후 바로 버려질 거라서 계산량에 있어서 아쉽다. 

 

따라서 이와 같은 방법을 해결한 것이 스레드 풀이다. 

 

프로세스를 시작할 때 일정한 수의 스레드들을 미리 풀로 만들어 놓고 요청이 올 때마다 대여해준다. 대여 종료 후 풀로 돌아가 다시 대기한다.

'OS' 카테고리의 다른 글

프로세스 동기화  (0) 2020.09.11
CPU 스케줄링  (0) 2020.09.09
컴퓨터 OS 프로세스  (0) 2020.09.05
Thread Context Switching vs Process Context Switching  (1) 2020.05.05
Thread, process  (0) 2020.05.04