기본 콘텐츠로 건너뛰기

2013의 게시물 표시

네트워크 프로그래밍에서의 blocking, non-blocking, syncronous, asyncronous

출처 -  http://devsw.tistory.com/142 TCP/IP 네트워크 프로그래밍 책을 보다보면 봉쇄(blocking), 비봉쇄(non-blocking), 동기(syncronous), 비동기( asyncronous)에 대해서 나옵니다. 이 개념에 대해 자세히 알아보려 합니다. 소켓 프로그래밍에서의 blocking 소켓 프로그래밍 책을 보다보면 read, write 함수를 가장 쉽게 보게 됩니다. 리눅스에서 read, write는 소켓 프로그래밍에서 패킷을 보내거나 받을때 사용하는 함수입니다. 이 함수는 소켓이 blocking이냐 non-blocking이냐 에 따라 작동방식이 살짝 다릅니다. 소켓이 blocking일 경우 Server 가 Client의 메시지 요청을 받기 위해 read에서 기다릴 수가 있습니다. Client가 write하기 전에는 read에서 빠져나오지를 못하는 것이지요.  Blocking I/O 모델에서의 작동 방식 : 어플리케이션(프로그램)에서 recvfrom(read)를 호출 할 때, 커널은 데이터가 들어올 때까지 봉쇄(blocking)을 시킨다. 데이터가 들어오면 recvfrom(read)함수는 return이 되고, 프로그램 흐름은 어플리케이션(프로그램)으로 돌아온다. 소켓 프로그래밍에서의 non-blocking 위와 같이 blocking형태의 프로그래밍을 하다보면 서버 프로그램 입장에서는 여러 클라이언트의 처리가 어렵습니다. 그래서 나온 방법이 클라이언트 접속 별로 쓰레드를 생성하여 클라이언트별 read 함수를 호출 하는 것인데, 하지만 이 방법도 대규모 처리를 하기 위해서는 context switching에 발생하는 비용이 만만치 않아 프로그램의 성능을 떨어뜨립니다. 이러한 방법을 피할 수 있는 방법이 비봉쇄(non-blocking) 방법입니다. non-blocking은 위의 그림처럼 시스템함수 호출 후 멈출 필요가 없습니다. 읽을 데이터가 있으면 읽고, 없으면 넘어가게 되는 방법입니다. Non

UNIX C errno 정리( 에러 번호 )

#define EPERM   1   /* Operation not permitted      */ #define ENOENT  2   /* No such file or directory        */ #define ESRCH   3   /* No such process          */ #define EINTR   4   /* interrupted system call      */ #define EIO 5   /* I/O error                */ #define ENXIO   6   /* No such device or address        */ #define E2BIG   7   /* Arg list too long            */ #define ENOEXEC 8   /* Exec format error            */ #define EBADF   9   /* Bad file descriptor          */ #define ECHILD  10  /* No child processes           */ #define EAGAIN  11  /* Resource temporarily unavailable */ #define ENOMEM  12  /* Not enough space         */ #define EACCES  13  /* Permission denied            */ #define EFAULT  14  /* Bad address              */ #define ENOTBLK 15  /* Block device required        */ #define EBUSY   16  /* Resource busy            */ #define EEXIST  17  /* File exists              */ #define EXDEV   18  /* Improper link            */ #define ENODEV  19  /* No such

[C언어] pthread 함수정리

