왜 spinlock 을 가지 고 있 을 때 sleep 을 하면 안 돼 요?
1873 단어 sync
먼저 보 세 요.spinlock 의 실현:
static inline void spin_lock(spinlock_t *lock)
{
raw_spin_lock(&lock->rlock);
}
#define raw_spin_lock(lock) _raw_spin_lock(lock)
void __lockfunc _raw_spin_lock(raw_spinlock_t *lock)
{
__raw_spin_lock(lock);
}
static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}
최종 호출 spinlock 때,우 리 는 그것 이 preempt 를 호출 하 는 것 을 발견 했다.disable(),프로 세 스 가 1 많은 책 에서 spinlock 일 때 sleep 하면 안 됩 니 다.정확히 말 하면 이 럴 때 사용 하 는 것 은 현명 하지 못 한 선택 이 라 고 할 수 있 습 니 다.2 sleep 는 프로 세 스 가 cpu 의 제어 권 을 자발적으로 양보 하 는 것 을 의미 합 니 다.컨 텍스트 는 실행 가능 한 다른 프로 세 스 로 전환 되 었 으 나 spinlock 3 을 방출 하지 않 았 습 니 다. 프로 세 스 A 를 가정 하면 먼저 spinlock 을 얻 습 니 다.이 때 는 A sleep 가 자발적으로 CPU 를 양보 할 때 입 니 다. kernel 은 프로 세 스 B 로 스케줄 링 되 고 B 도 같은 spinlock 을 가 져 오 려 고 합 니 다.B 는 계속 자전 합 니 다. kernel 은 A 로 더 이상 예약 할 수 없습니다.(선점 할 수 없습니다.B 는 CPU 를 가지 고 있 습 니 다.자발적으로 포기 할 때 까지)A 도 spinlock 을 방출 할 수 없습니다. B 도 영원히 spin 이 내 려 갈 거 야.하하,이 건 자물쇠 가 생기 는 거 야.
1 It's not that you can't sleep while holding a spin lock. It is a very very bad idea to do that 2 assume that a process sleeps while holding a spilock. If the new process that is scheduled tries to acquire the same spinlock, it starts spinning for the lock to be available. Since the new process keeps spinning, it is not possible to schedule the first process and thus the lock is never released making the second process to spin for ever and we have a deadlock 3 Sleep() means a thread/process yields the control of the CPU and CONTEXT SWITCH to another, without releasing the spinlock, that's why it's wrong.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Postgres에 스트라이프를 동기화하는 방법보시다시피, 고객은 Stripe 변경 사항을 쓴 후에 Sync Inc에서 /wait 노드를 호출할 수 있습니다.우리가 데이터베이스가 완전히 최신이라는 것을 확인했을 때, 이 단점은 하나 200 로 되돌아갈 것이다.즉...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.