평소같이 기계적으로 프로그래머스 코딩테스트를 풀다가.. 벽에 부딪혔다. 나와 같은 실수를 하는 사람들을 위해 글을 남겨보겠다. https://school.programmers.co.kr/learn/courses/30/lessons/42897 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 문제는 평범한 DP문제였지만 생각해야 할 점은 집이 원형으로 이루어져 있기 때문에 이를 선형 자료구조인 vector로 다루기 때문에 이 점만 조심하면 된다. 따라서 까다로운 조건인 첫번째 집을 선택했을 때에 마지막 집을 포함하지 않아야 한다는 조건만 생각하면서 이를 ..
전체 글
멀티스레드를 이용하는 서버 엔진을 설계해보면서 각 유저 세션의 송신버퍼(SendBuffer)를 불가피하게 Lock으로 관리해야 했다. 현재 구조에서는 문제가 없지만 나아가 Deadlock이나 Lock에 의한 성능 저하가 걱정되어 락 프리(Lock-Free) 알고리즘에 대해 공부해보았고 이를 정리해보았다. 락 기반 알고리즘의 문제점 Mutex, Semaphore나 를 이용한 Lock을 통해 멀티스레드를 관리할 때에는 Lock을 획득하지 못한 스레드는 Lock을 획득한 스레드가 해당 Lock을 Release 할때까지 대기상태에 머물러야 한다는 단점이 있음. 또 DeadLock과 같은 예상하지 못한 문제가 발생할 수도 있다. 한마디로 일반적으로 Lock 사용 시 공유 메모리에 접근하는 멀티쓰레드가 많아질수록 ..
이어서 소켓 통신에 대해 알아보기 전에, 우선 I/O 하면 자주 나오는 Synchronous/Asynchronous 와 Blocking/NonBlocking을 먼저 정리하고 넘어가도록 하자. 문서는 네이버 클라우드 플랫폼에서 작성한 게시글을 참고하였다! Synchronous/Asynchronous 와 Blocking/NonBlocking #Synchronous, 동기 I/O 요청 - 응답 작업이 일련의 순서를 따름. 작업의 순서가 보장됨. 작업 완료를 user space에서 판단. #Asynchronous, 비동기 kernal에 I/O 작업을 요청해두고 다른 작업 처리가 가능하나, 작업의 순서는 보장되지 않음. 작업 완료를 kernal space에서 통보. #Blocking, 블로킹 요청한 작업이 모두 ..
네트워크 프로그래밍을 공부하고 서버 엔진 구조를 짜보면서 공부한 필수 내용들을 정리해보았다. 물론 이 문서는 Windows 기반으로 winsock 라이브러리를 이용하여 진행되었다. 소켓 통신 소켓통신에 앞서, 소켓(Socket)이란 프로세스(어플리케이션 계층)에서 네트워크 프로그래밍을 사용하기 위한 인터페이스 정도라고 생각하면 된다. 흔히들 TCP, UDP라고 하는 전송 계층(Transport Layer)과 프로그래머가 개발하고자하는 응용 계층(Application Layer) 사이의 인터페이스로 소켓을 이용하면 간단하게 네트워크 프로그래밍을 할 수 있다. TCP vs UDP 위에서 말했듯이 전송 계층의 TCP와 UDP 프로토콜에 대해 간단하게 정리해보면 TCP 연결 지향 방식으로 패킷을 교환 - 논리적..
간단한 2D 로그라이크 게임 개발을 진행하면서 랜덤 맵 생성 알고리즘에 대해 알아보았다. 우선시 생각한 부분은 맵을 각각의 작은 방으로 분할하여 해당 방에 일정한 숫자의 아이템 또는 몬스터를 스폰. 맵을 서버에서 만들어서 클라이언트에게 전송해줄것이기 때문에 생성시간이 짧을수록 좋음. 따라서 BSP 알고리즘을 이용하여 랜덤하게 맵을 생성해 보았다. BSP 알고리즘(이진 공간 분할법)이란 공간, 평면을 그림과 같이 두개의 다각형으로 분할하여 공간을 재귀적으로 분할하는 방법이다. 본래는 3D 그래픽스에서 효과적으로 렌더링(ex 공간을 나눠 렌더링하는 방식)을 하는데에 사용되었는데, 2D 게임에서 BSP 알고리즘을 이용하여 공간을 분할하여 여러개의 방으로 나누고, 이 방들을 이어주는 방법을 통해 랜덤하게 맵을 ..
winapi를 사용하면서 winapi 함수들에 사용된 stdcall에 대해 찾아본 내용을 정리해보았다. 함수의 호출을 이해하기 위해서는 우선 콜 스택과 몇가지 레지스터에 대해 이해하고 있어야 한다. 콜 스택(Call stack) 함수 호출 시 스택에는 함수의 매개변수 + 함수 본체에서 사용하는 지역변수 + 함수 호출 후 돌아갈 반환 주소 등이 저장되어 있다. 이렇게 스택 영역에 차례대로 저장되는 데이터들을 스택 프레임(Stack Frame)이라고 한다 이때 함수마다 프레임의 크기는 다르기 때문에 함수 호출이 끝난 후, 해당 함수가 돌아가기 위해서는 바로 이전 프레임의 포인터 값을 가지고 있어야 함. 이러한 정보는 레지스터에 담아 저장해놓는데 이 레지스터들은 EBP, ESP가 있다. EBP(Extended..
개발시작 : 2024.01.08~ 장르 : 익스트랙션 RPG - Dark and Darker 류 서버 : IOCP 개발 플랫폼 : WinAPI 사용 구현해야 할 기능 : 랜덤 맵 생성, 아이템 DB 연동, 자체 스프라이트 작성 툴 등