아래 코드가 어떻게 작동하는지 이해하려고합니다. 이것은 제 교수 강의 슬라이드에서 곧장 나옵니다. 이 P()와 V() 함수는 우리가 클래스 (OS161)에서 사용하는 OS에서 세마포어 구현의 일부이다. 내 질문에 대답하기 위해 OS161을 이해해야 할 필요가 있다고 생각합니다. 널리 사용되기 때문에이 질문에 답할 수 있기를 바랍니다.
강의 노트이 코드의 나의 이해 :
X :는 P() 함수를 우리가있는 경우 스레드 콜 P(), 우리는 해제가
2. 검사를 중단
1의 흐름 sem-> count에서 사용할 수있는 리소스
3.a) count가 0이면 우리는 잠들게된다.
3.b!) count! = 0이면 카운트를 감소시키고 호출하는 스레드가 critical 섹션으로 계속하도록 허용
4. 인터럽트 활성화
Y : 스레드 호출 V(), 우리가 비활성화 지금 이제
3.를 잡기 위해 가능한 한 많은 자원이 있음을 암시
2. 증가를 카운터를 인터럽트 V() 함수
1의 흐름 우리는 P()에서 잠을 자려고 보낸 모든 스레드를 깨우려고합니다. 스레드가 중요한 섹션에 대한 잠금을 잡으려고 할 때 충분한 리소스가 없기 때문에 깨어납니다.
인터럽트가 비활성화 된 상태에서 스레드는 어떻게 잠자기 상태가됩니까?
내 문제 :
1. "인터럽트 사용 안 함"섹션이 특정 쓰레드에서 인터럽트를 비활성화합니까? 광고 또는 모든 인터럽트를 비활성화합니까?
2. V() 함수에서 모든 스레드를 깨우면 P() 함수에서 while 루프 내부에서 슬립 된 스레드가 while 루프를 실행하기 시작합니다. 강의에서 그것은 하나의 실이 자물쇠를 잡고 나머지는 잠자 러가는 것을 말합니다. 내 질문은 "sem-> count == 0"조건이 다른 스레드가 아니라 하나만 false로 평가하는 이유입니다.
인터럽트 비활성화 부분이 어떻게 작동하는지 정말로 알고 싶습니다. 이것이 제 첫 질문입니다. 스레드 스케줄러를 중지합니까?, 시스템에서 컨텍스트 전환을 중지합니까?
스레드가 인터럽트 해제로 인해 절전 모드로 전환되는 이유는 무엇입니까? I/O 완료 신호 및 다른 것들을 놓칠 수 있기 때문에 그렇게 위험하지 않습니까?
P(sem) {
Disable interrupts;
while (sem->count == 0) {
thread_sleep(sem); /* current thread
will sleep on this sem */
}
sem->count--;
Enable interrupts;
}
V(sem) {
Disable interrupts;
sem->count++;
thread_wakeup (sem); /* this will wake
up all the threads waiting on this
sem. Why wake up all threads? */
Enable interrupts;
}
감사합니다.