본문 바로가기
Computer Science/Operating System

Thread와 Thread API

by JuHy_ 2019. 9. 4.

Thread의 개념과 특징

Thread는 하나의 프로세스에서 동시에 여러 작업을 수행해야 할 때 사용한다.

특히 I/O 작업과 같이 대기하는 시간이 긴 작업을 할 때 Thread를 이용하여 다른 작업을 수행하는 것이 효율적이다.

 

서로 다른 프로세스는 주소공간을 공유하지 않지만 Thread의 경우는 모두 같은 주소공간을 사용한다.

이렇게 주소공간을 공유할 경우 동시에 같은 자원에 접근할 때 문제가 생길 수 있다.

 

Concurrency Problem

두 개의 Thread가 각각 하나의 counter 변수를 증가시키는 상황에서 어떤 문제가 발생하는 지 알아보자.

 

각각의 Thread의 코드는 다음과 같다.

① counter 변수를 받아온다.

② 받아온 변수를 1 증가시킨다.

③ 증가시킨 변수를 counter 변수에 저장한다.

 

그러면 이제 이런 Thread 2개를 실행시켜보자.

 

1. Thread 1의 ①, ② 실행

- counter 변수 50을 받아와 51로 증가시킨다

- 변수를 받아와서 증가시켰지만 아직 저장하지 않은 상황이다.

 

2. Timer Interrupt 발생으로 인해 Thread 1 중지

 

3. Thread 2의 ①, ②, ③ 실행

- counter 변수 50을 받아와 51로 증가시킨 후 저장한다.

 

4. Thread 1의 ③ 실행

- 증가시켰던 변수 51을 counter 변수에 저장한다.

 

정상적으로 실행되었다면 counter 변수가 2 증가되어야 하지만 1 밖에 증가하지 않은 것을 볼 수 있다.

이는 여러 개의 Thread가 동시에 공유 자원에 접근중에 interrupt로 인해 실행 순서가 바뀌었기 때문에 발생한 것이다.

 

이처럼 코드의 실행 순서에 따라 결과가 달라지는 상황을 race condition이라고 한다.

그리고 이렇게 둘 이상의 Thread에서 동시에 실행되어서는 안되는 부분을 critical section이라고 한다.

앞에서 예로 들었던 공유 자원에 접근하는 코드가 대표적인 critical section이다.

 

Thread API

그렇다면 Thread를 관리하기 위한 코드는 어떤 것이 있는지 알아보기 위해 pthread의 API를 살펴보자.

 

1. Create

Thread를 생성할 때에는 pthread_create 함수를 통해 가능하다.

create 함수에는 4개의 파라미터를 넣어주어야 한다.

 

첫번째는 생성한 Thread를 저장할 변수,

두번째는 Thread의 속성,

세번째는 Thread가 실행할 함수,

네번째는 Thread가 실행할 함수에 넘겨줄 파라미터 변수를 넣어주면 된다.

 

2. Join

Join은 Thread가 완료되기를 기다려야 할 때 사용하는 함수이다.

pthread_join 함수에는 기다릴 Thread 변수와, Thread가 실행한 함수로부터의 반환값을 저장할 변수를 넣어주면 된다.

 

3. Lock

Lock은 앞에서 설명한 critical section을 보호하기 위한 함수이다.

하나의 Thread가 lock을 갖고있다면 다른 Thread는 접근하지 못한다.

이로서 여러 개의 Thread가 critical section에 접근하는 것을 막을 수 있다.

 

4. Condition Variable

Condition Variable은 Thread끼리의 신호전달을 위한 함수이다.

wait는 다른 Thread의 signal을 기다리는 함수이고, signal은 다른 Thread에게 신호를 보내는 함수이다.

 

Lock과 Condition Variable은 중요하기 때문에 별도의 게시글로 자세하게 설명하겠다.

'Computer Science > Operating System' 카테고리의 다른 글

Condition Variable이란?  (1) 2019.09.05
Lock의 개념과 구현 방법  (4) 2019.09.05
Page Swapping이란?  (0) 2019.09.02
Advanced Page Table  (0) 2019.04.23
Translation Lookaside Buffers - TLB란?  (0) 2019.04.23