비가 오기 전에 대비 - 임계 구역 중단 처리

비가 오기 전에 대비 - 임계 구역 중단 처리
고슴도치http://blog.csdn.net/littlehedgehog
 
 
      
왜 Linux 커 널 에 많은 코드 가 race condition (경쟁 조건) 을 처리 하기 위해 cli sti 와 같은 스위치 중단 명령 을 추가 하 였 는 지 이 문 제 는 언급 할 가치 가 없 는 것 같 습 니 다.wait 에서on_buffer 함수 (아래 코드 참조) 에서 스위치 중단 은 경쟁 조건 과 중단 이 임계 코드 에 대한 방 해 를 피하 기 위해 서 입 니까?
static _inline void wait_on_buffer(struct buffer_head * bh)

{

	cli();		//    。

	while (bh->b_lock)	//       ,       ,     。

		sleep_on(&bh->b_wait);

	sti();		//    。

}

먼저 조 박 의 설명 을 살 펴 보 자.
경쟁 조건 을 일 으 킬 수 있 는 코드 구역 에 들 어 갈 때 커 널 에 서 는 외부 인 터 럽 트 에 대한 응답 을 cli 명령 으로 닫 고 경쟁 코드 구역 을 실행 하면 커 널 은 sti 명령 을 실행 하여 CPU 응답 외부 인 터 럽 트 를 다시 허용 합 니 다.
계속 토론 하기 전에 두 가지 문제 에 대해 공감 대 를 형성 할 필요 가 있다 고 생각 합 니 다. 하하, 비교적 엄숙 한 표현 입 니 다.
1 、 waiton_buffer (같은 스위치 인 터 럽 트 명령 이 있 는 다른 프로그램 코드 포함) 는 모두 커 널 코드 에 속 합 니 다. 즉, 현재 이 프로 세 스 는 커 널 상태 에서 실행 되 고 있 습 니 다.
2. 커 널 상태의 진행 과정 을 선점 할 수 없습니다.
첫 번 째 점 에 대해 서 는 사실 잘 알 고 있 습 니 다.다른 것 은 말 하지 않 고 두 가지 예 를 들 어 보 겠 습 니 다. 하 나 는 sti 라 는 특권 명령 을 실행 합 니 다. 이것 은 커 널 프로 세 스 만 실행 할 수 있 고 일반 사용자 권한 으로 실행 할 수 있 는 것 이 아 닙 니 다!만약 마음대로 프로 세 스 가 실행 된다 면 시스템 은 아주 일찍 마비 되 었 을 것 이다.둘째, 그것 은 바로 우리 가 읽 은 코드 가 모두 커 널 코드 이기 때문에 이것 이 바로 커 널 코드 입 니 다. 약간 억 지 스 럽 습 니 다.
두 번 째 점 에 대해 서 는 우리 가 wait 를 수행 하고 있다 면on_buffer 를 끌 때 중단 되 지 않 아 도 다른 프로 세 스 로 이동 하지 않 습 니 다. 물론 다른 프로 세 스 가 이 buffer 의 속성 을 수정 하지 않 습 니 다.내 핵 은 비 선점 이 니까!예 를 들 어 이곳 의 도timer:
 if (!cpl)

		return;			//         ,   counter      。

	schedule ();

커 널 코드 가 do 를 실행 하 는 것 을 보 실 수 있 습 니 다.timer 는 퀘 스 트 전환 을 수행 하지 않 고 바로 돌아 갑 니 다!
그래서 우 리 는 프로 세 스 를 정리 하여 wait 를 실행 할 수 있 습 니 다.on_buffer 는 커 널 상태 입 니 다. 중단 되 지 않 았 더 라 도 다른 프로 세 스 로 예약 되 지 않 습 니 다.닫 히 지 않 고 끊 긴 '누 드 등' 을 방해 할 수 있 는 유일한 것 은 다른 중단 일 뿐이다.그러나 이러한 다른 중단 이 임계 구역 의 일부 관건 적 인 변 수 를 바 꿀 수 있 는 것 을 방지 하기 위해 서 우 리 는 만약 에 대비 하여 중단 을 꺼 야 한다.
다른 중단 에서 buffer 를 수정 하여 임계 구역 이상 을 초래 할 수 있 는 코드 를 발견 하지 못 했 기 때문에 리 눅 스 가 이렇게 쓰 는 것 은 적절 하지 않다 고 생각 합 니 다.조 박 의 한 마디 로 설명 하 자.
이 방면 에 서 는 사실 에 근거 하여 일 을 논 할 수 없다.끊 기 면 수정 되 나 요?커 널 프로 그래 밍 자 는 항상 이 방면 의 문 제 를 걱정 해 서 는 안 된다.

좋은 웹페이지 즐겨찾기