왜 spinlock 을 가지 고 있 을 때 sleep 을 하면 안 돼 요?

1873 단어 sync
참고:http://stackoverflow.com/questions/4752031/why-cant-you-sleep-while-holding-spinlock
먼저 보 세 요.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.

좋은 웹페이지 즐겨찾기