쓰레드를 생성해서 실행하여 보았다. new를 통해 쓰레드를 생성하는 것은 정규직을 고용하는 것과 같다. 관리가 번거로움.Join() 함수는 쓰레드가 실행되고 끝날때까지 뒤의 작업이 대기상태가 된다.ThreadPool.set을 통해 최소, 최대 쓰레드의 수를 정하였다.T
Debug 모드에서는 \_stop이라는 static 변수에 여러 스레드에서 접근해서 잘 작동하는 것을 확인 할 수 있다.하지만 게임을 런칭하면 Debug모드가 아닌 Release모드를 사용한다.하지만 코드를 실행해보면 위와 같이 종료 대기중에서 더 나아가질 못한다.이는
캐시는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다.Temporal locality시간적으로 보면, 최
코드 실행 위의 코드를 실행하면 while문이 103번이 작동함을 알 수 있었다. 이는 쓰레드에서 y와 r1, 그리고 x와 r2가 연관이 없기에 하드웨어에서 최적화를 하기 때문이다. 즉 위의 방식으로 작동했다는 의미가 된다. 메모리 배리어 각 Thread에서
각 쓰레드는 number의 값을 1씩 증가, 감소시키는 작업을 한다.실행하면 우리가 기대하는 결과값은 0이 나와야 한다.왜 위와 같은 값이 나올까?Race Condition 때문이라 할 수 있다.Race Condition이란 두 개 이상의 concurrent한 프로세스
Thread 1,2에서는 number에 대한 연산을 처리 전, 후에 Monitor 함수를 넣어준다.Monitor.Enter의 경우 화장실을 닫는 행위, Monitor.Exit의 경우 화장실 문을 여는 행위로 생각하면 쉽다.닫혀 있는 경우에는 다른 스레드에서 화장실에 들
락이 걸렸는데 해제되지 못한 채로 유지되는것.다른 스레드에서는 접근하지 못하고 영영 멈추게됨.그림 출처 : https://ozt88.tistory.com/35위의 두 스레드를 실행하면 영영 멈춘 상태로 남아있게 된다.한 스레드에서는 여기서 작업이 멈춘 것을 확
스핀락을 클래스로 구현하여 보았다.\_locked 라는 불리언 변수를 두고 해당 값에 따라 while문을 돌면서 대기하도록 만들었다.Thread1과 Thread2는 SpinLock을 활용하여 num값을 증가, 감소시키는 함수이다.기댓값은 0이다.결과는 위와 같다.왜냐하
1ms 정도 쉬겠다. 조건부 양보나보다 우선순위가 낮은 애들한테는 양보 불가우선순위가 같거나 높은 쓰레드가 없으면 다시 작업 진행지금 실행 가능한 스레드가 있는 경우 양도, 없으면 다시 작업 진행문맥 교환(文脈交換, context switch)이란 하나의 프로세스가 C
단일 대기 스레드를 해제한 후에 신호를 받으면 자동으로 재설정되는 스레드 동기화 이벤트를 나타냅니다.AutoResetEvent를 통해 lock이 해제되면 이를 기다리는 스레드에 신호를 주고 lock을 획득하도록 한다.커널 모드에서의 context switching이 일
Read 작업은 값을 변경하지 않으니, 하나의 크리티컬 섹션에 여러개의 스레드가 진입해도 일관성 관련 문제가 발생하지 않는다.Write 작업은 값을 변경 할 수도 있으니, 하나의 크리티컬 섹션에 여러개의 스레드가 진입 할 경우 일관성이 깨질 수 있다.Read 작업은 여
쓰레드끼리 경합이 일어나지 않고 안전하면서 ,반영구적으로 안전히 사용할 수 있는 공간이다.위의 줄에서 디버깅을 했을때 value의 값이 null이다.하지만 아래 화면을 보면 value의 값이 갱신된 상태로 출력이 된다.즉 값이 null인 경우 () => { return
네트워크 상에서 돌아가는 두 개의 프로그램 간 양방향 통신의 하나의 엔드 포인트이다.엔드 포인트는 아이피 주소와 포트 번호의 조합을 의미한다.출처 https://helloworld-88.tistory.com/215ListenSocket 생성 -> Bind ->
args.Completed는 Accept가 완료되면 실행할 이벤트를 설정하는 핸들러이다.Init함수에서 실행될 함수이다.\_listen소켓을 비동기 방식으로 Accept한다.이후 클라에서 Connect가 되면 OnAccpetCompleted 함수를 실행한다.pendin
세션(session)은 컴퓨터 과학에서, 특히 네트워크 분야에서 반영구적이고 상호작용적인 정보 교환을 전제하는 둘 이상의 통신 장치나 컴퓨터와 사용자 간의 대화나 송수신 연결상태를 의미하는 보안적인 다이얼로그(dialogue) 및 시간대를 가리킨다. 출처https&#x
보낼 buffer들은 Queue에다가 넣어서 저장한다.처음으로 큐에 집어넣는 경우 바로 RegisterSend를 실행한다.큐에서 버퍼를 가져와서 SendAsync함수를 실행한다.sendAsync의 반환값이 false라는 뜻은 코드 실행 이후 바로 버퍼를 보냈다는 것을
pendingList가 비어있는 경우 바로 등록함수를 실시한다. Queue에 있는 buff들을 \_pendingList에 넣어준다. 이후 해당 List를 \_sendArgs.BufferList에 넣어서 사용한다.다 보내고 나면 BufferList를 null로 설정하고
ServerCore는 Server 라이브러리와 같다.Server의 경우 사용 목적에 따라 다양한 서버를 생성하기 때문에 이는 컨텐츠 부분에 해당한다.ServerCore는 Server가 공통적으로 사용할 핵심 부분을 구현하기에 이는 엔진 부분에 해당한다.세션은 엔진 부분
서버와 서버를 연결할 수도 있기에 만든 스크립트이다.클라와 서버 연결에도 사용 가능하다.기본적인 소켓을 설정하고 RegisterConnect 함수를 실행한다.userToken으로 저장한 소켓을 가져와서 ConnectAsync를 실행한다.Connect가 되면 실행되는 함
ReadSegment는 \_buffer에서 데이터가 담긴 부분을WriteSegment는 \_buffer에서 데이터를 쓸 수 있는 부분을 가리킨다.버퍼의 데이터를 읽거나 쓸 때 사용하는 함수이다.\_readPos와 \_writePos의 위치를 조절한다.\_recvBuff
TLS를 사용하여 각 쓰레드가 고유의 SendBuffer를 생성하여 Open 및 Close를 실행한다.세션에서 SendBufferHlper를 통해 ArraySegment를 반환받고 해당 arraysegment에 데이터를 복사한다.이후 Close함수를 호출하여 \_use
기존의 OnRecv함수는 sealed override를 통해 받은 패킷을 파싱하는데 사용하였다.while문 안에서 패킷 조립이 가능한 곳까지 오면 OnRecvPacket 함수를 실행하도록 하였다.이후 buffer를 다음 패킷 지점까지 옮겨 작업할 수 있도록 하였다.받은
ServerSession.cs (DummyClient) PlayerInfoReq는 클라에서 서버로 보내는 패킷에 필요한 내용이다. 해당 변수를 서버에서 확인하면 서버를 플레이어의 hp와 attack을 클라로 보내준다. 이에 해당하는 PlayerInfoOk 클래스는
패킷을 보내고 읽는 부분을 추상 함수로 선언Read함수는 ArraySegment에서 패킷의 사이즈, 패킷id, 플레이어 id를 읽어온다.이 부분에서는 테스트 용이기 때문에 플레이어id만 받아왔다.Write의 경우 기존에 있던 코드를 그대로 작성하였고 저장한 버퍼만 반환
string을 보낼 때는 보내기전에 string의 길이에 관한 내용을 보낸다.이후 string 내용을 붙여 보낸다.길이를 먼저 받아 온 이후 버퍼에서 해당 길이만큼을 문자열로 변경하여 받아온다.이름을 먼저 ushort의 크기만큼 띄어서 버퍼에 저장한다.이후 기존 cou
skillInfo 라는 구조체를 보내기 위해 사용할 구조체와 함수이다.기존의 Read, Write 함수이다.기존 함수에서 SkillInfo 구조체를 사용하는 부분을 추가하여 구현하였다.ServerSession의 OnConnected에서 패킷을 생성하여 스킬을 추가하고
패킷 생성 자동화를 위한 프로젝트를 하나 구성하였다.패킷 형식을 위한 xml 파일이다.메인 함수에서 PDL파일을 파싱하는 동작을 수행한다.패킷 단위로 파싱하는 함수이다.패킷 안의 멤버들을 파싱하는 함수이다.뒤의 부분은 미구현 상태이다.
패킷 자동화를 위한 코드이다. 해당 코드들은 아래의 Program.cs에서 활용할 코드들이다.패킷의 내용을 읽은 후에는 내용들을 토대로 GenPacket.cs라는 파일을 생성한다.멤버들을 파싱한 튜플의 값을통해 PacketFormat.packetFormat을 더한다.멤
배치파일 단순한 실행파일이라 보면 된다. PacketGenerator.exe 파일에 PDL파일의 경로를 매개변수로 주고 실행한다. 그러면 폴더에 GenPackets.cs가 생성이 되는데 이를 뒤의 경로에 복사 및 덮어쓰기 한다는 것을 의미한다. 내용이 잘 복사되는 것을 확인하였다.
}namespace Server{ class PacketHandler { public static void PlayerInfoReqHandler(PacketSession session, IPacket packet) {
채팅 시스템을 테스트 해보기 위해 패킷 이름을 Chat으로 설정하였다.C\_는 Client -> ServerS\_는 Server -> Client 으로 보내는 패킷이다.Broadcast 함수는 해당 방에 입장하여 패킷을 전송하는 기능을 한다.GameRoom에 해당 세션
SessionManager.cs (DummyClient) 리스트에 있는 각 세션에 패킷의 내용을 보내는 기능을 한다. 세션을 새로 생성하는 함수이다. 생성한 함수는 리스트에 저장해둔다. Program.cs (DummyClient) Main에서 다음과 같은 방식으로 세션을 생성하여 연결한다. PacketHandler.cs (Server) 클라이언...