본문 바로가기

컴퓨터61

select 와 epoll selectI/O 통지모델의 할아버지 select select는 싱글쓰레드로 다중 I/O를 처리하는 멀티플렉싱 통지모델의 가장 대표적인 방법이다. 해당 파일 디스크립터가 I/O를 할 준비가 되었는지 알 수 있다면, 그 파일 디스크립터가 할당받은 커널Buffer에 데이터를 복사해주기만 하면된다. 이런 목적하에 통지모델은 파일디스크립터의 상황을 파악할 수 있게 하는 기능을 할 수 있어야한다. select는 많은 파일 디스크립터들을 한꺼번에 관찰하는 FD_SET 구조체를 사용하여 빠르고 간편하게 유저에게 파일 디스크립터의 상황을 알려준다. FD_SETFD_SET은 하나의 FD(파일 디스크립터)의 상태를 하나의 비트로 표현한다. 파일 디스크립터의 번호는 고유하기 때문에, 파일 디스크립터의 번호를 인덱스로하여 해.. 2015. 3. 28.
I/O 모델 : blocking, non-blocking, 동기, 비동기 Blocking / Non-Blocking BlockingI/O 작업은 유저레벨에서 직접 수행할 수 없다. 실제 I/O를 수행하는것은 커널레벨에서만 가능하다. 따라서 유저 프로세스(또는 쓰레드)는 커널에게 I/O를 요청해야한다. I/O에서 블로킹 형태의 작업은 유저 프로세스가 커널에게 I/O를 요청하는 함수를 호출하고, 커널이 작업을 완료되면 함수가 작업 결과를 반환한다. I/O 작업이 진행되는동안 유저 프로세스는 자신의 작업을 중단한채 대기해야한다. I/O작업이 CPU자원을 거의 쓰지 않기 때문에 이런 형태의 I/O는 리소스 낭비가 심하다.만약 여러 클라이언트가 접속하는 서버를 블로킹방식으로 구현한다고 가정해보자. I/O작업이 blocking 방식으로 구현되면 하나의 클라이언트가 I/O작업을 진행하면 .. 2015. 3. 27.
TCP의 연결 종료 TCP의 단절 감지 : 유령 세션 1. 유령 세션이란?서버에 연결된 클라이언트 세션이 네트워크 단절되었는데도 제대로 연결해제가 되지 않아서 그대로 남아있는 상태를 유령세션이라고 한다. 제대로 접속해제가 되지 않았기 때문에 또는 접속해제에 대한 감지가 이루어지지 않았기 때문에, 할당된 리소스등이 해제되지 않고, 재접속시 문제를 일으킬 수 있다. 리니지 랜선버그가 유령세션 때문에 발생한 버그 사례이다. 2. 유령 세션은 왜 생기는 걸까? TCP 상태 다이어그램을 참고하면서 일반적인 연결 해제 과정을 살펴보자. 우선 여기서 사용하는 클라이언트와 서버라는 이름은 실제 게임 서버나 클라이언트의 의미가 아니고, TCP에 참여하는 두 컴퓨터를 말한다. 먼저 종료를 시도하는 쪽을 부르기 편하게 클라이언트라 하고, 종료.. 2015. 3. 27.
네이글 알고리즘(Nagle Algoritm) 네이글 알고리즘 1. 네이글 알고리즘이란? IP 네트워크에서 데이터는 몇 곂의 헤더로 캡슐화되어 목적지로 보내진다. 이 헤더들의 용량도 제법 커서, 적은 데이터를 보내게되면 배보다 배꼽이 커지는 경우가 발생한다. 고의로 작은 단위의 데이터를 전송하는 경우도 있겠지만, 의도치 않게 네트워크 상황상 비효율적인 송신을 해야하는 경우가 있다. 예를 들면 전송해야될 데이터가 있는데, 상대방의 윈도우 크기(전송 받을 수 있는 크기)가 매우 작은 경우. 내가 의도한 바는 아니지만 보낼 수 있는 패킷의 크기 자체가 작기 때문에 따로 지연 설정을 하지 않으면, 작은 크기의 패킷이 만들어질 수 밖에 없다. 보낼 수 있는 데이터를 바로 패킷으로 만들지 않고, 가능한 모아서 더 큰 패킷으로 만들어 한번에 보내면 이런 문제는 .. 2015. 3. 27.