스레드는 메모리의 구조 중 스택 영역을 제외한 코드/데이터/힙 영역을 공유한다.
이 때 여러 스레드가 동시에 같은 자원에 접근하는 것을 막기 위해 동기화 기법을 취해야 한다.
스레드의 동기화 기법
- 실행 순서의 동기화
- 스레드의 실행 순서 정의, 이 순서에 반드시 따르도록 하는 것
- 한 순간에 하나의 스레드만 접근
- 메모리 접근에 대한 동기화
- 메모리 접근에 있어서 동시 접근 막는 것
- 실행 순서가 중요한 상황이 아닌 경우, 한 순간에 하나의 스레드에만 접근하면 되는 상황
동기화 기법의 두 가지 구분
- 유저 모드 동기화
- 커널의 힘을 빌리지 않는(커널 코드가 실행되지 않는) 동기화 기법
- 성능상의 이점, 기능상의 제한(라이브러리를 이용)
- 종류
- 크리티컬 섹션 기반 동기화
- 메모리 접근 동기화에 사용. 임계영역 객체(Key)를 만들고 초기화해야 함(반드시 거쳐야 하는 과정) - 인터락 함수 기반 동기화
- 메모리 접근 동기화에 사용. 함수 내부적으로 한 순간에 하나의 스레드에 의해서만 실행되도록 동기화. 전역으로 선언된 변수 하나의 접근 방식을 동기화하는 것이 목적일 경우 사용
- 크리티컬 섹션 기반 동기화
- 커널 모드 동기화
- 커널에서 제공하는 동기화 기능을 활용하는 방법
- 커널 모드로의 변경이 필요하므로 성능 저하, 다양한 기능 활용 가능
- 기능상 우수, 속도 떨어짐
- 각 프로세스들 안의 스레드들끼리의 동기화도 가능
- 종류
- 뮤텍스 기반의 동기화
- 메모리 접근 동기화에 사용. 키의 취득과 반납이 이루어짐 - 세마포어 기반의 동기화
- 메모리 접근 동기화에 사용. 카운트를 셈 - 이름 있는 뮤텍스 기반의 동기화
- 프로세스간 동기화에 사용. 프로세스 동기화를 하기 위해서 뮤텍스를 동기화해야 하는데 커널 오브젝트는 각각 프로세스에 독립적이므로 뮤텍스에 이름 붙여서 접근 - 이벤트 기반의 동기화
- 실행순서 동기화에 사용
- 뮤텍스 기반의 동기화
마지막으로 중요한 용어니까 한 번 더 상기하고 가자.
임계영역(Critical Section)
- 공유 자원으로, 문제 원인이 될 수 있는 코드 블록
- 배타적 접근(한 순간에 하나의 스레드만 접근)이 요구되는 리소스에 접근하는 코드 블록
'Operating System' 카테고리의 다른 글
[OS] 캐시 메모리(Cache Memory)란? 캐시의 지역성(Locality)이란? (0) | 2021.03.10 |
---|---|
[OS] 단편화(Fragmentation)란? 내부 단편화와 외부 단편화란? (0) | 2021.03.10 |
[OS] 뮤텍스(Mutex)와 세마포어(Semaphore)란? (1) | 2021.03.10 |