USB 직렬을 통해 하드웨어 장치로 데이터를 전송하는 OSX 응용 프로그램에서 작업하고 있습니다. 하드웨어에는 가변 속도로 소모되는 작은 직렬 버퍼가 있으며 항상 비어 있지 않아야합니다.OSX에서 실시간 스레드 만들기
우리는 하드웨어 버퍼가 꽉 찼는지를 검사하는 쓰기 루프를 자체 NSThread에 가지고 있으며 그렇지 않은 경우 데이터를 쓸 때까지 씁니다. 대다수의 루프 반복은 아무 것도 쓰지 않고 거의 시간이 걸리지 않지만 때로는 몇 밀리 초 (CACurrentMediaTime으로 시간 측정)까지 소요될 수 있습니다. 스레드는 각 반복 후에 100ns 동안 잠자 게됩니다. (나는 잠자기 시간이 현저하게 짧다는 것을 알고 있지만, 하드웨어를 부딪치게되면 하드웨어가 데이터가 부족해지기 시작합니다.)
이것은 잘 작동합니다. 그러나 주 스레드 또는 다른 응용 프로그램에서 프로세서 집중적 인 작업을 시작하면 쓰기 스레드가 느려지고 장치 큐가 비워지지 않을 정도로 데이터를 빠르게 스트리밍 할 수 없습니다.
그래서 직렬 쓰기 스레드를 실시간으로 만들고 싶습니다. 나는 Mach API를 통해 실시간 스케쥴링 요청시 the Apple docs을 읽은 다음 Chromium source에있는 SetPriorityRealtimeAudio (mach_port_t mach_thread_id)에서 코드 스 니펫을 적용하려고했습니다.
그러나 이것은 작동하지 않습니다. 응용 프로그램은 직렬 통신 속도 저하의 영향을 받기 쉽습니다. 어떤 아이디어? 쓰기 스레드의 동작을 변경해야하는지, 아니면 잘못된 스레드 정책 매개 변수를 전달하는지, 또는 둘 다에 대해 잘 모르겠습니다. 저는 다양한 기간/계산/제약 값을 실험하고 더 일관된 듀티 사이클 (최대 100ns 쓰기 후 100ns 동안 잠자기)을 강요하면서 운을 시험했습니다.
관련 질문 : 스레드의 우선 순위를 직접 확인하거나 실시간으로 시작한 다음 수준을 올리려는 것으로부터 승격되지 않는다는 것을 어떻게 알 수 있습니까? 지금은 하드웨어 성능에 대한 추측을하고 있습니다. 따라서 정확히 무슨 일이 일어나는지 정확하게 말하기는 어렵습니다.
는 'USB 시리얼'드라이버 'TxEmpty'에 방해하지 않습니다 그래서 비 폴링 인터페이스를 허용합니까? 그렇지 않다면, 그것은 빤다. –
이 작업을 수행해야하는 스케줄러가있는 멀티 스레드 OS입니다. 왜 이것이 왜 그런 문제 (당신이 생명에 중 요한 의료 기기를 사용하고 있습니까?)에 대해 더 설명하고, 경험하고있는 몇 가지 속도 범위와 환경에 대한 세부 사항을 제공 할 수 있습니까 (다른 기계에서 실행되는 것들)? 변동성의 원인을 해결 했습니까? 아니면 실시간/우선 순위가 높은 스레드를 강제 실행하려고 시도하고 있습니까?멀티 스레드 OS의 앱은 일반적으로 훌륭하게 작동해야하며 운영 체제를 스케줄링의 중재자로 간주해야합니다. – jefflunt
@jefflunt yeah - 현대적이고 선제적인 멀티 태스커가 피하도록 고안된 바로 그 일로, 불쾌한 I/O 폴링처럼 들립니다. –