뮤텍스와 세마포어는 대기중인 프로세스의 목록을 유지하고 현재 스레드가 중요한 섹션을 완료 할 때 깨우는 것을 읽습니다. 뮤텍스와 세마포어는 어떻게합니까? 프로세스 스케줄러 결정을 방해하지 않습니까?뮤텍스 또는 세마포는 어떻게 프로세스를 깨 웁니까?
답변
대기 및 깨우기는 일반적으로 과 협력하여 스케줄러와 함께 수행됩니다. 대기중인 스레드 중 특정 하나를 깨우도록 강제하는 뮤텍스 구현은 일반적으로 빈약 한 구현으로 간주됩니다.
대신 뮤텍스 또는 세마포어는 스레드가 대기 중임을 스케줄러에 알리고 "실행할 준비가되었습니다"목록에서 제거합니다. 그런 다음, 뮤텍스 잠금이 해제 또는 세마포어는 구현 중 하나
스케줄러에게 통지 스케줄러의 재량에 따라 대기 스레드 중 하나, 또는
을 깨워 스케줄러를 요청합니다, 신호 때 모든 대기중인 스레드를 실행할 준비가 된 다음 대기중인 스레드에 논리를 적용하여 스케줄러가 깨우는 첫 번째 스레드를 제외한 모든 스레드가 다시 잠자기 상태가되도록합니다.
전자가 선호되는 구현 방법이지만 항상 사용할 수있는 것은 아닙니다. 두 번째는 "천둥 무리 (thundering herd)"접근법이라고 불리기도합니다. 기다리는 스레드가 1000 개일 경우 1000 개가 모두 깨우며 (999 개는 큰 천둥 소리를냅니다.) 잠자기 상태로 돌아갑니다. 이것은 CPU 리소스를 낭비하고 가능하면 구현을 피할 것입니다.
이것은 구현에 따라 크게 달라집니다. 이러한 것들을 말할 때, 우리는 일반적으로 운영 체제를 지원할 수있는 스레드를 참조하거나 언어로 완전히 구현 될 수 있으므로 스레드 지원을 위해 O/S와도 상호 작용하지 않습니다.
그러나 프로세스를 참조 할 수도 있지만 이러한 구현에는 일반적으로 프로세스 관리를위한 일부 O/S 지원 외에도 복잡한 메시지 전달 패턴이 필요합니다.
예, 대기 조건이 충족 될 때까지 대기 프로세스 (세마포어 또는 I/O)가 스케줄러의 실행 대기열에서 제거된다는 간단한 설명이 있습니다.
- 1. 수신 전화가 iOS 배경 앱을 깨 웁니까?
- 2. 뮤텍스 및 세마포는 무엇입니까? 우리는 어디에서 구현해야합니까?
- 3. 세마포는 어떻게 작동합니까?
- 4. Mac OS X Leopard의 .bash_profile은 Rails를 깨 웁니까?
- 5. 뮤텍스 또는 뮤텍스하지 않으려면?
- 6. Win32의 뮤텍스
- 7. 재귀 또는 오류 검사 뮤텍스?
- 8. Rails - ActiveRecord - 객체와 관계를 어떻게 채 웁니까?
- 9. Windows에서 세마포는 어떤 순서로 출시됩니까?
- 10. 뮤텍스
- 11. 뮤텍스 또는 퓨 텍스 대기 시간 측정
- 12. MapView가 TableLayout을 깨 트니까?
- 13. Perl에서 심볼릭 링크가 깨 졌음을 어떻게 감지 할 수 있습니까?
- 14. Delphi - TStoredProc.Close (집합을 비 웁니까?)
- 15. SharedPreferences : 왜 그렇게 불리 웁니까?
- 16. 뮤텍스 및 잠금 구조는 어떻게 구현됩니까?
- 17. 현재 프로세스를 어떻게 sudo합니까?
- 18. 호출 자식 : 파이프가 깨 오류
- 19. 어떻게 SQL 데이터베이스의 한 열에서 PHP 배열 채 웁니까?
- 20. 하위 뷰의 하위 뷰인 UITableView는 어떻게 채 웁니까?
- 21. 펄에서 프로세스 간 뮤텍스
- 22. "분리 뮤텍스"란 무엇입니까?
- 23. C++에서 쓰기 뮤텍스
- 24. 리눅스 커널 뮤텍스
- 25. 모듈간에 뮤텍스 공유
- 26. 오래된 뮤텍스 검색
- 27. 뮤텍스 릴리스 확인
- 28. 뮤텍스 대 모니터 - 비교
- 29. smp로 자바 뮤텍스
- 30. 뮤텍스 저장 프로 시저
유익한 정보! 하지만 나는 여전히 의심의 여지가 있습니다. 왜 스케줄러가 대기열의 모든 스레드를 깨우지 않고 대기열의 첫 번째 파일을 가져올 수 없습니까? 그리고 현재 리눅스에서 posix 스레드 라이브러리를 구현하고있는 것은? 감사! – zach
위의 옵션 1 : 스케줄러의 재량에 따라 하나 깨우기. –
리눅스에서 pthread_mutex_t는 단 하나의 스레드 만 깨운다 고 생각합니다. –