가장 많이 본 글

2014년 10월 6일 월요일

리눅스 커널 심층 분석 - 9장, 커널 동기화 개요, 10자, 커널 동기화 방법

  • '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 효과적이지만 비슷한 이유로 가능하면 안하는 것이 좋다. 

댓글 없음: