- 'critical section은 context switching을 하지 말아라!' 라는 것이 동기화 개념임.
- 처리 절차(개념):
- mutex init을 하면 열쇠를 하나 만들고 pointer로 만듬
- 접근하려는 task들은 열쇠를 포인터로 접근하는데
- 한놈이 접근하여 열쇠를 걸고 들어가면
- 다른놈들은 waitqueue에 넣어주고
- 다 쓰고 열쇠를 열면
- 열쇠에 걸려있는 waitqueue들을 다시 runqueue로 옮겨줌
- android는 이 동기화 매카니즘 때문에 반응성이 느려짐.
- framework에서는 메시지 큐, 헨들러 등 루퍼를 이용해서 비동기 매카니즘을 만들었음.
- 종류
- wait 계열
- MUTEX는 한 개의 공유 자원을 관리하는 것, semaphore는 한 개도 되고 여러 개의 자원을 관리하는데 쓰임
- semaphore는공중화장실이여러개인경우를생각하면된다.
- spinlock: sleep이 아니라 plag를 while로 돌면서 check하는 방식의 busyloop 방식이다. 즉 sleep으로 빠지면 안되는 code에서 사용함. 즉, interrupt handler에서 사용.
- 웃긴건 이는 multi core에 대한 내용이다. single core에서는 while 돌고 있는건 context switch가 안되니깐.. 실제로 CONFIG_SMP 보면 spinlock에 while 도는 부분을 막도록 되어 있다고 한다.
- MUTEX는 waitqueue/runqueue 이동이나 context switch code가 많이 들어가 있기 때문에 아주 간단한 lock의 경우는 spinlock이 효율적임.
- spinlock_irq --> irq disable / enable
- spinlock_irq_save --> irq disable 할때의 irq 상태를저장했다가 enable 할때그상태를복원.
- MUTEX는 구현이 간단하니깐 단일 자원 manage는 MUTEX를 쓰는 것이 효율적임. semaphore는 복잡함.
- 인터럽트 헨들러에 sleep 함수가 있으면 안되는 이유는,
- sleep 함수가 불리면 schedule() 함수가 불리는데 그러면 waitqueue에 들어가서 interrupt flag가 고정된 채로 동작하게 된다. 그래서 interrupt를 받지 못한다.
- 접근성에 대해서..
- 진정한 동시성: multi core는 hw적으로 동시 접근하고
- 유사 동시성: single core 상에서도 interrupt와 schedule 때문에 동시에 접근함
- interrupt 불능화가 동기화의 가장 효과적인 처리지만 함부로 쓰면 hw interrupt도 막는다. 그 다음으로 preempty_enable/disable도 효과적이지만 비슷한 이유로 가능하면 안하는 것이 좋다.
가장 많이 본 글
2014년 10월 6일 월요일
리눅스 커널 심층 분석 - 9장, 커널 동기화 개요, 10자, 커널 동기화 방법
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기