Computer Science 기본 지식/소켓 프로그래밍 29

[TCP/IP 소켓 프로그래밍] (15) 비동기 모델 Asynchronous Notification IO

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 동기화된 입출력 함수의 동작 방식 전송 : send가 호출되는 순간 출력 버퍼로 데이터 쓰기가 시작되고 데이터 쓰기가 완료되면 send 함수가 반환된다. 수신 : recv가 호출되는 순간 입력 버퍼로 데이터를 읽기가 시작되고 데이터 읽기가 완료되면 recv 함수가 반환된다. select 함수는 대표적인 동기적 Notification 모델의 예로 관찰대상의 파일 디스크립터 중 하나라도 변화가 있을 시 반환하는 함수이기 때문이다. 즉, IO가 필요한 상황이 알림이 되는 시점이 함수가 반환되는 시점과 일치한다. 동기화된 "입출력"의 단점 입출력이 진행되는 동안 호출된 함수가 반환을 하지 않으니, 다른 일을 할 수가 없다. 비동기적 입출력 함수의 동작 방식 ..

[TCP/IP 소켓 프로그래밍] (14) 쓰레드 동기화 (윈도우)

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 유저 모드와 커널 모드 유저 모드: 응용 프로그램이 실행되는 기본 모드, 하드웨어 접근이 제한되고 사용할 수 있는 메모리 공간에도 제약이 있다. 커널 모드: 운영체제가 실행될 때의 모드, 메모리, 하드웨어 접근에 제약이 없다. 운영체제는 일반 프로그램이 실행되는 모드는 유저 모드로 두어 컴퓨터 자원을 보호한다. 쓰레드와 같은 운영체제 자원을 생성할 시 유저 모드에서 커널 모드의 변환이 필요하며 생성된 쓰레드를 다시 커널모드에서 유저 모드로 전환하여 전달한다. 쓰레드 동기화, 유저 모드 vs 커널 모드 유저 모드에서 사용하는 동기화 기법은 운영체제의 힘을 빌리지 않기 때문에 빠르다. 커널 모드에서 사요하는 동기화 기법은 운영체제의 힘을 빌리기 떄문에 비..

[TCP/IP 소켓 프로그래밍] (13) 커널 오브젝트 (윈도우)

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 커널 오브젝트란? 윈도우 운영체제가 생성해서 관리하는 모든 리소스 파일 데이터의 입출력, 스레드, 프로세스등 윈도우에서 운영체제가 관리하기 위해 리소스 정보를 위한 데이터 블록을 생성하고 관리하도록 한다. 이러한 데이터 블록을 '커널 오브젝트'라하며 리소스마다 관리되는 정보량이 다르기 때문에 데이터 블록의 크기도 각각 다르다. 커널 오브젝트의 소유자는 운영체제이며, 생성, 관리 그리고 소멸시점까지 결정하는 것은 모두 운영체제의 몫이다. 윈도우기반의 스레드 생성 main 함수가 프로그램의 시작이 되는 프로그램에서 main 함수를 호출하는 주체는 스레드이다. 예전 운영체제 시스템에서는 프로세스가 실행 흐름의 최소 단위였던 적이 있었으나 현대 운영체제에서는..

[TCP/IP 소켓 프로그래밍] (12) 다중 접속 서버 - 쓰레드

멀티 프로세스 기반 서버의 단점 새로운 클라이언트가 연결될 때마다 프로세스를 생성하는 것은 기존 프로세스의 메모리를 복사하는 것으로 비용이 크다. 두 프로세스간 통신을 위해 IPC라는 방법을 사용해야한다. 결정적으로 CPU 사용 시간을 나누어 사용하기 때문에 두 프로세스 간 문맥 교환이 일어난다. 프로세스 문맥 교환은 한 프로세스를 메인 메모리에서 내리고 다른 프로세스를 메인 메모리로 올리기 때문에 시간이 오래 걸리게 된다. 쓰레드란 쓰레드는 프로세스를 구성하는 실행 흐름으로 단위가 작다. 프로세스는 독립적인 메모리공간을 사용하기 때문에 데이터, 스택, 힙의 영역을 각 프로세스마다 독립적으로 갖는다. 쓰레드는 프로세스의 일부분으로 한 프로세스 내 여러 쓰레드는 프로세스 메모리 공간을 공유할 수 있다. 데..

[TCP/IP 소켓 프로그래밍] (11-2) 다중 접속 서버 - 레벨 트리거/엣지 트리거

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 epoll 기반 이벤트 발생 이벤트 발생 감지(트리거)에 대한 기준을 두가지로 변경할 수 있다. 1. 레벨 트리거: 입력버퍼에 데이터가 남아있는 동안에 계속해서 이벤트가 등록된다. 2. 엣지 트리거: 입력버퍼에 데이터가 처음 수신될 때 이벤트가 등록된다. 기본 트리거 방식은 레벨 트리거이다. - 엣지 트리거 설정 struct epoll_event; event.events = EPOLLIN(수신 데이터 감지) | EPOLLET(엣지 트리거); - 소켓 속성 변경 엣지 트리거 방식의 특성상 블로킹 방식으로 동작하는 read & write 함수의 호출은 서버를 오랜 시간 멈추는 상황으로 이어질 수 있다. 엣지 트리거 방식에서는 소켓을 논블로킹 모드에서 re..

