분류 전체보기 67

[c#][서버] Thread Local Storage

고오급 식당주문, 조리, 결제 등이 딱딱 아름답게 나뉘어 있지 않음반드시 왔다갔다 해야 함각 과정에 락을 다 걸어야 혼선이 생기지 않겠지?여러 직원이 한 테이블의 일에 몰리지 않게즉 게임으로 치면DB, 게임 로직, 클라이언트 세션, 로그 등멀티쓰레드로 얘네의 일감 분배를 아름답게 해줘야겠지무조건 멀티쓰레드라고 락 걸고 쓰레드를 늘리는게 능사가 아니다.좁은 공간에 여러 직원이 들어가 봤자 일하기 더 불편해질 뿐이다Thread Local StorageStack 영역은 각 쓰레드에 별도로 존재임시 메모리이므로 여기다가 무얼 저장한 다는 것은 불안정Heap, 데이터 영역은 모든 쓰레드가 공유여기에다가 각 쓰레드의 개인 공간을 만들어 준다면?이게 TLS의 개념static ThreadLocal ThreadName ..

C#/네트워크 2024.06.03

[c#][서버] ReaderWriterLock

C# 내장 SpinLockstatic object _lock = new object();static void Main(string[] args){ bool lockTaken = false; try { _lock2.Enter(ref lockTaken); } finally { if (lockTaken) _lock2.Exit(); }}//내부적으로 무한 뺑뺑이가 아닌, 너무 오래걸린다면 양보를 하도록 설계됨이전에 직접 구현해 본 spinlock은 c#에 자체적으로 위와 같이 존재함어떤 락이든, 기본 철학은 상호 배제ReaderWriterLock읽기는 락을 안걸고, 쓸 때만 락을 걸고 싶다면?즉, 평소에는 락이 필요 없는데 특수한 경우에만 락이 필요..

C#/네트워크 2024.06.03

[c#][서버] Lock 구현 이론

락 구현 개념화장실에 누군가가 문을 잠근 채로 있다면?그냥 기다린다.그런데 오랜 시간이 지나도 나오지 않는다면?조금 시간이 지난 뒤에 다시 온다.보장이 안되고 랜덤성이 강함다른 사람이 먼저 채갈수도줄서기 알바를 쓴다줄서고있는 알바가 화가 난다컴퓨터에서의 개념Spin Lock계속 뺑뺑이를 돌면서 대기계속 실행 상태로 있기 때문에 자원을 차지하고 있음CPU 점유율이 튄다Context Switching쓰레드가 소유권을 포기코어가 다른 쓰레드에게 가버린다일정 시간이 지난 후 다시 그 쓰레드로 복귀왔다갔다 하므로 오버헤드 부담이 있음Auto Reset Event이벤트를 통해 통보를 받음커널에다가 이벤트 발생을 명령깨어나는 시점이 다른 것 보단 정확함SpinLock 구현//락이 풀릴 때까지 대기class SpinL..

C#/네트워크 2024.06.02

[c#][서버] 데드락

자물쇠가 여러 개인 경우두 사람이 한 화장실을 쓰려 함그런데 들어가려면 열쇠 두 개가 필요각자 자물쇠 한 개 씩 들고 있으면서 다른 자물쇠를 기다린다면?서로 다음 자물쇠를 기다리며 못들어가는 상황데드락 해결 방법규칙을 정한다무조건 위쪽 자물쇠부터 잠그고위쪽을 잠근 사람이 아래쪽도 가져가자코드 예시class SessionManager{ static object _lock = new object(); public static void TestSession() { lock(_lock) { } } public static void Test() { lock(_lock) { UserManager.TestUser(); ..

C#/네트워크 2024.06.02

[C#][서버] Lock 기초

Interlocked의 단점사실상 정수만 사용 가능몇백줄의 쓰레드에서 하나하나 인터락을 다 걸 수 없다.자주 사용하긴 함Monitor동시에 여러 쓰레드가 접근하면 문제가 되는 부분임계 영역, critical section_이걸 선을 그어서 아무도 건들지 마라 라고 선언을 해보자static int number = 0;static object _obj = new object(); static void Thread_1() { for (int i = 0; i 이렇게 하면 Race Condition 문제를 해결할 수 있음Monitor.Enter -> 화장실 문을 잠그는 행위다른 쓰레드가 들어올 수 없음Monitor.Exit -> 문을 열어주는 행위다른 쓰레드가 접근 가능이러한 상황 -> 상호배제, M..

C#/네트워크 2024.06.02

[C#][서버] Interlocked

문제 상황static void Thread_1(){ for(int i=0; i다음을 실행하면, 10만번 더하고, 10만번 뺐으니까 0이 출력돼야겠지만?이렇게 이상한 값이 출력된다.이유우선 ++, -- 연산은 내부적으로 다음과 같이 처리된다.int temp = number; // 0temp += 1; // 1number = temp; // number = 1int temp = number; // 0 temp -= 1; // -1 number = temp; //number = -1;이렇게 세 줄이 모두 실행되기 전에 다른 쓰레드에서 number를 수정해 버린다면?number = 1 -> number = -1 로 점프해버리는 상황이 발생한다.게임에서 예시를 들면돈 -= 100서버 다운 -> 이러면 돈..

C#/네트워크 2024.06.01

[C#][서버] 캐시 이론

고오급 식당주문 현황스테이크(1번 테이블)피자(4번 테이블)스파게티(3번 테이블)직원이 주문 받고, 포스기로 가는데 너무 멀다 -> 어떻게 해결?최대한 기억해 뒀다가, 수첩에도 적고, 많이 쌓이면 포스기로 간다주문을 번복했다 하더라도, 포스기까지 가지 않은 상태라면 수첩에서 수정하면 됨직원이 여러명이 된다면?각자 수첩이 있고, 직원끼리 공유하지 않음다른 직원에게 주문을 번복한다면?실제 컴퓨터직원 = 코어코어ALU(연산)캐시(기억)포스기RAM캐시 철학Temporal Locality시간적으로 보면, 방금 주문한 테이블에서 추가 주문이 나올 확률이 높다.방금 주문한 걸 메모해 놓자Spacial Locality공간적으로, 방금 주문한 사람 근처의 사람이 추가 주문을 할 확률이 높다.방금 주문한 사람과 합석하고 ..

C#/네트워크 2024.05.31

[C#][서버] 서버 개론, 멀티쓰레드 개론

서버 개론다른 컴퓨터에서 연결이 가능하도록 대기 상태로 상시 실행중인 프로그램식당처럼 손님이 올 수 있도록 열고 대기중인 상태손님이 오면 메뉴/정책에 따라 서비스 제공게임 서버의 종류Web Server(Http Server)테이크아웃 전문 식당손님이 음식을 받아 떠나면 이후로 연락이 끊김질의/응답용도드물게 정보 요청/갱신실시간 interaction 불요식당에서 손님한테 먼저 접근할 일 없음주문 후 손님이 떠나면, 손님의 상태를 잊고 지냄(stateless게임에 국한되지 않고, 웹 서비스를 만드는데 사용처음부터 만드는 경우는 사실상 없고, 프레임워크를 하나 골라서 사용ASP.NET(C#)Spring(JAVA)NodeJS(JS)Django, Flask(Python)PHPGame Server(TCP, Bina..

C#/네트워크 2024.05.30