목록Programming/Server (7)
지우너
1. Session #3 SendAsync() 호출 횟수 줄이기 지난 시간에 했던 내용 중 하나는 recvArgs와 sendArgs를 사용하는 방법이었다. 이 부분이 굉장히 중요한데 나중에 C++서버를 만들 때도 진짜 비슷하게 만들게 될 거니까 이 부분을 유심히 살펴보면 좋을 것 같다. 중요했던 것 중 하나는 SetBuffer를 하는 부분 Receive 같은 경우 초기에 recvArgs.SetBuffer(new byte[1024], 0, 1024); 이렇게 빈 버퍼를 연결만 해주었다. 그러면 나중에 클라이언트 쪽에서 데이터를 우리에게 보내고, 그 데이터가 우리가 연결한 버퍼에 저장이 된다. Send 같은 경우, 얘도 같은 인터페이스인 SetBuffer를 사용하기는 하는데, 얘가 SetBuffer를 하는 ..
1. Session #1 저번 시간에는 Listener class를 만들어서 Accept를 비동기로 만들었다. Session #1에서는 Receive() 비동기로 만들어 본다! 1.1. 지난 시간에 들 수 있는 의문점 1.2. Session 클래스에 Receive 옮기기(비동기로 만들기) 1.2.1. RegisterRecv() Listener를 만들 때와 동일했던 부분은 빨간 네모로 코드에 표시+빨간 테두리 설명 / 다른 부분(Socket 생성)은 초록색 박스로 표시했다. 박스로 표시한 부분 외에도 _listenSocket.Bind(endPoint); _listenSocket.Listen(10); 과 같이 Accept에 필요한 요소나 recvArgs.SetBuffer(new byte[1024], 0, 1..
앞에서 그랬던 것처럼 내용을 정리한 PPT로 내용을 대체한다... 1. 소켓 프로그래밍 1.1. 개념 클라이언트 클라이언트가 서버에 접속을 하면 서버에서 이런저런 처리를 한 다음 세션을 하나 만들어주는데, 그 후 모든 통신들은 세션을 통해서 이루어진다. 서버 일반적으로 연락을 주고받는 용도가 아니라 그냥 문지기 역할을 하는 Listener 소켓을 하나 준비한다. bind라는 함수를 통해 식당주소(서버주소)와 번호(port)가 무엇인지 Listener 소켓에 연동시킴 listen이라는 함수를 통해 클라에게서 접속요청을 받을 수 있도록 준비 접속 요청이 오면 accept 함수를 이용해서 안내해줌 accept가 끝나면 클라 세션 하나가 만들어지는데, 그 세션에도 소켓이 있다. 클라이언트와 대화할 때는 클라이언..
드디어 섹션1 멀티쓰레드 프로그래밍의 마지막 강의 정리를 올린다... TLS를 완벽하게 이해하고 싶어서 열심히 마이크로소프트 문서를 읽어봤으나(정확히 말하자면 문서에 나온 TLS 작동방식 다이어그램을 이해하고 싶었다...), OS 지식의 부족이 문제인지 잘 이해가 가지 않았다. 지금 보고 있는 인프런 강의가 끝나면 대학교 때 배웠던 OS 필기를 다시 보면서 복습해야 할 것 같다... 1. TLS게임을 예로 든다면 게임로직, DB, 클라이언트 세션 관리, 로그 찍기 등 다양한 분야들이 나뉜다. 그런데 얘네들이 코드 로직적으로 생각해보면 어느 정도 연관되어 있다. 예를 들어 게임 로직을 실행해서 아이템을 강화하는 작업을 한다면 이걸 DB에 저장해야 하니까 DB에도 갔다 와야 하고, 성공적으로 뭔가 이뤄졌으면..
나중에 서버를 쌓아올리게 되면 ①핵심적인 코어 부분만 멀티스레드로 만들 것인지 ②게임과 관련된 콘텐츠도 멀티스레드로 만들 것인지 선택해야 한다. ②의 경우 모든 코드에서 다 멀티쓰레드로 돌아갈 수 있다고 하면 난이도가 확연하게 올라간다. 심리스(=경계가 없는) MMORPG(ex. 젤다:야숨, 몬스터헌터:월드 등)를 만들 때 조금 유리하다는 장점이 있다. 그게 아니라 바람의 나라나 뮤 같은 게임을 보면 존 단위로 나뉘어져 있다. 공간이 갈 수 있는 지역이 구분이 되어 있고 그 공간 안에 서 있는 모든 컨텐츠 코드는 싱글쓰레드로 그냥 실행시키면 훨씬 더 생각하기도 쉽고, 버그 확률도 줄일 수 있다. 이럴 때는 굳이 멀티쓰레드로 갈 필요 없이 전체적인 코어만 멀티쓰레드로 돌리고 핵심적인 컨텐츠 코드는 싱글쓰레..
임계영역(Critical Section) 동시다발적으로 Thread들이 접근을 하면 문제가 되는 코드 영역을 의미한다. 해당 영역에서 race condition이 발생한다. race condition 멀티쓰레드 프로그래밍(1)에서 둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 입력 변화의 타이밍이나 순서가 예상과 다르게 작동하면 정상적인 결과가 나오지 않게 될 위험이 있는데 이를 경쟁 위험이라고 한다.(Wikipedia) 이를 해결하기 위한 방법 중 하나가 interlocked였다. Interlocked.Increment(ref num); interlocked계열은 성능도 굉장히 빠른 편이고, 우수하긴 한데 앞서 봤던 것처럼 정수만 사용할 수 있다는 치명적..