페이지

2021년 2월 25일 목요일

Unity C# Job System

Job System

Unity에서 간단하고 안전하고, 성능좋은 멀티스레드를 수행하는 기술.
Burst compiler 와 함께 사용하면, 더 좋다.
Job system은 Unity내부적으로 돌아가는 Native Job system과 자연스럽게 통합된다. 그래서 유저가 작성한 Job System코드와 유니티가 worker thread를 공유한다.  이러한 협력이 cpu cores보다 더 많은 스레드를 만드는것을 막아준다. 이로 인한 cpu 자원을 낭비하는 것을 줄일수 있다.

What is Multithreading?

싱글스레드란, 하나의 작업을 한번에 수행하고, 결과가 이후에 나오는 것을 말한다. 멀티스레드는 다수의 cpu 의 장점을 이용한 프로그래밍 기술이다. 싱글스레드와는 달리 동시에 여러작업을 수행하게끔한다. 

프로그램시작시, 하나의 스레드가 기본적으로 실행된다. 이를 우린 Main Thread 라고 부른다. 그리고 그 이후에 여러 작업들을 하기위해 스레드들을 병렬로실행시킬수 있고 그 결과들을 Main Thread와 동기화시킬수 있다. 

작업량이 적다면, 몇개의 스레드로 원하는 바를 이룰수 있겠지만, 게임 개발에서는 많은 작업량들이 필요로 해진다. 이는 cpu와 OS 처리능력을 최대로 사용하게 된다. pool of Threads  라는 기술로 이를 보완할수 있지만, 이는 동시에 많은 활성화된 스레드들을 사용하게 되서, CPU자원을 소모하게 된다. 이는 잦은 context switching을 야기시키기에 성능에 않좋다. 

* Context Switching

하나의 스레드가 다른 스레드를 실행할때 현재 시점, 상태를 저장하고 멈춘다. 그리고 이후 실행된 스레드가 끝나면, 이전 스레드를 찾아가서 저장된 시점부터 다시 실행하게 하는데, 이를 Context Switching이라 부른다. 이는 cpu 자원소모가 큰 작업이다.  그래서 가급적 이를 피해야 한다.

What is a Job system?

Job system은 멀티스레드 코드를 스레드대신에 Jobs을 생성해서 운영한다. 멀티코어를 이용해 작업자 스레드들을 하나의 그룹으로 다룬다. 이는 보통 context switching을 피하기 위해 하나의 로직컬 cpu core당 하나의 작업자 스레드를 만든다. (비록 여분의 core가 남아 있다고 해도.)

Job system은 Jobs을 Job queue에 넣어서 실행한다. 작업자 스레드는 Job queue로부터 온 작업들을 수행한다. 정확한 순서로 작업하는지를 관리한다. 

What is a Job?

작업 하나를 의미한다.  Job은 변수들을 받고, 데이터들을 작업하고 ...
A job receives parameters and operates on data, similar to how a method call behaves. Jobs들은 독립적일수 있고 다른 Job들과 연계되어 실행될수도 있다.

What are job dependencies?

게임 개발같이 복잡한 시스템내에서는 각 Job들이 다른 Job들과 연계되는 경향이 많다. 하나의 Job이 보통 다음 Job 을위해 데이타를 준비한다. 이러한 의존성 작업들을 하기위해서 dependencies를 지원한다. 만약 JobA 가 JobB에 의존적이라면, JobA는 JobB가 끝날때까지는 시작하지 않는다.
 



출처




댓글 없음:

댓글 쓰기