강의 메모 - ThreadLocal - 1,2 #
Critical Section (임계영역, 공유변수영역) #
- Critical Section 이란 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치) 에 접근하는 코드 영역를 말한다.
- 임계영역은 entry section, critical section, exit section, remainder section 으로 구성 된다
- 입장영역(entry section) : critical section 에 진입하기 위해 진입허가를 요청하는 영역입니다.
- 임계영역(critical section) : 하나의 스레드만 접근할 수 있는 영역이다
- 퇴장영역(exit section) : critical section 에서 빠져나올 때 신호를 알리는 영역이다
- 나머지영역(remainder section) : entry section, critical section, exit section 을 제외한 나머지 영역이다
- lock을 획득해야만, 임계영역에 진입 가능하다.
Critical Section Problem #
- 한 스레드가 critical section을 실행하고 있을 때 다른 스레드가 같은 critical section 을 사용함으로서 발생하는 문제이다
- 이 문제의 해결책을 위해서는 3가지 충족 조건이 요구된다.
-
Mutual Exclusion (상호 배제)
- 어떤 스레드가 critical section을 실행중이면 다른 스레드는 동일한 critical section 을 실행할 수 없다.
-
Progress (진행)
- 임계 구역에서 실행 중인 스레드가 없고 임계 구역에 진입하려는 스레드가 있을 때 어떤 스레드가 들어갈 것인지 적절히 선택해 줘야 하며 이러한 결정은 무한정 미뤄져선 안된다
-
Bounded Waiting (한정 대기)
- 다른 스레드가 임계 영역에 들어가도록 요청한 후 해당 요청이 수락되기 전에 기존 스레드가 임계 영역에서 실행할 수 있는 횟수에 제한이 있어야 한다
- thread1이 임계영역을 수행중이고, thread2번이 요청을 해서 thread1이 끝날때까지 대기한다. thread2는 대기중이기 때문에 thread1이 또다시 실행한다거나 하면 계속 대기하게될 수 있기 때문에 횟수 제한을 둔다는 뜻이다. (무한정 실행을 막는것)
- Starvation(기아상태) 이 발생하지 않도록 한다
- 다른 스레드가 임계 영역에 들어가도록 요청한 후 해당 요청이 수락되기 전에 기존 스레드가 임계 영역에서 실행할 수 있는 횟수에 제한이 있어야 한다
-
동기화 도구들 #
- 뮤텍스, 세마포어, 모니터, CAS(Compare and Swap) 와 같은 동기화 도구를 통해 Critical Section Problem 이 발생하지 않도록 할 수 있으며 자바에서는 synchronized 키워드를 포함한 여러 동기화 도구들을 제공하고 있다
Race Condition (경쟁상태, 경쟁조건, 경합상태) #
- 여러 스레드가 동시에 공유 자원에 액세스하고 조작할 때 스레드 간 액세스하는 순서나 시점에 따라 실행결과가 달라질 수 있는데 이것을 경쟁 상태라고 한다
- 경쟁상태는 Critical Section Problem 이 해결되지 않은 상태에서 여러 스레드가 동시에 임계영역에 접근해서 공유 데이터를 조작함으로써 발생하는 상태라 할 수 있다