내부 핵 에서 병발 하여 취한 조치

다 중 스 레 드 가 실 행 될 때 병발 하 는 문제 가 발생 하고 처리 가 잘 되 지 않 으 면 다 중 스 레 드 에 데이터 처리 오류 가 발생 할 수 있 습 니 다.SMP (대칭 다 중 프로세서) 와 커 널 선점 은 다 중 스 레 드 가 실행 하 는 두 장면 이다.우 리 는 커 널 자원 을 공유 하 는 것 을 보호 하 겠 다 는 문 제 를 제기 했다. 다음은 커 널 에서 자주 사용 하 는 방식 이 있다.
1. 자 회전 자물쇠 와 상호 배척 체
   먼저 임계 구역 의 개념 을 파악 하고 임계 구역 은 공유 자원 을 방문 하 는 코드 구역 이다.자 회전 자물쇠 (spin lock) 와 상호 배척 체 (mutex, matual exclusion) 는 커 널 을 보호 하 는 두 가지 기본 적 인 메커니즘 이다.
   1) 자전 자 물 쇠 는 같은 시각 에 하나의 스 레 드 만 임계 구역 에 들 어 갈 수 있 도록 확보 할 수 있 으 며, 다른 들 어 가 려 면 방출 을 기 다 려 야 한다. 물론 스 레 드 는 커 널 스 레 드 가 아니 라 실 행 된 스 레 드 를 말한다.
   
       :
   #include <linux/spinlock.h>
   
   spinlock_t mylock = SPIN_LOCK_UNLOCKED;
   
   spin_lock(&mylock);
   /* .... Critical Section code ... */
   spin_unlock(&mylock); /* Release the lock */

   
   2) 상호 배척 체 는 점용 되 는 임계 구역 에 들 어가 기 전에 제자리 에서 맴 돌 지 않 고 현재 스 레 드 를 수면 상태 로 들 어가 게 한다.
   
 
      :
   #include <linux/mutex.h>
   
   static DEFINE_MUTEX(mymutex);
   
   mutex_lock(&mymutex);
   /* .... Critical Section code ... */
   mutex_unlock(&mymutex); /* Release the mutex */

   
   그래서 사용 할 때 어떻게 선택해 야 하나 요?
   1) 임계 구역 에서 수면 이 필요 하 다 면 상호 배척 체 만 선택 할 수 있다.
   2) 인 터 럽 트 함수 에 서 는 자 회전 자물쇠 만 사용 할 수 있 습 니 다.
   
2. 원자 조작
   원자 조작 은 경량급 의 한 번 만 수행 하 는 데 쓰 인 다.카운터 수정, 조건 부 증가 치, 위치 설정 등에 자주 사용 된다.원자 조작 은 동작의 직렬 화 를 확보 할 수 있 으 며, 자물쇠 로 병발 을 보호 할 필요 가 없다.
   구체 적 인 조작 인 터 페 이 스 는 include / asm - xxx - arch / atomic. h 를 볼 수 있 습 니 다.
  
3. 읽 기와 쓰기 자물쇠
   모든 실행 장치 가 임계 영역 에 접근 할 때 읽 거나 쓰 거나 동시에 접근 하지 않 았 을 때 이 항목 을 선택 할 수 있 습 니 다.
  
  
     (Read):
   rwlock_t myrwlock = RW_LOCK_UNLOCKED;
  
   read_lock(&myrwlock);
   /* .... Critical Section code ... */
   read_unlock(&myrwlock); /* Release the lcok */
   
       (Write):
   rwlock_t myrwlock = RW_LOCK_UNLOCKED;
  
   write_lock(&myrwlock);
   /* .... Critical Section code ... */
   write_unlock(&myrwlock); /* Release the lcok */

   
   같은 인 터 럽 트 처리 에 사용 되 는: readlock_irqsave()、read_unlock_irqstore()、write_lock_irqsave()、write_lock_irqstore。
   1) 현재 새로운 커 널 에는 읽 기 보다 많은 순서 잠 금 (seqlock) 이 존재 합 니 다.
   기본 동작:
   
 
  do{
       read_seqbegin(&xtime_lock);
       /* .... Critical Section code ... */
   }while(read_seqretry(&xtime_lock,seq);

   
   2) 커 널 에는 또 다른 메커니즘 인 RCU (Read -- Copy -- Update) 가 있다.이 메커니즘 은 쓰기 동작 보다 읽 기 동작 이 훨씬 많은 성능 을 향상 시 키 는 데 쓰 인 다.기본 적 인 이념 은 읽 기 스 레 드 에 자 물 쇠 를 추가 할 필요 가 없 지만 스 레 드 를 쓰 는 것 이 복잡 해 져 야 한다. 먼저 한 부 를 복사 한 다음 에 복 사 된 이 데이터 구조 에서 업데이트 작업 을 해 야 한다.읽 기 작업 의 완성 을 보장 하기 위해 서 복사 본 은 모든 RCU 의 컨 텍스트 전환 을 일치 하 게 유지 합 니 다.구체 적 으로 는 Documentation / RCU / * 를 참고 할 수 있 습 니 다.
4. 디 버 깅 도구
   1) 일반적인 자동 잠 금 오 류 를 출력 하기 위해 (CONFIG DEBUG SPINLOCK) 설정 할 수 있 습 니 다.
   2)Lockmeter(http://oss.sgi.com/project/lockmeter/) 도 구 는 핸드폰 자물쇠 와 관련 된 통계 정보 에 사용 할 수 있다.
   3) 자 물 쇠 를 신청 하면 풀 어야 한 다 는 것 을 명심 해 야 한다. 자 물 쇠 는 흔히 볼 수 있 는 문제 이다.

좋은 웹페이지 즐겨찾기