출처 -  http://tasia.tistory.com/entry/C%EC%96%B8%EC%96%B4-pthread-%ED%95%A8%EC%88%98%EC%A0%95%EB%A6%AC pthread를 써야하는 이유는 단일 프로세서에서는 동시에 여러 작업을 하는 것처럼 유저에게 보여야하는 일이 있는데 간단한 예로 테트리스 게임같이 블록이 일정시간마다 자동적으로 내려가도록 하는 부분과 키 입력을 받을 때만 블록을 입력받은 방향으로 이동시키는 부분등... 이걸 멀티 쓰레드로 만들지 않는다면 아마 프로그래밍이 상당히 복잡해지고 구현하는데도 상당히 어려울 것이다. 이를 쉽게 처리하기위해서 pthread API 함수를 이용하여 쉽게 구현할 수 있다. pthread API 함수를 쓰기 위해서 pthread.h 파일을 include 해야만 한다. #include <pthread.h>   그리고 필히 컴파일시  -lpthread  옵션 추가해주어야만 한다. 빠뜨리면 컴파일 오류가 일어나거나 아니면 쓰레드가 정상 작동하지 않을 것이다. pthread_t : pthread의 자료형을 의미 int pthread_create( pthread_t *th_id, const pthread_attr_t *attr, void* 함수명, void *arg );  - pthread 생성한다. 첫 번째 인자 : pthread 식별자로 thread가 성공적으로 생성되면 thread 식별값이 주어진다. 두 번째 인자 : pthread 속성(옵션), 기본적인 thread 속성을 사용할 경우 NULL 세 번째 인자 : pthread로 분기할 함수. 반환값이 void* 타입이고 매개변수도 void* 으로 선언된 함수만 가능하다. ex) void* handler (void* arg) { ... } 네 번째 인자 : 분기할 함수로 넘겨줄 인자값. 어떤 자료형을 넘겨줄 지 모르기 때문에 void형으로 넘겨주고 상황에 맞게 분기하는 함수내에서 원래의 자료형으로 캐스팅해서 사용하면 된다. 리턴 값

[C언어] select / poll / epoll example

* select() #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout); FD_SET(int fd, fd_set *set); // fd를 set(검사대상)에 추가 FD_CLR(int fd, fd_set *set); // fd를 set에서 제거 FD_ZERO(fd_set *set);// set에 지정된 모든 대상 제거,select호출 전 항상 호출함 FD_ISSET(int fd, fd_set *set); //select()호출 후 fd가 사용 가능한지 확인 return bool ex) struct timeval tv; fd_set readfds; int ret; FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); tv.tv_sec = 0; tv.tv_use = 500; ret = select (STDIN_FILENO + 1, &readfds, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &readfds)){ /* 'fd' is readable without blocking! */ } * poll() #include <sys/poll.h> int poll (struct pollfd *fds, unsigned int nfds, int timeout); struct pollfd { int fd; /* file descriptor */ short events; /* requested events to watch */ short rev

[C언어] epoll 설명

출처 -  http://biscuit.cafe24.com/moniwiki/wiki.php/epoll 1  준비 2  socket 프로그래밍 기본 3  비동기 입출력 (Asyncronous I/O) & 입출력 다중화 (I/O Multiplexing) 4  select 5  select 와  poll  그리고 epoll. 그 차이 6  epoll 프로그래밍 흐름 7  epoll 함수들 8  epoll References 빈폴도 아니고, 이폴이란 대체 무엇일까? 당신은 서버한대로 몇 명의 동시접속자를 수용할 수 있습니까? 최근에 인터넷에 떠돌아다니는  c10k_problem 은 대당 10K, 즉 1만명의 동시접속(concurrent users)을 받아보자는 문제다. 서버 프로그래밍을 해 본 사람이라면 이게 그리 만만한 문제가 아니라는 것을 직감할 듯 --; 요즘의 Massive 온라인게임은 '분산처리'가 기본이라 한 대에서 많은 이용자를 커버하기보다는 여러대가 하나의 세트로써 구성하는 것이 인기가 있고 다수의 커넥션보다는 소수 커넥션에서의 대용량 전송이 더 중요한 요소이기도 하다. c10k problem에 나또한 관심을 가지게 되었고, epoll 이 최근 급부상하는 솔루션으로 인기가 있다기에 한 번 파보자 하고 결심하고 이 글을 시작했다. 마침 wiki에도 관심이 있던 차라, wiki 공부도 할 겸해서 epoll 을 연구하는 과정을 이 wiki에 담아 보고자 한다. 1  준비  # * 누구를 위한 epoll 인가? epoll은 '한 대의 서버에서 아주많은 동시접속자를 처리하기 위한 수단'이다. 이미 당신이 그 수단을 알고 있다면 - epoll 이건 아니건 - 이 글은 별로 도움이 안될듯하다. 동시접속자가 천명을 넘지않는다면 구닥다리 방법을 이용하는 것과 큰 차이가 없으리라 본다. 또한, epoll은  Linux 프로그래머의 도구 이다. M$ wind