비가 오기 전에 대비 - 임계 구역 중단 처리
고슴도치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 를 수정 하여 임계 구역 이상 을 초래 할 수 있 는 코드 를 발견 하지 못 했 기 때문에 리 눅 스 가 이렇게 쓰 는 것 은 적절 하지 않다 고 생각 합 니 다.조 박 의 한 마디 로 설명 하 자.
이 방면 에 서 는 사실 에 근거 하여 일 을 논 할 수 없다.끊 기 면 수정 되 나 요?커 널 프로 그래 밍 자 는 항상 이 방면 의 문 제 를 걱정 해 서 는 안 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ros launch 파일 작성 과 노드 시작 순서 제어1. 저 는 파 라 메 터 를 읽 는 코드 세 션 을 ros: init (argc, argv, "node name") 에 두 었 습 니 다. 그 다음 에 변수 형식 을 정의 한 다음 에 ros: param: get ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.