모범 사례는 폴링하지 않는 것이지만 스레드가 wait ()를 호출 할 때 내부적으로 폴링이 발생하지 않습니까?


13

다른 스레드가 작업을 완료했을 때 확인하려는 스레드가 있다고 가정 해보십시오. 다른 스레드가 완료되었다는 알림을받을 때 까지이 스레드를 대기시키는 wait () 유형 함수를 호출해야한다는 것을 읽었습니다. 그리고 이것은 값 비싼 폴링을 수행하지 않음을 의미하기 때문에 좋습니다.

그러나 내부적으로 더 낮은 레벨에서 폴링이 발생하지 않습니까? 즉, 스레드를 wait ()로 만들면 다른 스레드가 완료되면 첫 번째 스레드에 알릴 수 있는지 확인하기 위해 커널이 폴링을 수행하지 않습니까?

나는 여기에 뭔가 빠진 것으로 추정됩니다. 누군가 나를 밝게 할 수 있습니까?

답변:


28

운영 체제는 폴링이 필요없는 이러한 프로세스 간 통신을위한 특정 기본 요소를 제공합니다.

프로세스 A가 뮤텍스 M에서 대기중인 경우 OS는 A를 실행할 수 없다는 것을 알고 무언가가 발생할 때까지 대기하는 프로세스 버킷에 넣습니다. M을 보유한 프로세스가이를 해제하면 OS는이를 기다리는 프로세스 목록을 확인합니다. 목록의 첫 번째 프로세스 (아마도 A)가 유휴 버킷에서 제거되고 실행 큐 에 배치 됩니다 . 다음에 A가 시간 조각을 가져 오면 호출 한 wait ()가 반환되고 프로그램이 계속됩니다.


그래서 어떤 방식으로 폴링이지만 OS 수준입니까?
tgkprog

7
@tgkprog가 아닙니다. OS 또는 다른 프로세스가 뮤텍스를 해제 할 때까지 대기 프로세스가 실행되도록 예약되지 않았기 때문에 이는 폴링이 아닙니다. 폴링 프로세스는 대기를 중지해야하는지 여부를 확인하기 위해 CPU 스케줄링에서 계속 경쟁합니다. 이러한 종류의 폴링 프로세스는 대기하는 동안 CPU 시간의 상당 부분을 레코딩 할 수 있습니다.
joshp

OS 프로세스가 뮤텍스 상태를 폴링하는 것을 의미했습니다. 비록 우리가 할 수있는 것보다 최적화되고 더 좋습니다. 아마도 스케줄러의 일부로 실행됩니다.
tgkprog

4
@tgkprog : OS는 뮤텍스가 프로세스를 해제하거나 종료 할 때까지 뮤텍스와 관련하여 약간의주의를 기울이지 않습니다. 이러한 이벤트 중 하나는 OS가 대기 목록에있는 모든 프로세스에 뮤텍스 잠금을 전달하고 해당 프로세스를 실행 가능으로 표시합니다. 폴링이 없으며 이벤트에 대한 응답입니다. joshp가 말한 모든 내용은 참조로 포함됩니다. :-)
Blrfl

2
@ csss : 거의. 프로세스는 자발적으로 종료 (예 : _exit(2)POSIX-y 시스템 에서 호출 ) 또는 비자발적으로 (예를 들어, 0으로 나누기 오류로 인해 인터럽트가 발생하거나 다른 항목이 호출 됨 kill(2)) 종료 될 수 있습니다. 두 경우 모두 제어가 OS로 명시 적으로 전달되어 실행중인 프로세스 또는 종료 될 프로세스를 알고 있습니다. 프로세스 종료 작업에는 리소스 해제, 뮤텍스 포함이 포함됩니다. 현재 죽은 프로세스가 뮤텍스를 보유한 경우 OS에서이를 해제합니다. 프로세스가 뮤텍스의 대기 목록에있는 경우 제거됩니다.
Blrfl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.