서버 16

네트워크 기초 이론

네트워크 기초 이론 네트워크 위와 같이 고객, 경비실, 아파트 단지, 택배 배송 센터에서 택배를 보내는 것을 예를 들어서 설명할 수 있다. 같은 아파트 단지 내에 있는 다른 고객에서 택배를 발송할 때는 고객 -> 경비실 -> 고객의 경로로 택배를 보낼 수 있다. 이때, 택배를 보낼 때는 A 아파트 101호 -> A 아파트 102호와 같이 주소를 남겨야한다. 단, 같은 아파트 단지 내이기 때문에  주소 대신 간략하게 철수 -> 영희 와 같이 표시를 할 수도 있다. 다른 아파트 단지로 택배를 보낼 경우에는 A 아파트 101호 -> B 아파트 101호 와 같이 경비실에 택배와 주소를 맡긴다. 그리고 경비실에서는 주소를 확인하고 다른 아파트 단지라는 것을 확인한 뒤, 택배 배송센터에 보내게 된다. 그리고 택배 ..

Thread Local Storage (TLS)

Thread Local Storage (TLS)멀티 쓰레드 환경이라고 무조건 Lock을 거는 것은 효율적이지 않다. MMO RPG의 경우 여러 유저들이 동시에 한 곳에 각각 패킷을 보내는 경우가 많이 때문에 이때는 Lock을 거는 것은 과부하가 걸릴 수 있다. 무조건 Lock을 걸어서 멀티 쓰레드 환경을 구축하는 것도 가능은 하지만, 경우에 따라서는 (MMO RPG 같은) 무조건 Lock을 걸면 안된다는 것이다.  ex) 식당에서 각각의 점원들은 서로의 구역에 어느정도 상호작용하고 있고, 한번에 여러 직원이 같은 구역에 몰릴 가능성도 있다. 이렇게 한 곳에 동시에 패킷을 보내는 경우, 각각 Lock을 걸어서 처리하는 것이 아니라 공통적인 부분은 함께 같이 처리하는 방법이 필요하다. ex) 식당의 여러 테..

Lock 구현

Spin Lock변수를 점유할 때 까지 쉬지않고 계속 점유를 시도하는 방법 ex) 화장실에서 사람이 나올때 까지 대기  Spin Lock 구현1. 만약 Lock을 다른 쓰레드가 소유하고 있으면, 해당 Lock이 풀릴때 까지, 무한루프를 돈다.2. 만약 Lock을 소유하고 있는 쓰레드가 없다면, 해당 Lock을 얻고, 이제는 소유중이라고 Lock의 상태를 변경한다. 이 두가지 조건을 만족하는 코드를 작성해보자.  using System;using System.Threading;using System.Threading.Tasks;namespace CSharp{ class SpinLock { // 상태 volatile bool _locked = false; //..

데드락 (DeadLock)

데드락 (DeadLock) 데드락(Deadlock)은 컴퓨터 과학에서 여러 프로세스나 스레드가 서로를 무한히 기다리는 상태를 말한다. 이 상태에서는 모든 관련 프로세스나 스레드가 정지 상태에 빠져, 작업을 계속할 수 없게 된다. ex) 화장실에는 두개의 자물쇠가 있다고 가정. 서로 다른 사람이 각각 하나의 자물쇠를 가지면 둘다 잠글 수 없는 데드락 상태가 발생한다. 그래서 1번 자물쇠부터 가지고, 2번 자물쇠를 가지도록 약속을 해야한다.   namespace ServerCore{ class SessionManager { static object _lock = new object(); public static void TestSession() { ..

Lock

Lock멀티쓰레드 환경에서 공유 자원의 동기화를 위해 사용. 즉, 여러 개의 쓰레드가 동시에 하나의 공유 자원을 접근할 때 데이터 충돌을 방지하기 위한 기능  Interlocked의 아쉬운점앞서 설명한 Interlocked은 정수형 밖에 사용하지 못한다거나, 코드가 여러줄일 경우에는 굉장히 비효율적이다 라는 단점들이 발생한다. 단순히 정수를 더하거나, 빼는 것이 아닌 코드의 길이가 길 때, Lock을 사용할 수 있다.  static object _obj = new object();static void Thread_1(){ for (int i = 0; i  위와 같이 사용할 수 있다. Monitor.Enter과 Monitor.Exit 사이에 실행되는 코드는 다른 쓰레드의 간섭을 받지 않고, 싱글 쓰레..

InterLocked

InterLocked멀티 쓰레드에서 공유하는 변수에 대한 원자 단윈 연산을 제공하는 클래스  class Program{ static int number = 0; static void Thread_1() { for (int i = 0; i   위와 같이 두 개의 쓰레드가 실행된다면 당연히 0이 출력 될 것이다.  class Program{ static int number = 0; static void Thread_1() { for (int i = 0; i    Race Condition(경쟁 상태)하지만 이렇게 반복문의 크기가 더 커진다면 이렇게 의도와 다른 값이 출력 된다. 그 이유는 두 개 이상의 쓰레드가 공유 자원에 대해 읽거나 쓸 때 데이터에..

메모리 배리어

메모리 배리어멀티스레드 환경에서 메모리순서가 강제로 변경되는데, 이때 메모리 순서 변경을 막기위한 방법  코드 재배치 억제1) Full Memory Barrier(어셈블리 MFENCE, C# Thread.MemoryBarrier) - Store/Load 둘다 막는다.2) Store Memory Barrier(어셈블리 SFENCE - Store 막는다)3) Load Memory Barrier(어셈블리 LFENCE - Load 막는다) * 일단은 Full Memory Barrier만 알아 둘 것!  static int x = 0;static int y = 0;static int r1 = 0;static int r2 = 0;static void Thread_1(){ y = 1; //Thread.Me..

캐시 이론

캐시란?데이터 또는 계산 결과를 임시로 저장하는 기술로, 미래에 해당 데이터에 대한 요청이 있을 때, 더 빠르게 응답할 수 있도록 한다. ex) 식당에서 점원이 주문을 받고, 바로 주문현황에 업데이트하지 않고, 잠시 기억했다가 다른 주문도 받고 함께 주문현황에 업데이트를 함. 이때, 기억하는 방법은 단순 기억, 메모장, 큰 메모장 등이 있다. CPU는 여러개의 코어 (멀티 코어)로 이루어져 있음코어는 각각 ALU라는 연산장치와 기억을 하는 캐시장치로 이루어져 있음매번 RAM에 데이터를 갱신하는 것은 부담이 많이 됨캐시는 레지스터, L1 캐시, L2 캐시 처럼 다양한 기억 장치들이 있음 (레지스터 -> L1 캐시 -> L2 캐시 순으로 많은 기억을 함)  캐시 철학Temporal Locality : 시간적..

서버 프로젝트 셋팅

1. 프로젝트 만들기 (콘솔 앱 .NET Core) 기존 콘솔앱 (.NET Core)는 콘솔앱으로 명칭이 변경 (Visual Studio 2020 / .NET 5 이상 기준)   2. 새 프로젝트 생성 다음과 같이 DummyClinet, ServerCore 프로젝트를 추가 (코드 셋팅도 동일하게 해준다.)  DummyClinet : 임시로 실제 클라이언트 다용도 테스트 역할ServerCore : 서버 핵심 기능Server : ServerCore의 핵심 기능을 가져와서 사용함  3. 시작 프로젝트 설정 ServerCore를 시작 프로젝트로 설정