반응형
1. 공유 메모리 접근에 대한 동기화 개념
1. 동기화 기법 없는 연산 결과
2. 동기화 기법 적용 후 연산 결과
그림 1. 동기화 없는 연산은 매번 발생하는 일은 아니다. 간헐적으로 발생을 하며, 복잡한 시스템속에 이러한 버그가 있다면 매번 발생하는 경우가 아니기에 더욱더 버그를 잡기 어렵다. 그러므로 초기 프로그램을 설계할 때 아래 동기화 기법을 사용하여 소프트웨어를 설계하는게 중요하다.
2. 동기화 기법
세마포어(Semaphor)
- 접근한 순서는 T1 -> T2 -> T3순이다. (우선 순위는 T3->T2->T1순이다.)
- 초기화 된 세마포어 변수 sem 을 Sem_wait()함수를 이용해 T1,T2,T3 이렇게 3개의 스레드가 잠그려는 상황이다.
- 세마포어를 잠글 떄에는 sem_wait()함수를, 잠금을 해제 할 때에는 sem_post()함수를 사용한다.
- T1이 Sem_wait()함수를 이용하여 sem을 잠그면서 sem의 count를 감소시킨다. Count가 0이 되면 이후 이 세마포어를 잠그려는 스레드는 block되게 한다.
- T1의 상호 배제 구역(Critical section) 수행 중에 sem을 잠그려한 T2와 T3는 sem의 sleep queu에 들어가 block 된다.
- T1이 sem을 풀면서 sem의 count를 하나 증가 시키고 sleep queue에 block 되어 있던 T2, T3를 ready queue로 넣어준 후 우선순위에 의해서 T3 가 실행된다.
뮤텍스(Mutex)
- 뮤텍스는 세마포어와 동작과 유사하지만 세마포아와 다르게 오직 하나의 대상만 자원에 접근이 가능하다.
(Count가 1개) - 뮤텍스는 lock대한 소유권이 있기 때문에 lock을 획득한 thread만이 unlock을 할 수 있다.
(세마포어는 다른 thread에서 unlock가능)
주의사항
1. 뮤텍스 변수는 초기화 하여 사용한다.
2. 잠그기와 풀기를 쌍으로 사용한다.
3. 중첩 사용할 경우 잠근 순서의 역순으로 사용한다
3. 중첩 사용할 경우 잠근 순서의 역순으로 사용한다
스핀락(Spinlock)
- 누군가 lock을 가져가 버렸다면 코드는 작은 루프 상태로 들어가서 주기적으로 락을 확인,
이때의 루프를 스핀(spin)이라 함. - 스핀락은 다중 프로세서 시스템을 고려함.
- 기존 spin lock은 thread간 lock을 획득하는 순서를 보장 할 수 없었으나 Ticket Spinlock 도입으로 순서대로
lock을 얻을 수 있으며 전체적 cache miss 횟수를 줄일 수 있었음.
3. 잘 못된 설계의 예
데드락(Dead-Lock)
두 개의 태스크간에 자원을 하나 씩 소유하고 상대방의 자원에 접근하려 하는 경우 교착상태에 빠져 나올 수 없는 상태가 된다.
순환 잠금(Cirular Lock Dependency)
같은 lock을 두번 사용하는 경우 두 번째 lock 호출 시 무한 대기 상태가 된다.
인터럽트
루틴에서 같은 lock을 두 번 호출하지 않았았는데도 불구하고 인터럽트 루틴에 의해 같은 lock이 호출되어 결국 두 번 사용되어지는 경우가 발생하는 경우 두 번째 lock 호출에서 무한 대기 상태가 된다
반응형
'Linux' 카테고리의 다른 글
리눅스 커널 printk 디버깅 방법 (0) | 2023.06.07 |
---|
댓글