여러 스레드가 한정적인 시스템자원에 동시에 접근할 경우 문제가 발생하게 됩니다. 이 문제를 방지하기 위해 여러 스레드에게 하나의 자원에 대한 처리권한을 주거나 순서를 조정하는 기법을 동기화라 일컫습니다.
스레드 동기화
- 실행순서의 동기화 : 스레드의 실행 순서를 정의하고, 이 순서를 반드시 따르도록 하는 방법입니다.
- 메모리 접근에 대한 동기화 : 메모리 접근에 있어서 동시 접근을 막는 방법으로 실행의 순서와 상관없이 한 순간에 하나의 스레드만 해당 자원에 접근토록 하는 것입니다.
동기화 기법
- 유저모드의 동기화
- 커널의 힘을 빌리지 않는 동기화 방법입니다.
- 성능상 이점은 있으나 기능상의 제한점이 존재합니다.
- 임계구역 기반의 동기화, 인터락 함수 기반의 동기화를 말합니다.
- 커널모드의 동기화
- 커널에서 제공하는 동기화 기능을 이용하는 방법입니다.
- 커널모드로의 변경이 필요해 성능저가로 이어집니다.
- 세마포어, 뮤텍스, 모니터 등의 다양한 시스템기능을 활용할 수 있습니다.
조금 더 자세히 알아보죠
유저모드의 동기화
- 임계구역 기반의 동기화
- 크리티컬 섹션에 들어가기 위해선 열쇠를 얻은 프로세스만 해당됩니다.
- 임계구역 진입을 위해선 크리티컬 섹션 오브젝트를 갖고 있어야 하죠.
- 다른 스레드가 열쇠를 가지고 있을 경우에는 반환될 때 까지 블로킹됩니다. 열쇠가 반환되면 블로킹 상태에서 빠져나와 열쇠를 얻고 임계구역에 접근합니다.
- 인터락 함수 기반의 동기화
- 함수 내부적으로 한순간에 하나의 스레드에 의해서만 실행되도록 동기화됩니다.
- 임계구역 기반의 동기화도 사실 내부적으로는 인터락 함수를 기반으로 구현됩니다.
- 유저모드 기반으로 동작해 속도가 빠릅니다.
커널모드에서의 동기화
- 세마포어
- 공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는 기법입니다.
- 동시 접근할 수 있는 허용 가능한 갯수를 관리하는 카운터입니다.
- 세마포어는 Counter의 갯수에따라 바이너리세마포어, 카운팅 세마포어로 나뉩니다. 바이너리 세마포어는 사실상 뮤텍스와 같죠.
- 뮤텍스
- 임계구역을 가진 스레드들의 러닝타임이 겹치지않도록 단독으로 실행되게 하는 기술입니다.
- 뮤텍스 객체는 두 스레드가 동시사용할 수 없습니다.
- Locking매커니즘을통해 공유자원에 대한 접근을 조율합니다.
- 뮤텍스는 무조건 1개의 열쇠만 있습니다. 바이너리 세마포어와 같죠
- 모니터
- 뮤텍스와 컨디션변수를 가지고있는 동기화 매커니즘입니다.
- 사실 잘 모르겠네여
임계영역이란?
![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/339ce02c-fb13-47b3-8829-a6d1ea9e7889/Untitled.png)
임계영역은 둘 이상 스레드가 동시접근해서는 안되는, 공유자원을 접근하는 코드의 일부를 뜻합니다. 동기화를 하지 못하면 데드락에 빠질 수도 있죠.
→ 임계영역 문제를 해결하기 위해서는 3가지 필수조건이 있습니다.
- 상호배제 : 한순간에 하나의 스레드만 접근
- 진행 : 임계구역에서 실행중인 프로세스가 없고 별도 동작이 없는 프로세스들은 임계구역 진입후보가 된다.
- 한정대기 (Bounded Waiting) : 특정 프로세스가 임계구역에 진입신청하고, 받아들여질 때 까지 다른 프로세스들이 임계구역에 진입하는 횟수는 제한이 있어야 합니다.
뮤텍스와 세마포어의 차이