2010-07-27 5 views
0

두 가지 질문이 있습니다.PIPES는받는 사람을 "깨우기"위해 어떤 메커니즘을 사용합니까?

Windows에서 나는 파이프와 그 작동 방식을 잘 알고 있습니다. 그러나 OS가 메시지 도착에 대해 수신자 스레드에 알리는 데 사용하는 메커니즘이 무엇인지 궁금합니다.

"& 폴링"스레드가 데이터에 대해 계속 폴링합니까? OS가 스레드가 잠자기 상태인지 확인하고 잠자기 모드에서 깨어 났는지 확인합니다. 아니면 다른 메커니즘이 사용 되었습니까?

특히 많은 스레드가 메시지를 전달해야하는 IPC 시스템을 구축하고 싶습니다. 파이프를 사용할 필요는 없지만 가능한 가장 효율적인 알림 방법을 알아야합니다.

답변

0

개발자는 잠자기/설문 조사와 상관없이 파이프 작업 방법을 결정할 수 있습니다. 그렇지 않으면 차단 기능을 호출하고 데이터를 사용할 수있을 때까지 기다릴 수 있습니다.

파이프가 프로세스를 깨우는 메커니즘에 대해 - 프로세스가 블로킹 읽기 호출에 있음을 나타냅니다. 파이프가 아니지만 OS는 다른 OS와 마찬가지로 담당합니다. 호출 : 작업을 등록하고 데이터가 사용 가능할 때까지 프로세스/스레드를 차단합니다. 데이터를 사용할 수있게되면 시스템 호출이 완료됩니다.

+0

내 응용 프로그램은 1 프로세스 내에서 자체 관리 IPC이므로 "깨우십시오, 일하고 있습니다"정책이 가장 효율적일 것 같습니다. 스레드는 데이터 (여러 가능한 송신자마다 1, 잠금 필요성을 없애거나, 동기화 된 방법 - 그러나 느리다)에 대해 다양한 입력 버퍼를 검사 한 다음 아무 것도 찾지 않을 때 절전 모드로 전환합니다. 발신자는 필요할 경우 수령인을 깨우기 위해 시스템에 신호를 보냅니다. 아니면 잘못된 방향으로 벗어 났습니까? – IamIC

+0

단일 프로세스 내에서 작업하는 경우 가장 적합한 솔루션이 아닐 수 있습니다. 단일 프로세스에서 스레드 간 통신에 사용할 수있는 다중 스레드 메시지 큐 (이미 사용 가능한 라이브러리에 다른 구현이 있음)를 사용할 수 있습니다. –

+0

David에게 감사드립니다. 내가 찾을 수있는 것을 보게 될 것입니다. – IamIC

0

이것은 유닉스에 대한 대답입니다. 나는 솔루션이 오랜 기간 동안 있었고 강력하다는 것이 잘 알려져 있기 때문에 Windows에서 꽤 좋은 돈을 벌었습니다. 세부 사항은 약간 다를 수 있습니다 (API 호출, 의미론 등)

다른 쪽이 블로킹 또는 비 블로킹 모드에서 파이프의 파일 설명자를 사용하는지 여부에 따라 달라집니다.

차단 모드에서 프로세스는 OS 커널에서 데이터를 사용할 수있게되기를 기다리고 있습니다. 알림은 OS에 따라 다릅니다. 기회는 실행 가능한 것으로 간주되는 프로세스 큐를 포함하며, 커널이 인터럽트를 제어 할 수 있습니다 (대부분). 간단한 (단일 프로세서) 구현에서는 다른 프로세스가 (어떤 종류의 "관심 대상 집합"을 통해) 읽기를 기다리고있는 파이프에 쓰기와 같이 독자에게 알기 쉽고 독자를 실행 가능한 것으로 표시 할 수 있습니다. 그 시점에서 (결정할 시간은 스케줄러에 달려 있습니다).

비 차단 모드에서 프로세스가 때때로 폴링 (yuck!)하거나 select() 또는 poll()과 같은 시스템 호출을 사용 중입니다 (일부 고성능 버전도 있음). Windows 호출 WaitForMultipleObjects()과 매우 흡사하며 파이프와 잘 작동합니다. 그런 다음 실행 가능한 프로세스 대기열,이자 세트 및 스케줄러에서 다시 끝납니다.

제어 흐름이 독자와 작성자 사이에서 상당히 대칭이기 때문에 파이프가 꽉 차거나 파이프가 비어있어 블로킹 여부도 중요하지 않습니다. (데이터 흐름과 달리, 물론.

관련 문제