Unity Job System - 기본

이장근·2023년 4월 16일
0

Unity DOTS

목록 보기
2/6
post-thumbnail

Job System - 개념

[사용하면 얻을 수 있는 이점]

1. 기존 Unity 기능과 잘 연동하는 멀티 스레드 코드 작성을 용이하게함.
2. 버스트 컴파일러와 함께 사용 시 코드 생성 품질 개선 및 모바일 디바이스 배터리 소모량 감소
3. Unity 내부 기능과 통합 및 워커 스레드 공유를 통한 CPU리소스 경쟁 감소 및 회피

Job System : 스레드를 대신하여 Job을 만들어 멀티스레드 코드를 관리하는 시스템

Job : 특정한 단일 작업을 수행하는 작은 작업 단위. 메서드 호출 동작과 유사한 방식으로 파라미터를 수신하고 데이터 작업을 수행한다. Job은 독립적일 수도 있고, 종속적일 수도 있다.

Job 종속성 : 특정 Job이 완료될 때 까지 대기해야 하는 경우에 종속성이 있다고 한다.
Job System은 이를 인식하고 지원하며, JobA가 JobB에 종속된 경우, 시스템은 JobB가 완료될 때 까지 JobA를 실행시키지 않는다.

C# Job System의 안전 시스템
: 경쟁 상태를 예방하고 감지할 수 있는 시스템을 지원한다.
*경쟁 상태(Race Condition): 둘 이상의 입력 또는 조작의 타이밍(순서)에 따라 결과 값에 영향을 줄 수 있는 상태

C# Job System은 각 잡에 메인 스레드의 데이터 레퍼런스를 보내지 않고, 필요한 데이터의 복사본을 보내 경쟁 상태를 예방합니다. 복사본으로 인해 데이터가 격리되어 문제가 발생하지 않습니다.

위의 데이터를 복사하는 방봅으로 인해 Job은 Blittable 데이터 타입에만 액세스 할 수 있습니다.
*Blittable: 블록 전송 또는 개체를 복사하는 것에 적합한지 여부를 나타내는 .NET 관련 용어.

C# 잡 시스템은 memcpy를 사용하여 Blittable 타입을 복사하고 Unity의 관리되는 파트와 네이티브 파트 간에 데이터를 전송할 수 있습니다. 시스템은 잡을 예약할 때 memcpy를 사용하여 데이터를 네이티브 메모리에 저장하고, 잡을 실행할 때 이 복사본에 액세스할 수 있는 권한을 관리되는 파트에 할당합니다.

하지만 NativeContainer를 사용하면 Job이 항상 복사본으로 작업하는 것이 아니라 메인 스레드와 공유되는 데이터에 액세스 할 수 있습니다.

NativeContainer: burst때 잠깐 나왔던 저장소 타입. 네이티브 메모리에 상대적으로 안전한 C# 래퍼를 제공하는 관리되는 값 타입입니다.

위에 말한 안전 시스템이 NativeContainer에 대한 읽기/쓰기 작업을 추적하며, 이 시스템은 모든 NativeContainer에 내장되어 있습니다. 안전 검사(한도 검사, 할당 취소 검사, 경쟁 상태 검사)는 Unity Editor Mode 및 Play Mode에서 이용할 수 있습니다.

Job 내 Static Data에 대한 액세스는 보호되지 않습니다! 이 방법은 모든 안전 시스템을 우회합니다!
잡을 실행할 때 Execute 메서드는 단일 코어에서 실행됩니다.

profile
Red Queen's Paradox

0개의 댓글