no image
TCP 클라이언트의 비정상 종료
1. 유령(좀비) 세션이란?서버에 연결된 클라이언트 세션이 네트워크 단절되었는데도 제대로 연결해제가 되지 않아서 그대로 남아있는 상태를 유령세션이라고 한다.(보통 렌선이 뽑혔다거나, 방화벽에서 일부러 세션을 종료시켰다거나.)제대로 접속해제가 되지 않았기 때문에 또는 접속해제에 대한 감지가 이루어지지 않았기 때문에, 할당된 리소스등이 해제되지 않고, 재접속시 문제를 일으킬 수 있다. 리니지 랜선버그가 유령세션 때문에 발생한 버그 사례이다.  2. 유령 세션은 왜 생기는 걸까?  LISTEN : 응담 대기상태 ESTANLISHED : 상호 연결상태 TCP 상태 다이어그램을 참고하면서 일반적인 연결 해제 과정을 살펴보자. 우선 여기서 사용하는 클라이언트와 서버라는 이름은 실제 게임 서버나 클라이언트의 의미가 ..
2024.09.28
no image
소켓 버퍼
소켓은 각각 송신 버퍼(send buffer)와 수신 버퍼(recv buffer)를 하나씩 가지고 있다.버퍼의 크기는 보통은 8kb 가 기본 크기이다. (OS 버전마다 달라질수 있다.)setsockopt 함수를 통해 크기를 변경해줄 수 있다. 송신 버퍼(Send Buffer)송신 버퍼는 큐와 마찬가지로 FIFO 형태로 작동한다.send(data)를 호출하면 data는 일단 송신 버퍼에 채워진다.송신 버퍼에 채워진 data는 잠시 후 통신 선로를 통해 점차적으로 빠져나간다.따라서 송신 버퍼는 뭔가가 채워지더라도 곧 빈 상태가 된다. 수신 버퍼(Receive Buffer)수신 버퍼 안에 데이터가 수신되는 것이 있을 때마다 계속되서 채워진다.수신 버퍼를 방치하게 되면 결국 꽉 차게 되고, 꽉 차게 되면 더 이..
2024.09.26
no image
메모리 단편화
메모리 단편화란RAM에서 공간이 작은 조각으로 나누어져 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 말한다.메모리 단편화에는 내부 단편화와 외부 단편화가 있다. 내부 단편화(Internal Frammentation)메모리를 할당할 때 프로세스의 메모리가 필요한 양보다 더 많이 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 현상이다.운영체제가 프로세스에 30mb를 할당 해줬을 때, 사실상 20mb만 사용하고 있을 경우 내부 단편화가 10mb만큼 발생한 것.외부 단편화(External Fragmentation)프로세스들의 메모리를 할당하고 난 다음 아주 작은 크기로 남은 조각들이 생겨 사용할 수 없는 작은 메모리 공간들이 생길수 있는데, 이 공간들을 합쳐서 새로운 프로세스가 요구..
2024.09.25
no image
컨텍스트 스위칭(iocp 스레드)
1.컨텍스트 스위칭(Context Switching) 이란?컨텍스트 스위칭이란, 'CPU/코어에서 실행 중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것' 이다.기본적으로 1개의 프로세스는 1개의 스레드를 가진다. 왜냐면 스레드가 CPU/코어에서 실행되는 기본 단위이기 때문이다. 프로세스가 다른 프로세스로 교체 된다는 것은, 프로세스 안에 실행되는 스레드가 다른 프로세스 안의 스레드로 바뀐다는 말이다.여기서 말하는 컨텍스트란 프로세스/스레드의 상태를 의미합니다. 또 이 상태라는 것은 CPU, 메모리에서의 상태를 의미한다. 2. 컨텍스트 스위칭이 필요한 이유?여러 프로세스와 스레드들을 동시에 실행시키기 위해(그렇게 보이기 위해)여러 프로세스와 스레드들이 공정하게 CPU 시간을 나눠 갖기 위해높은..
2024.09.19
no image
Send,Recv Buffer
SendBuffer 구조 Buffer에 만들려는 패킷의 크기만큼  SendBufferManager::Open을 통해 원하는 크기의 SendBuffer의 Buffer를 가져온다. SendBuffer의 Buffer는 오브젝트 풀에서 생성될 때 SendBufferChunk의 Buffer로 초기화 된다.(SendBuffer의 _buffer == SendBufferChunk의 _buffer)(xarray_buffer = {}; 에서 _usedSize 부터 시작하는 주소를 반환.) 가져온 SendBuffer의 Buffer의 메모리 공간을 PacketHeader로 캐스팅해서 패킷헤더로 만들어준다.그리고 패킷헤더의 다음 주소는 직렬화된 패킷의 데이터를 저장한다. SendBuffer의 Buffer에 패킷의 정보가 만들어..
2024.09.09
no image
1156. Swap For Longest Repeated Character Substring
문제)문자열 text가 주어집니다. 이 문자열에서 두 문자의 위치를 바꿀 수 있습니다.이때, 같은 문자가 반복되는 가장 긴 부분 문자열의 길이를 반환하세요.즉, 문자열에서 두 문자를 교환한 후에 동일한 문자가 연속으로 반복되는 가장 긴 부분 문자열을 찾아 그 길이를 반환하는 문제입니다. 문제 난이도 : 중 소요시간 및 풀이)슬라이딩 윈도우 알고리즘으로 풀려고 시도했으나 풀지 못하였다.다른 사람의 코드를 보고 해결하였다. a~z까지의 각 문자를 후보로 설정하고, 슬라이딩 윈도우를 통해 해당 문자가 포함된 가장 긴 부분 문자열을 계산한다.현재 문자가 ch와 다르면 gap을 증가.이는 현재 부분 문자열에 포함된 다른 문자의 수를 나타냄. 그리고 gap이 1보다 크면, 즉 현재 부분 문자열에 두 개 이상의 ch..
2024.09.05
no image
투포인터 알고리즘, 슬라이딩 윈도우 알고리즘, 구간합 알고리즘
투 포인터와 슬라이딩 윈도우 알고리즘은 선형 공간(1차원 배열)을 2회 이상 반복적으로 탐색해야 할 경우 O(N^2) 이상 걸릴 시간 복잡도를 부분 배열을 활용하여 O(N)으로 줄일 수 있다는 공통점이 있다. 그렇다면 이 두 알고리즘의 차이점은 무엇까? 바로, 부분 배열 길이의 변화 여부이다.더 쉽게 말해서, 투 포인터 알고리즘은 부분 배열의 길이가 가변적이지만 슬리이딩 윈도우 알고리즘은 부분 배열의 길이가 고정적이다.투 포인터 알고리즘어떤 특정 조건을 만족하는 연속되고 가변적인 구간을 구할 때 O(N) 으로 풀 수 있도록 도와주는 알고리즘. 2개의 포인터를 사용하여 구간의 길이를 가변적으로 잡아가며 특정 조건을 만족하는 구간을 찾는다.모든 연속 구간을 잡는다면 O(N^2)이 될 것이지만 투 포인터 알고..
2024.09.05
no image
970. Powerful Integers
문제)세 정수 x, y, bound가 주어집니다.bound 이하의 값 중에서 강력한 정수를 모두 찾아 리스트로 반환하세요.강력한 정수란, 어떤 정수 i와 j에 대해 x^i + y^j 형태로 나타낼 수 있는 정수를 말합니다.여기서 i >= 0 그리고 j >= 0입니다.정답은 어떤 순서로든 반환할 수 있으며, 리스트에는 중복된 값이 포함되지 않아야 합니다. 문제 난이도 : 중 소요시간 및 풀이)간단하게 제곱해준값을 비교해가면서 풀었다.이 과정에서 예외처리를 제대로 해주지 않아서 시간초과가 발생했다.중복을 허용하지 않기 위해 set사용하였다. 소요 시간 : 28분 정답 코드class Solution {public: vector powerfulIntegers(int x, int y, int bound) ..
2024.09.05
no image
62. Unique Paths
문제)다음과 같은 문제 상황이 주어졌습니다:로봇이 m x n 크기의 격자(grid) 위에 있습니다.로봇은 처음에 왼쪽 상단 모서리(grid[0][0])에 위치해 있으며, 오른쪽 하단 모서리(grid[m - 1][n - 1])로 이동하려고 합니다. 이때, 로봇은 오직 아래쪽이나 오른쪽으로만 이동할 수 있습니다.두 정수 m과 n이 주어졌을 때, 로봇이 오른쪽 하단 모서리까지 도달하는 데 사용할 수 있는 고유한 경로의 수를 반환하세요.테스트 케이스는 결과가 2 * 10^9 이하가 되도록 생성됩니다. 문제 난이도 : 중 소요시간 및 풀이)dp를 이용해서 풀었다.감이 잘 안잡히던 dp 알고리즘에 대해서 어느정도 이해가 가기 시작했다. 예를 들어 1,1의 목표 지점까지 가기 위해서는 반드시 0,1 또는 1,0을 거..
2024.09.04