futex 예제

futex 예제
2 Agosto, 2019 fabio

이 멀티플렉스 함수의 예제 사용에 대 한 조건 변수 구현 문서를 참조 하십시오. Futexes는 언뜻 보기에 기대 이상으로 매우 유용합니다. 가장 강력한 기능은 동일한 프로세스 내의 스레드뿐만 아니라 서로 다른 프로세스 간에 동기화를 허용한다는 것입니다. 동일한 공유 메모리를 매핑하기만 하면 Futex API가 작동하며 각 프로세스가 addr1에서 해당 위치를 사용하는 경우 Futex API가 작동합니다. Futex API의 일부가 아니지만 매우 관련이 있는 것은 강력한 잠금 syscalls입니다. 이렇게 하면 잠금이 있는 스레드가 종료되는 경우 프로그램을 복구할 수 있습니다. 일반적으로 다른 스레드가 해당 잠금을 잠글 수 없기 때문에 교착 상태가 발생합니다. 그러나 모든 스레드가 이러한 syscalls 및 “강력한 잠금” 목록을 통해 얻는 모든 잠금에 대해 커널에 알리는 경우 커널은 상황을 복구할 수 있습니다. 비트 집합 함수를 사용하면 최대 32개의 다른 대기 대기열이 addr1에서 단일 Futex 위치를 공유할 수 있습니다. 그러나 이와 같은 기능을 사용하는 것은 비효율적입니다. 단순히 더 큰 잠금 객체와 그 안에 여러 Futex 위치를 두는 것이 훨씬 낫습니다.

이렇게 하면 관심 있는 웨이터만 웨이크업에 대해 검색해야 합니다. 맨 페이지에 의해 문서화되지 않은 Futex API에 최근 추가된 것은 비트셋 멀티플렉스 기능입니다. val3에 저장된 FUTEX_WAIT 및 FUTEX_WAKE 작업에 새 인수를 추가합니다. 새 세부 사항은 비트 마스크 역할을 합니다. Futex API를 사용하면 절전 스레드를 추가하고 제거하는 것보다 대기 대기열을 더 잘 제어할 수 있습니다. 절전 스레드는 서로 다른 두 대기 큐 간에 이동할 수도 있습니다. 이렇게 하면 pthread 조건 변수에 대한 중요한 최적화가 제공됩니다. 즉, 몇 초만 기다려야 하는 스레드는 커널을 세 번 호출해야 합니다. 처음으로 절대 시간 시간을 구성하는 시간을 결정하고 두 번째는 pthreads 라이브러리 내에서 상대 시간으로 다시 변환한 다음 세 번째로 Futex syscall을 만듭니다. “vsyscalls”를 사용하면 첫 번째 및 두 번째 작업의 속도가 빨라지지만 이러한 중복 시간 검사 중 하나를 완전히 제거하는 것이 좋습니다. Futex API는 불행히도 제대로 문서화되지 않습니다. 최신 확장의 대부분은 맨 페이지에서 논의되지 않으며 소스 다이빙은 사용 가능한 기능과 사용 방법을 이해해야 합니다.

다행히도 glibc pthreads 라이브러리의 형태로 보다 이식 가능한 인터페이스를 구성하는 데 사용하기 위한 노력이 이미 완료되었습니다. 대부분의 프로그래머는 pthreads 인터페이스를 사용해야 합니다. 그러나 궁극적인 성능을 목표로 하는 사람들은 “덮개 아래”를 탐색하고 자체 스레딩 프리미티브를 구성해야 합니다. 마지막으로 조건 변수를 구현하는 데 사용되는 우선 순위 상속 작업이 두 개 더 있습니다. 첫 번째는 FUTEX_CMP_REQUEUE_PI이며, 이는 대상 대기 대기열로 우선 순위 상속 Futexes를 요구하는 것 이외에 FUTEX_CMP_REQUEUE와 동일합니다. 우선 순위 상속 Futex에 우선 순위 상속 Futex는 현재 지원되지 않으므로 addr1은 우선 순위가 없는 상속 Futex를 가리킬 필요가 있습니다. Futexes는 2016년부터 OpenBSD에서 시행되고 있습니다. [5] 거의 모든 Futex API는 sys_futex()를 통해 노출됩니다. 이렇게 하면 두 번째 매개 변수를 사용하여 여러 관련 작업으로 멀티플렉스를 사용합니다. 현재, 이들의 총 13, 함께 더 가능성을 증가 하는 추가 옵션 플래그의 몇 가지.