스레드 동기화 방법
User Mode Synchronization[유저모드 동기화]
동기화를 하는 과정에서 커널의 자원을 이용하지 않고 수행 --> 커널모드로 전환이 이루어 지지 않기 때문에, 성능상의 이점
Kernel Mode Synchronization[커널모드 동기화]
동기화가 진행되는 과정에서 커널의 자원을 이용 --> 커널모드로 전환이 이루어 지기 때문에, 성능상의 저하가 발생
유저 모드에서 제공하지 못하는 기능 제공
임계영역이란?
두개 이상의 스레드가 동시에 접근해서는 안되는 공유 자원 영역
두개의 스레드가 동시에 임계영역에 접근할 경우 문제가 발생할 수 있음
EX)
하나의 변수에 10이라는 값이 저장
A 스레드는 하나의 변수에 값을 더하기 하는 역할
B 스레드는 하나의 변수에 값을 빼기 하는 역할
만약에 두개 동시에 접근하게 된다면?
이러한 것을 제한 하는방법이 스레드 동기화 기법
스레드 동기화 기법
1. Critical Section Synchronization [User Mode] : 코드 영역 자체를 보호 할 때 사용
2. Interlock Synchronization [User Mode] : 전역으로 선언된 변수 하나의 접근에 동기화 하는 경우
3. Mutex Synchronization [Kernel Mode] : 커널 오브젝트인 Mutex를 이용한 동기화 기법으로
Signal, Non-Signal 상태를 이용한 방법이다.
4. Semaphore Synchronization [Kernel Mode] : Mutex의 기법에 여러개의 쓰레드가 접근할 수 있는 Counting을 할 수있는 것이다.
Signal : Thread가 Mutex의 열쇠를 가져갈 수 있는 상태, 즉 임계영역에 접근 할수 있는 상태
Non-Signal : 다른 Thread에 의해서 이미 Mutex의 열쇠가 점유 되어 있는 상태, 즉 임계영역에 접근 할수 없는 상태
3. Semaphore Synchronization [Kernel Mode]
세마포어 역시 커널 객체를 이용한 동기화 방법이다.
지정된 쓰레드 갯수 만큼 동시에 자원에 접근 할 수있도록 하는 것이다.
멀트 쓰레드 프로그래밍을 할 때 쓰레드를 무제한 생성 같은 경우에 제한 할 수 있을 거같다.
------------------------------------------------------------------------------------------------------------------------------------------------------------------
**Atomic Operation
아톰 하면 원자라는 의미가 떠오른다.
원자라하면 예전 과학시간에 쪼갤수 없는 단위라고 기억 한다.
이러한 성질을 비교해서 원자와 같이 분할할 수 없다는 것을 비유된다.
즉, 원자 조작은 끼어들기[중간에 다른 일을 수행 하는것]이 불가능하며, 만일 중지되면 동작 개시 직전의 상태로
복귀 할수 있어야 한다.
위에서 설명한 끼어들기에 대해서 좀 더 자세히 설명한다.
공유 변수에 대한 접근과 변화가 이루어 지기 위해서는 load from Memory --> value change --> store Memory과정이
순차적으로 진행된다. 이러한 과정이 끝나기 전까지는 위의 과정에서 추가가 불가능 하다는 것이다.
***별외
이러한 과정을 공부하다 보면 Interrupt mask를 이용해서 Interrupt를 막아야 한다는 이야기가 나온다.
그냥 추상적으로는 이해가 가는데 그 이유가 궁금하였다.
커널에서 `한 Critical Section에서 공유 자원의 값을 변경 하고 있었다`라고 가정한다.
그때 인터럽트가 발생하였다.
그러면 ISR[Interrupt Service Routine]이 실행이 될 것이다.
하지만 이때 인터럽트 루틴에 의해서 공유지원의 값을 변경하면 어떻게 되겠는가?.
Critical Section에서 값 10을 *2하는 루틴에 의해서 결과 값이 20이 나와야한다.
하지만 Memory에서 10이라는 값을 로드하고 나서, load from Memory를 하고 나서 Interrupt가 발생하였다.
그러고 해당 값에 +2를 처리하는 ISR이 실행되었다.
그리고 해당 루틴으로 돌아와서 *2를 할 경우 결과 값이 24가 나오게 된다.
load from Memory --> [Interrupt] Memory Value Change --> value Change 순서로 수행되는 것이다.
이러한 것을 예방하고자 Interrupt Mask를 이용해서 막아 놓는 것이다.
--> 위의 방법은 과거 arm v5까지 사용했던 방식이라고 한다.
하지만 ARMv6 부터는 이러한 방법이 아닌, SMP[Symmetric multiprocessing] 시스템
[운영체계와 메모리를 공유하는 여러 프로세서가 프로그램을 수행하는 시스템]
에서는 atomic operation을 보장하지 않고 interrupt도 발생시킨다.
하지만 만약에 위에서 설명한 상황이 발생하면 진행 atomic 과정을 취소하고 다시 retry 하는 방식으로 처리한다.
그러면 위의 발생은 어떻게 알아 채는 가인데 하드웨어 도움을 받아서 처리 한다고 한다.
ldrex와 strex 명령의 쌍을 이요한다고 한다.
[출처 ] iamswdeveloper.tistory.com/entry/크리티컬-섹션-vs-뮤텍스-vs-세마포어
[출처2]http://vaert.tistory.com/39
[출처3]http://jake.dothome.co.kr/atomic/
[출처4]https://www.linux.co.kr/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=11129 인터럽트 마스트 이유
'학부_대학원 > 운영체제' 카테고리의 다른 글
Deadlock (0) | 2016.07.27 |
---|---|
가상 메모리 to 물리 메모리[3] (0) | 2016.07.26 |
가상 메모리 to 물리 메모리[용어] (0) | 2016.07.25 |
가상 메모리 to 물리 메모리[2] (1) | 2016.07.24 |
내부 단편화vs외부 단편화 (0) | 2016.07.24 |