2016년 5월 23일 월요일

뇌자극 TCP_IP 프로그래밍 13강 요약

1. 입출력 다중화란?

입출력 다중화 기술은 여러개의 입력과 출력을 관리하는 기술이다.
입출력 대상은 파일이므로 여러 파일의 입출력을 다룰 수 있다

1) 입출력을 관리하고자 하는 파일 지정번호의 그룹을 만든다.
2)관리 파일 그룹에 있는 파일 중 읽을 데이터가 있는 파일이 있는지를 확인해서 반환한다.
   운영체제는 관리 파일 그룹에 있는 파일에 데이터 변화가 발생하면 이를 체크 한다
3)만약 읽을 데이터가 있는 파일이 있다면 읽기 함수로 데이터를 읽어서 처리한다
4)처리 후에는 2번으로 이동해서 2~4를 반복 수행한다.

2. select 함수로 입출력 다중화 구현

select 함수는 여러 파일 중 어떤 파일에 데이터 변화가 생겼는지를 알려줘서,
작업할 파일을 선택할 수 있도록 해준다.

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int select(int nfds, fd_set *readfds, fd_set *writefds,
                   fd_set *exceptfds, struct timeval *timeout);

nfds : select 함수는 파일의 그룹을 관리한다. 그룹이 몇 개의 파일을 포함하는지 알려준다.
readfds : 읽을 데이터가 있는지 검사
writefds : 쓸 데이터가 있는지 검사
exceptfds : 비트 테이블의 크기 최대 1024비트의 크기를 가진다.
timeout : 입출력 변화가 있을 때까지 기다리는데 제한 시간을 지정할 수 있다.
             NULL 이면 데이터 변화가 있을 때 까지 무한정 기다린다.

fd_set 관리를 위한 매크로 함수

select 함수의 핵심은 fd_set 관리에 있다. 1024비트 크기의 비트 필드로 파일 플래그 정보를 저장한다. 몇 가지 매크로 함수가 제공된다.

1) FD_ZERO(fd_set *fds) : fd_set를 초기화 한다. 모든 프래그 값을 0으로 만든다.
2) FD_SET(int fdnum, *fds) : 파일 지정번호 fdnum을 관리 위해서 fd_set에 추가한다.
                           select 함수는 이 파일에 데이터 변화가 생기면 플래그를 1로 한다.
3) FD_ISSET(fdnum, *fds) : fds에 포함된 fdnum 파일에 데이터 변화가 있는지 확인한다.
4) FD_CLR(fdnum, *fds) : fds 에서 fdnum을 제외한다.
       클라이언트가 연결 종료를 해서 더 이상 관리할 필요가 없는 경우에 주로 사용한다.

3. 소켓 프로그래밍과 입출력 다중화의 결합

프로그램 시나리오

1) socket 함수 호출
2) bind 함수 호출
3) listen 함수 호출
4) socket 함수로 만든 듣기 소켓을 fd_set에 추가한다.
5) select 함수를 호출한다.
6) 듣기 소켓 혹은 연결 소켓에 읽을 데이터가 들어오면 select 함수는 반환한다
7) FD_SET 매크로 함수로 어느 소켓에 읽을 데이터가 있는지 확인한다.
  - 듣기 소켓에 읽을 데이터가 있다면, accept 함수를 호출해서 클라이언트와 연결한다.
     이때 만들어진 연결 소켓은 fd_set에 추가한다.
  - 연결 소켓에 읽을 데이터가 있다면 read 함수로 데이터를 읽어서 처리한다.
8) 5번으로 되돌아간다.

4. 입출력 다중화의 특징과 적용처

입출력 다중화는 프로세스나 스레드를 만들지 않고도 여러 소켓을 처리할 수 있다.
IPC를 사용할 필요도 없고 동기화를 위해 고민할 필요도 없다.

그러나 동시 실행이 아니기 때문에 이에 따르는 제약도 있다.
데이터를 읽어서 처리하고 응답하는데 많은 시간이 걸리는 서비스에는 적당하지 않다.
그 시간 동안 다른 입출력은 대기하기 때문이다.
입출력 다중화를 활용하기에 가장 좋은 서비스는 채팅 서비스 같은 메시지 전달 서비스다.

소스 코드 받기

댓글 없음:

댓글 쓰기