시작
close
프로필 배경
프로필 로고

시작

    • 분류 전체보기 (60)
      • 기타 (2)
      • 공부 (52)
        • 백준 풀어보기 (41)
        • 자료구조 핥기 (3)
        • 게임서버 (7)
        • 기타 (1)
      • 일상 (6)
        • 다녀보기 (1)
  • mode_edit_outline글작성
  • settings환경설정
  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

게임 서버 이론 구현 #5 - Context Switching, AutoResetEvent

DeadLock이 생기는 걸 방지하기 위해 아래 3가지 방법이 존재한다고 했다. 1. 무한 루프를 돌며 lock이 풀리길 기다리는 SpinLock 2. Thread.Sleep으로 쓰레드 소유권 잠시 포기 3. 작업 완료 시 Event 호출 이번 게시글에서는 2번과 3번에 대해서 다뤄보려고 한다. 우선 소유권을 포기하는 방법에 대해 좀 더 자세히 알아보자면 1. Thread.Sleep(n): 정수 n 밀리초 만큼 무조건 휴식 2. Thread.Sleep(0): 우선순위가 나보다 같거나 높은 쓰레드 한테만 양보 3. Thread.Yield(): 지금 실행 가능한 쓰레드가 있으면 실행 이렇게 3가지 방법이 있다. 단, 두번째 방법은 우선순위 순으로 양보하기 때문에 기아현상이 일어날 수 있음을 주의해야 한다. ..

  • format_list_bulleted 공부/게임서버
  • · 2023. 8. 5.
  • textsms

게임 서버 이론 구현 #4 - SpinLock

DeadLock이 발생하는걸 방지하기 위해 흔히 3가지 방법을 사용한다. 1. 무한 루프를 돌며 lock이 풀리길 기다리는 SpinLock 2. Thread.Sleep으로 쓰레드 소유권 잠시 포기 3. 작업 완료 시 Event 호출 각 방법은 나름의 단점이 있다. 1. lock이 금새 풀리지 않는다면 엄청난 비용 소모 2. Sleep으로 포기하자마자 lock이 풀리거나 풀린 후에 다른 쓰레드가 lock 가져감 3. 커널에 이벤트 발생을 부탁하는 것이라 깨어나는 시점이 다름 각자 장단점이 있으니 알아서 적절하게 골라 사용하면 된다. 중요한 건 Spinlock을 구현할 때 Compare-And-Swap으로 구현해야 한다는 것이다. 간단하게 무한 루프로 구현할 수 있을 것 같지만 이는 원자성에 위배된다. cl..

  • format_list_bulleted 공부/게임서버
  • · 2023. 7. 30.
  • textsms

게임 서버 이론 구현 #3 - Lock

쓰레드에서 경합조건이 일어나지 않게 Interlocked로 어느 정도 방지할 수 있지만 정수만 가능하다는 단점이 있다. 여기서 Monitor를 사용하면 정수 뿐만 아니라 여러 타입의 변수들도 다른 쓰레드에서 접근 못하게 막을 수 있다. static int number = 0; static object _obj = new object(); static void Thread_1() { for (int i = 0; i < 100000; i++) { Monitor.Enter(_obj); number++; Monitor.Exit(_obj); } } Monitor를 쓸 때 필요한 게 lock object다. 위 코드에선 object 변수를 만들어서 쓰고 있는데 reference 타입 변수면 전부 lock objec..

  • format_list_bulleted 공부/게임서버
  • · 2023. 7. 29.
  • textsms

게임 서버 이론 구현 #2 - Interlocked

Interlocked Interlocked는 쓰레드를 사용할 때 변수의 원자성을 보존해주는 명령어다. 변수의 원자성이란 다음 코드를 보면서 알아보자. static int number = 0; static void Thread_1() { for (int i = 0; i < 10000; i++) number++; } static void Thread_2() { for (int i = 0; i < 10000; 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(); Console.WriteLine(n..

  • format_list_bulleted 공부/게임서버
  • · 2023. 7. 27.
  • textsms
게임 서버 이론 구현 #1 - 컴파일러 최적화, 캐시 이론, 메모리 배리어

게임 서버 이론 구현 #1 - 컴파일러 최적화, 캐시 이론, 메모리 배리어

컴파일러 최적화 우리는 프로그램을 배포할 때 디버그 모드가 아닌 릴리즈 모드로 배포해야 한다. 릴리즈 모드는 말 그대로 배포를 위해 디버깅을 위한 정보를 모두 빼고 필요한 코드만 컴파일 하게 된다. 변수가 저장되는 공간도 다르고, 알아서 최적화를 하기 때문에 예상치 못한 오류가 발생할 수 있다. 다음 코드는 디버그 모드에선 괜찮지만, 릴리즈 모드 때 오류가 발생하는 예다. static bool _stop = false; static void ThreadMain() { Console.WriteLine("쓰레드 시작!"); while (_stop == false) { } Console.WriteLine("쓰레드 종료!"); } static void Main(string[] args) { Task t = ne..

  • format_list_bulleted 공부/게임서버
  • · 2023. 7. 25.
  • textsms
C# Thread 파해쳐보기

C# Thread 파해쳐보기

실험용 쓰레드 만들기 우선 실험용으로 5개의 문장을 출력하는 함수를 하나 만들어보자. static void MainThread(object state) { for (int i = 0; i < 5; i++) { Console.WriteLine("Hello Thread!"); } } 쓰레드를 사용해보자 해당 쓰레드를 사용하려면 Thread t = new Thread(MainThread); t.Name = "Test Thread"; t.IsBackground = false; t.Start(); 이렇게 불러올 수 있다. 쓰레드 객체 t를 생성하고 이름을 Test Thread로 지정한 다음 Background는 false로 설정한 후 쓰레드를 시작시켰다. 1. Thread.Name 쓰레드에도 이름을 지정해줄 수 ..

  • format_list_bulleted 공부/게임서버
  • · 2023. 7. 23.
  • textsms
  • 1
공지사항
전체 카테고리
  • 분류 전체보기 (60)
    • 기타 (2)
    • 공부 (52)
      • 백준 풀어보기 (41)
      • 자료구조 핥기 (3)
      • 게임서버 (7)
      • 기타 (1)
    • 일상 (6)
      • 다녀보기 (1)
최근 글
인기 글
최근 댓글
태그
  • #dna 비밀번호
  • #게임서버
  • #자료구조
  • #오블완
  • #티스토리챌린지
  • #스택
  • #c#
  • #백준
  • #C++
  • #12891
전체 방문자
오늘
어제
전체
Copyright © 쭈미로운 생활 All rights reserved.
Designed by JJuum

티스토리툴바