[게임 서버] 오프셋(OffSet)이란?
·
공부/게임 서버
처음 주어진 요소부터의 변화값을 말한다. 예를 들어, A라는 배열 내용이 abcdef라면 c는 A 시작점에서 2만큼의 OffSet을 가진 것이다.
[게임 서버] 패킷(Packet)이란?
·
공부/게임 서버
패킷은 데이터와 헤더를 포함하는 데이터 단위다. 헤더에는 패킷을 목적지에 전달하기 위한 출발, 목적지와 컨트롤 정보가 포함된다. 데이터를 전달하기 위해서는 데이터를 잘게 잘라 전송하고 목적지에 도착하면 잘라진 데이터를 다시 조립한다. 이때 데이터를 자르는 단위가 바로 패킷이다.
[게임 서버] 블로킹 / 논블로킹, 동기 / 비동기
·
공부/게임 서버
https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0 블로킹 Vs. 논블로킹, 동기 Vs. 비동기 와 드디어 이해했다 속이 후련~ velog.io 블로킹 : A함수가 B함수를 호출하면 제어권이 B함수에게로 넘어간다. 논블로킹 : A함수가 B함수를 호출해도 제어권은 A함수에게 있다. 동기(Sync) : A함수가 B함수를 호출하고 B함수의 리턴값을 계속 확인한다. 비동기(ASync) : A함수가 B함수를 호출할 때 콜백함수를 같이 전달하고 B함수의 실행이 끝나면 콜백함수를 실행한다. A함수는 B함수의 작업..
[게임서버] AutoResetEvent와 ManualResetEvent
·
공부/게임 서버
영화를 보다가 화장실에 가고 싶은데 다른 사람이 변기를 차지하고 안에서 잠금장치를 걸었다면 우리는 고민한다. 1. 사람이 나올 때까지 그 앞에서 계속 기다릴지 2. 잠시 자리로 돌아갔다가 나중에 다시 와서 다시 문을 두드릴지 3. 영화관 직원에게 부탁하여 화장실에 자리가 나면 나에게 알려달라고 할지 세 번째 상황이 바로 AutoResetEvent다. 커널 영역에 있는 관리자에게 잠금장치가 열렸을 때를 알려달라고 부탁하는 방법이다. 관리자가 잠금장치가 열렸음을 알려주면 스레드가 한 번 실행되고 하나의 스레드가 실행된 뒤에는 자동으로 문을 닫아 다른 스레드의 방해를 막아준다. C#으로 작성된 내용입니다. using System; namespace ServerStudy { class Lock { AutoRes..
[C#] delegate (델리게이트 / 대리자)와 Invoke
·
언어/C#
마이크로소프트에서는 delegate를 '특정 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조를 나타내는 형식'이라고 소개한다. 맞는 말이기는 한데 글로만 봐서는 delegate를 왜 사용하는지 전혀 알 수가 없다. delegate를 직접 사용하면서 함께 알아보자. delegate는 메서드를 다른 메서드에 인수로 전달하는 용도다. 특히 함수 자체를 인수로 전달할 수도 있다. using System; namespace Study { delegate void Test(); // Test는 함수가 아니라 '형식'임. 함수 자체를 인자로 넘겨주는 형식. class Program { static void Button(Test testFunc) { testFunc(); // testFunc 함수 실행 } s..
[C#] 이벤트(event)란?
·
언어/C#
이벤트 클래스는 클래스 안에서 특정한 일이 발생했을 때 구독자들에게 그 일을 알리는 메커니즘이다. using System; namespace ServerStudy { class Publisher { public delegate void OnInputKey(); // OnInputKey라는 이름의 이벤트 핸들러 델리게이트 선언 public event OnInputKey InputKey; // InputKey라는 이름의 이벤트 선언 public void Update() { if (Console.KeyAvailable == false) return; ConsoleKeyInfo info = Console.ReadKey(); if (info.Key == ConsoleKey.Enter) InputKey(); } }..
[게임서버] 데드락(DeadLock)이란?
·
공부/게임 서버
데드락을 한글로 풀면 교착상태이다. 두 개 이상의 프로세스가 있다. 모든 프로세스가 원하는 자원이 자신이 아닌 상대에게 있어 자원이 자신에게 오기만을 기다리느라 자원을 얻지 못하고 다음 차례로 넘어가지 못하는 상태가 계속 되는 것이다. C#으로 작성된 내용입니다. using System; namespace ServerStudy { class Program { static object lock1 = new object(); static object lock2 = new object(); static void Test1() { lock (lock1) { Thread.Sleep(1000); lock (lock2) { Console.WriteLine("Test1"); } } } static void Test2(..
[게임서버] Context Switching이란? (Thread.Sleep(1), Thread.Sleep(0), Thread.Yield())
·
공부/게임 서버
영화를 보다가 화장실에 가고 싶은데 다른 사람이 변기를 차지하고 안에서 잠금장치를 걸었다면 우리는 고민한다. 1. 사람이 나올 때까지 그 앞에서 계속 기다릴지 2. 잠시 자리로 돌아갔다가 나중에 다시 와서 다시 문을 두드릴지 3. 영화관 직원에게 부탁하여 화장실에 자리가 나면 나에게 알려달라고 할지 두 번째 상황이 바로 Context Switching이다. Context Switching이란 작업을 진행 중인 스레드가 자신의 작업이 완료되지 않은 상황에서 자신의 작업을 잠시 저장하고 다른 스레드에게 CPU 점유권을 양보하는 작업을 말한다. C#으로 작성된 내용입니다. using System; namespace ServerStudy { class Lock { volatile int _locked = 0; ..
[C#] Volatile이란?
·
언어/C#
변수를 Volatile로 지정해주면 해당 변수는 최적화 과정에서 제외되며, 메모리에 직접 읽고 쓰게 된다. 참고 https://www.sysnet.pe.kr/2/0/10850 .NET Framework: 529. C# - volatile 키워드로 인한 차이점을 발생시키는 예제 www.sysnet.pe.kr https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/volatile volatile - C# 참조 volatile(C# 참조) 아티클 04/06/2022 읽는 데 5분 걸림 기여자 18명 이 문서의 내용 --> volatile 키워드는 동시에 실행되는 여러 스레드에 의해 필드가 수정될 수 있음을 나타냅니다. 컴파일러, 런..
[게임서버] 스핀락(Spinlock)이란?
·
공부/게임 서버
영화를 보다가 화장실에 가고 싶은데 다른 사람이 변기를 차지하고 안에서 잠금장치를 걸었다면 우리는 고민한다. 1. 사람이 나올 때까지 그 앞에서 계속 기다릴지 2. 잠시 자리로 돌아갔다가 나중에 다시 와서 다시 문을 두드릴지 3. 영화관 직원에게 부탁하여 화장실에 자리가 나면 나에게 알려달라고 할지 첫 번째 상황이 바로 스핀락(Spinlock)이다. 스핀락이란 잠금을 원하는 스레드에 잠금을 사용할 수 있을 때까지 무한 루프를 돌면서 확인·대기하는 것을 말한다. C#으로 작성된 내용입니다. using System; namespace ServerStudy { class SpinLock { volatile int _locked = 0; // volatile 변수는 최적화에서 제외되고 항상 메모리에 접근함 pu..
[게임서버] 상호배제 - Monitor.Enter, Monitor.Exit
·
공부/게임 서버
직전 게시글에 쓴 Interlocked 외에도 원자성을 억지로 만들어줄 수 있는 기능이 있다. Monitor가 그것이다. using System; namespace ServerStudy { class Program { static int number = 0; static object _lock = new object(); static void Thread_1() { for (int i = 0; i < 100000; i++) { Monitor.Enter(_lock); number++; Monitor.Exit(_lock); } } static void Thread_2() { for (int i = 0; i < 100000; i++) { Monitor.Enter(_lock); number--; Monitor...
[게임서버] Interlocked란?
·
공부/게임 서버
C#으로 작성된 내용입니다. using System; namespace ServerStudy { class Program { static int number = 0; static void Thread_1() { for (int i = 0; i < 100000; i++) number++; } static void Thread_2() { for (int i = 0; i < 100000; i++) number--; } static void Main(string[] args) { Task t1 = new Task(Thread_1); Task t2 = new Task(Thread_2); t1.Start(); t2.Start(); Task.WaitAll(t1, t2); Console.WriteLine(number)..
[게임서버] Temporal locality, Spatial locality
·
공부/게임 서버
C#으로 작성된 내용입니다. using System; namespace ServerStudy { class Program { static void Main(string[] args) { int[,] arr = new int[10000, 10000]; { long start = DateTime.Now.Ticks; for (int y = 0; y < 10000; y++) for (int x = 0; x < 10000; x++) arr[y, x] = 1; long end = DateTime.Now.Ticks; Console.WriteLine($"[y,x] 걸린 시간 : {end - start}"); } { long start = DateTime.Now.Ticks; for (int y = 0; y < 10000..
[게임서버] 메모리 배리어(Memory Barrier)란?
·
공부/게임 서버
C#으로 작성되었습니다. using System; namespace ServerStudy { class Program { static int x = 0; static int y = 0; static int r1 = 0; static int r2 = 0; static void Thread_1() { y = 1; r1 = x; } static void Thread_2() { x = 1; r2 = y; } static void Main(string[] args) { int count = 0; while (true) { count++; x = y = r1 = r2 = 0; Task t1 = new Task(Thread_1); Task t2 = new Task(Thread_2); t1.Start(); t2.Sta..
[게임서버] 스레드(Thread)란?
·
공부/게임 서버
스레드란 프로그램을 제어하는 단위를 말한다. 스레드(Thread) -> 프로세스(Process) -> 프로그램(Program). 예전에는 하나의 프로세스로 하나의 프로그램을 실행하는 데에 문제가 없었지만 프로그램이 복잡해지면서 더 작은 단위의 스레드가 생겼다. 하나의 프로그램에 하나의 스레드만 있는 것은 싱글 스레드(Single Thread), 둘 이상의 스레드가 있는 것을 멀티 스레드(Multi Thread)라 한다. 싱글 스레드(Single Thread) 장점 멀티 스레드에서 일어나는 문제인 context switching이 없음. context switching으로 인해 단순 작업에서 불필요한 시간이 늘어나지 않음. 여러개의 스레드를 사용하면 함께 사용하는 자원에 대한 통제를 제어해야 하나, 싱글 ..