목록프로그래밍/C# 게임서버 (25)
有希
하드웨어 최적화에 관련된 것. 하드웨어도 컴파일러처럼 최적화를 한다. CPU가 서로 의존성이 없는 명령어라고 판단하면 순서를 멋대로 바꿔 버린다. static void Thread1() { y=1; r1=x; } static void Thread2() { x=1; r2=y; } 와 같은 함수 2개가 있고 동시에 2개의 스레드에서 작동한다면? (4개의 변수 모두 0으로 세팅.) r1과 r2모두 0일 때 while루프를 빠져나오도록 짜놨다면 이상적인 결과는 빠져나오지 않아야 한다. 하지만 빠져나온다. 바로는 아니고 몇 천 번 정도 루프를 돌다보면... y=1 과 r1=x 사이에는 아무 연관성이 없기 때문에 CPU가 멋대로 r1=x를 먼저 실행할 수도 있다. 그렇게 되면 두 스레드 모두 2번째 줄이 먼저 실행..
캐시 철학 Temporal Locality - 시간적으로 보면, 방금 사용된 데이터는 또 사용될 가능성이 높다. 이를 캐시에 저장해놓으면 효율이 증가하지 않을까? 하고 캐시에 기록해 둔다. Spacial Locality - 공간적으로 보면, 방금 사용된 데이터 근처의 데이터도 사용될 가능성이 높다. 이 녀석들도 같이 저장해놓으면 효율이 증가하지 않을까? 하고 캐시에 기록해 둔다. 예들 들어, 2차원 배열에서 [x][y] 와 같이 변수 접근을 한다고 했을때, for(x) { for(y) { arr[y,x] arr[x,y] } } 전자의 경우는 선언한 행의 개수만큼 점프하면서 값을 찾아야 하고 후자의 경우는 바로 옆 메모리 주소 값을 변경하고 있다. 실행시켜보면 후자가 압도적으로 빠르다. 이 경우에는 Spa..
전역으로 선언된 변수는 모든 스레드들이 동시에 접근 가능하다. Thread.Sleep(x ms)를 넣어주면 함수를 호출한 Thread를 x ms만큼 멈춘다. Task t; t.wait()를 호출하면 해당 task가 종료될 때까지 기다린다. Thread의 경우에는 t.join() 이 된다. while(_stop==false) { //waiting for true _stop } 와 같은 코드를 Release모드로 실행하게 되면 if(_stop==false) while(true) {} 와 같이 컴파일러가 최적화 시켜버리는 경우가 있다. 이런 경우에는 다른 곳에서 _stop을 변경시켜 while을 빠져나와야 하는데 그렇지 않다. 이것을 막기 위해서는 _stop 선언에 volatile을 추가해준다. 해당 키워드는..
Thread를 사용하기 위해서는 using system.Threading; 추가 해주어야 한다. Thread t = new Thread(); 와 같이 선언하여 사용한다. new Thread()안에는 실행할 함수를 넣어줘야 한다. 이후 t.Start()를 해야 시작한다. 함수가 종료되면 스레드도 종료된다. t.IsBackground = true로 하게되면 while로 아무리 계속 돌려도 main이 종료되면 같이 종료된다.(daemon Thread) t.Join()을 main에서 하게 되면 t가 종료될때까지 기다리고 종료된 다음에야 이후 라인을 실행하겠다는 말이다. t.Name = “Name”으로 해당 스레드의 이름을 정해줄 수 있다. ThreadPool 스레드를 직접 만들어서 쓰기 보다는 쓰레드를 몇 개 ..
해당 강의를 구매하여 정리해두는 카테고리 입니다. [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 대시보드 - 인프런 | 강의 (inflearn.com) [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의 네트워크/멀티쓰레드/운영체제 등 핵심 전공 지식을 공부하고 게임 서버를 바닥부터 만들어보면서 MMORPG 기술을 학습하는 강의입니다., MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By Step! 🕹 www.inflearn.com 실제 코드는 강의를 구매하여 주세요.