[TCP/IP 소켓 프로그래밍] (11-1) 다중 접속 서버 - epoll

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 Epoll --- select 기반의 멀티 플렉싱 서버가 느릴 수 있는 이유 1. select 함수 호출 이전에 모든 관찰 대상을 초기화하여 전달해야 한다. char buf[BUF_SIZE]; int fd_max = serv_sock, fd_num; struct timeval timeout; while(1) { // 관찰 대상 초기화 cpy_reads = reads; timeout.tv_sec = 5; timeout.tv_usec = 5000; // ... select 호출 } 2. select 함수 호출 이후 모든 관찰 대상에 대해 반복문을 통해 어떤 관찰 대상이 변했는지 체크하고 그에 따른 처리를 해줘야 한다. // 모든 관찰 대상을 체크 for(..

[TCP/IP 소켓 프로그래밍] (10) 멀티 캐스트와 브로드 캐스트

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 멀티 캐스트 방식의 데이터 전송 UDP 기반 데이터 전송으로 특정 멀티 캐스트용 IP 그룹에 속해있는 다수의 호스트로 데이터를 전송할 수 있다. 멀티 캐스트 방식을 이용하면 단 한번에 데이터 전송으로 다수의 호스트에게 데이터를 전송할 수 있다. 멀티캐스트의 데이터 전송방식과 멀티캐스트 트래픽 이점 멀티캐스트 서버는 특정 멀티캐스트 그룹을 대상으로 데이터를 딱 한번 전송한다. 한번 전송하더라도 그룹에 속하는 클라이언트는 모두 데이터를 수신한다. 멀티캐스트 그룹의 수는 IP 주소 범위 내에서 얼마든지 추가 가능하다. 특정 멀티캐스트 그룹으로 전송되는 데이터를 수신하려면 해당 그룹에 가입하면 된다. 멀티캐스트 그룹이란 IP주소의 D 클래스 범주에 속하는 주..

[TCP/IP 소켓 프로그래밍] (9) TCP 긴급 메세지

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 Linux에서 read/write 함수외에 윈도우에도 존재하는 send와 recv함수를 사용할 수 있다. - send 함수 ssize_t send(int sockfd, const void* buf, size_t nbytes, int flags); - recv 함수 ssize_t recv(int sockfd, void* buf, size_t nbytes, int flags); read/write와의 차이점은 소켓 옵션을 flags로 전달가능한데, 사용가능한 옵션의 예는 다음과 같이 있다. MSG_OOB: 긴급 데이터(Out-of-band data)의 전송을 위한 옵션 MSG_PEEK: 입력 버퍼에 수신된 데이터의 존재 유무를 확인을 위한 옵션 MSG_D..

[TCP/IP 소켓 프로그래밍] (8) 다중 접속 서버 - 멀티 플렉싱 기반 select 서버

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 멀티 프로세스 기반 서버의 단점 프로세스를 복사할 때마다 비용이 들고 독립적인 메모리로 상호간 데이터를 주고 받기 위해서는 Pipe라는 운영체제 자원을 사용해야한다. 다수의 프로세스를 생성하지 않으면서 클라이언트에게 서비스를 할 수 있는 방법 중 "멀티 플렉싱" 기술을 사용하면 다중 사용자에게 하나의 프로세스에서 서비스를 제공할 수 있다. 멀티 플렉싱 하나의 통신 채널을 통해 둘 이상의 데이터를 전송하는데 사용하는 기술 select 함수의 기능과 호출 순서 멀티 플렉싱 기술에서 여러 소켓/파일 디스크립터를 동시에 관찰하기 위해 사용하는 함수, select가 있다. select 함수는 1. 수신한 데이터를 지니고 있는 소켓이 있는가 2. 블로킹 되지 않..

[TCP/IP 소켓 프로그래밍] (7-3) 다중 접속 서버 - 프로세스 간 통신 IPC

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 fork로 복제된 자식 프로세스는 부모 프로세스와 완전히 독립적인 메모리 공간을 가지고 있기 때문에 자료를 공유할 수 있는 방법이 쉽지 않다. PIPE 따라서 프로세스 간 자원을 주고 받기 위해서는 파이프라는 것을 생성해야한다. 파이프는 운영체제 자원으로 통신을 위한 메모리 공간을 가진다. 두 프로세스는 파이프의 메모리를 통해 자원을 주고 받을 수 있다. - 운영체제 지원이 필요한 이유 두 프로세스는 메모리를 공유하지 않으므로, 즉 공유 공간이 없으므로 두 프로세스가 동시에 접근 가능한 메모리 영역을 할당하기 위해 운영체제의 도움이 필요하다. int pipe(int filedes[2]); 성공 시 0, 실패 시 -1 반환 filedes[0] 파이프로부..