전체 글 424

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. 휴대폰 해상도에 따라 벽 위치..

Stack Neon 개발 5일차

구현 내용1. 랭킹 구현  https://kkln2486.tistory.com/443 랭킹 구현1. 데이터 테이블 생성데이터 테이블에 있는 데이터를 비교하는 것이기 때문에 데이터 테이블을 생성하고 해당 데이터가 존재해야 한다. https://kkln2486.tistory.com/445 뒤끝 회원가입, 로그인, 데이kkln2486.tistory.com 이전에 사용했던 방법인 뒤끝 서버를 사용해요 랭킹을 구현했다. 게임오버가 되면 서버에 저장된 나의 랭킹스코어와 비교해서 점수가 더 높다면 서버의 랭킹스코어를 갱신한다. 그리고 나의 랭킹과 유저 랭킹을 불러오도록 구현했다.  회고이전 프로젝트에서 랭킹을 구현하는데 일주일이 넘는 시간이 걸렸는데, 구현 방법을 잘 기록해뒀기 때문에 빠르게 구현할 수 있었다. 오랜..

Stack Neon 개발 3일차

구현 내용1. 닉네임 설정 팝업  https://kkln2486.tistory.com/134 캐릭터 이름 입력창 만들기 (Input Field - TextMeshPro)using UnityEngine.UI; using TMPro; [SerializeField] TMP_Text text; [SerializeField] TMP_InputField inputField; [SerializeField] GameObject gameStartPanel; // 매개변수는 string만 사용 가능 public void PlayerNameInput() { tmpText.text = inputField.kkln2486.tistory.com InputField를 사용해서 닉네임을 설정할 수 있도록 구현.   2. 랭킹 팝업 ..