전체 글 427

소켓 프로그래밍 기초

소켓 프로그래밍 기초소켓 프로그래밍도 식당의 예를 들어서 설명할 수 있다. 운영할 준비가 된 식당이 있다고 가정하자. 식당에는 문과 문지기가 있고, 손님은 이 식당의 문지기에게 휴대폰으로 식당에 자리가 있는지 물어보고, 자리가 있으면 친구를 먼저 보내서 상황을 전달 받을 수 있다.  손님의 입장 (클라이언트)휴대폰 : 소켓손님 : 클라이언트친구 : 클라이언트 Session식당 번호로 입장 문의 : 서버 주소로 연결휴대폰을 통해 친구와 연락 : 소켓을 통해 Session 소켓과 패킷 송수신 가능클라이언트가 서버에 접속을 하면, 서버에서 기타 처리를 한 뒤, Session을 하나 만들어서 모든 통신은 이 Session을 통해 이루어진다.  식당의 입장 (서버)문지기 고용 : Listen 소켓 준비문지기 교육..

네트워크 기초 이론

네트워크 기초 이론 네트워크 위와 같이 고객, 경비실, 아파트 단지, 택배 배송 센터에서 택배를 보내는 것을 예를 들어서 설명할 수 있다. 같은 아파트 단지 내에 있는 다른 고객에서 택배를 발송할 때는 고객 -> 경비실 -> 고객의 경로로 택배를 보낼 수 있다. 이때, 택배를 보낼 때는 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 : 시간적..

Stack Neon 개발 6일차

트러블 슈팅1. 뒤끝 서버 안드로이드 연결유니티 에디터에서는 뒤끝 서버 연결이 잘 됐지만, 빌드 후, 안드로이드 휴대폰에서 테스트를 할 때는 뒤끝 서버가 연결되지 않았다. 그 이유에 대해서 하루 정도 찾아 본 결과, 유니티 버전에 문제가 있었다. 유니티 6버젼 부터는 빌드 옵션에 Application Entry Point가 추가되었는데, 프로젝트 신규 생성 시 기본 GameActivity 로 체크되며, 뒤끝은 기존 방식의 Activtiy를 진입점으로 설정하여 안드로이드 Java클래스를 사용해 GoogleHash값을 가져오도록 되어 있어 Activity가 선택되어야 해시키 조회 함수가 정상 동작한다고 한다. 그래서 이와 같이 빌드 옵션을 변경 후, 해결 할 수 있었다.  2. 휴대폰 해상도에 따라 벽 위치..