iOS 세마포로 인해 스레드 우선순위 반전이 발생함 | JD Cloud 기술팀

동시 대기열에서 세마포어를 사용하면 스레드 우선순위 반전이 발생할 수 있습니다.

1. iOS16 & XCode14에서 발생 - 세마포어 사용으로 인한 스레드 우선순위 반전 알림



정보를 쿼리한 후 다음과 같은 도구가 XCode14에 추가되었음을 발견했습니다.

스레드 성능 검사기(XCode14에서 기본적으로 활성화됨) 이 도구를 사용하면 앱이 실행 시 스레드 우선순위 반전 및 기본 스레드에서 실행 중인 비 UI 작업과 같은 문제를 찾을 수 있으며 XCode 문제 탐색 모음에 표시됩니다. 지연 위험 경고가 시스템에 표시되어 개발 초기 단계에서 숨겨진 지연 위험 문제를 발견하고 해결하는 데 도움이 됩니다. 이는 충돌이 아닙니다. 원하지 않는 경우 진단에서 제거할 수 있습니다. "제품 -> 구성표 -> 구성표 편집 스레드 성능 검사기가 확인되었습니다."



XCode14에는 새로 추가된 도구 클래스도 있습니다. iOS 중단 감지를 참조하세요.

2. 스레드 우선순위 반전에 대하여

우선순위 역전(Poiority Inversion)은 우선순위가 높은 작업이 실행을 계속하기 전에 우선순위가 낮은 작업이 완료될 때까지 기다려야 함을 의미하며, 이 경우 우선순위가 반전됩니다.

예: A, B, C라는 세 개의 스레드가 있습니다. 우선 순위 수준 A > B > C, 스레드 A와 B는 일시 중지된 상태로 특정 이벤트가 발생하기를 기다리고 있으며, 스레드 C는 실행 중이고, 이때 작업 C는 공유 리소스 Source를 사용하기 시작합니다. Source를 사용하면 스레드 A는 이벤트가 도착할 때까지 기다리고 스레드 A는 준비 상태로 변경됩니다. 스레드 A는 스레드 C보다 우선 순위가 높기 때문에 스레드 A는 즉시 실행됩니다. 스레드 A가 공유 리소스 Source를 사용하려고 하면 스레드 C가 공유 리소스 Source를 사용하고 있기 때문에 스레드 A가 일시 중지되고 스레드 C가 실행되기 시작합니다. 이때 중간 우선순위의 스레드 B가 이벤트가 도착하기를 기다리고 있다면 스레드 B는 준비 상태로 변경됩니다. 스레드 B는 스레드 C보다 우선순위가 높으므로 스레드 B가 실행을 시작하고 스레드 C는 실행이 완료될 때까지 실행을 시작하지 않습니다. 스레드 A는 스레드 C가 공유 리소스 소스를 해제할 때까지 실행될 수 없습니다. 이 경우 우선 순위가 바뀌고 스레드 B가 스레드 A보다 먼저 실행됩니다.

3. 우선순위 역전의 결과는 무엇입니까?

우선순위가 낮은 작업이 높은 우선순위 작업보다 먼저 실행되어 작업 혼란과 논리적 혼란이 발생합니다.

시스템 충돌이 발생할 수 있습니다.

교착 상태: 우선 순위가 낮은 스레드는 오랫동안 예약할 수 없으며 우선 순위가 높은 스레드는 실행할 수 없어 교착 상태가 발생합니다.

4. 스레드 우선순위 역전을 방지하는 방법

(block1)과 같은 스레드에서 진행 중인 작업을 대기하여 현재 스레드가 차단된 경우 시스템은 block1이 위치한 대상 스레드를 알고 있으면 해당 스레드의 우선 순위를 높여 우선 순위 역전 문제를 해결합니다. (스레드 A 등) 스레드 C가 공유 자원을 획득하려다 정지된 기간 동안 스레드 C의 우선순위는 동일한 스레드 A의 우선순위로 올라가고, 스레드 C의 처리가 완료되면 낮아진다. 원래 우선순위로 돌아갑니다. 이렇게 하면 C가 B에 의해 선점되는 것을 방지할 수 있습니다. block1이 위치한 대상 스레드를 모르면 누구의 우선순위를 높여야 할지 알 수 없고, 세마포어와 같은 반전 문제도 해결할 수 없다.

5. 세마포어를 사용하면 스레드 우선순위가 반전될 수 있으며 이는 불가피합니다.

QoS(서비스 품질)는 작업이나 대기열의 실행 우선순위를 나타내는 데 사용됩니다.

1. 보유자를 기록하는 API는 우선순위 역전을 자동으로 회피할 수 있으며, 시스템은 dispatch_sync와 같은 해당 스레드의 우선순위를 높여 우선순위 역전 문제를 해결합니다.시스템이 보유자가 위치한 스레드를 알지 못하는 경우, 누구의 우선순위를 높여야 할지 알 수 없고, 반전 문제도 해결할 수 없습니다.

2. 스레드 동기화에는 주의해서 dispatch_semaphore를 사용하세요.

API가 어느 스레드가 세마포어를 보유하고 있는지 기록하지 않기 때문에 API가 우선순위 반전을 쉽게 일으킬 수 있습니다. 따라서 우선순위가 높은 스레드가 잠금을 기다리고 있을 때 커널은 어느 스레드의 우선순위(QoS)를 높일지 알 수 없습니다.

3. dispatch_semaphore가 우선순위 역전을 피할 수 없는 이유

dispatch_semaphore_wait()를 호출할 때 시스템은 어떤 스레드가 dispatch_semaphore_signal() 메서드를 호출할지 알 수 없으며, 소유자 정보도 알 수 없고 우선순위를 조정할 수도 없습니다. dispatch_group은 세마포어와 유사하며, enter() 메소드를 호출할 때 누가 떠날지 예측이 불가능하므로 시스템은 소유자 정보를 알 수 없다.

참고자료:

우선순위 반전

우선순위 반전 항목

성능 문제 조기 진단

dispatch_semaphore는 우선순위 반전을 유발하므로 주의해서 사용하세요!

저자: JD Retail Sun Qiaoqiao

출처 : JD Cloud 개발자 커뮤니티 전재시 출처를 밝혀주세요

OpenAI는 모든 사용자에게 ChatGPT Voice Vite 5를 무료로 공개합니다. 공식 출시됩니다. 운영자의 마법 작전: 백그라운드에서 네트워크 연결을 끊고, 광대역 계정을 비활성화하고, 사용자가 광 모뎀을 강제로 변경하도록 합니다. Microsoft 오픈 소스 터미널 채팅 프로그래머가 ETC 잔액을 조작하고 연간 260만 위안 이상 횡령 Redis의 아버지가 사용하는 Pure C 언어 코드는 Telegram Bot 프레임워크를 구현합니다. 오픈 소스 프로젝트 관리자라면 이런 답변을 어디까지 견딜 수 있습니까? Microsoft Copilot Web AI는 중국 OpenAI를 지원하는 12월 1일 공식 출시될 예정입니다 . 전 CEO이자 사장인 Sam Altman과 Greg Brockman이 Microsoft에 합류했습니다. Broadcom은 VMware의 성공적인 인수를 발표했습니다.
{{o.이름}}
{{이름}}

Acho que você gosta

Origin my.oschina.net/u/4090830/blog/10150683
Recomendado
Clasificación