Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

브래의 슬기로운 코딩 생활

네트워크 보안 12주차 정리 -1 (Multiplex 서버- select 기법) 본문

2-2/네트워크 보안

네트워크 보안 12주차 정리 -1 (Multiplex 서버- select 기법)

김브래 2023. 11. 21. 21:26

Multiplex 서버
- select 기법 -


다중 접속 서버


멀티플렉싱(Multiplexing)

데이터를 처리하는데 있어서 하나의 프로세스가 동시에 여러 개의 동작을 수행

 

블록킹(blocking) 현상 방지

 

종류:
• 시간 분할(TDM: Time Division Multiplexing)
– 시간을 슬롯(slot)이라는 개념으로 분류
– 슬롯의 크기만큼 각 주어진 일을 처리
– 대표적 예: select, poll 기법

 

• 이벤트 분할(EDM: Event Division Multiplexing)
– 외부의 신호를 인식하여 그 신호에 등록된 일을 처리
– 주로 입/출력 처리에 선호
– 대표적 예: 인터럽트

멀티플렉스 서버 Vs. 멀티프로세스 서버

멀티프로세스 방식
• 클라이언트의 개수에 따라 독립적인 프로세스가 생성되어야 함
• 비교적 구현이 단순
• 서버 내에서 데이터 공유를 위해서는 공유메모리 등의 기법을 추가로 적용
• 대표적 기술: 포크(fork)와 스레드(thread) 방식

멀티플렉스 방식
• 클라이언트의 개수에 관계없이 하나의 프로세스로 실행
• 대표적 기술: select와 poll 방식


Select 기법


Select 기법

최대 1,024개의 파일기술자에 대한 입력/출력/예외를 모니터링
• 단, 파일기술자의 최대 크기는 1,024보다 클 수 없음

 

마이크로초(μs, microsecond: 10-6 sec.) 단위의 모니터링 주기 설정 가능

 

관련 함수 및 매크로:
• select() : select 기법 처리 함수
• FD_CLR() : 값 초기화 함수
• FD_ISSET() : 이벤트 점검 함수
• FD_SET() : 값 설정 함수
• FD_ZERO() : 초기화 함수
• FD_SETSIZE : 1024 값(상수)

 

관련 함수의 기능과 호출순서

검사할 FD(파일 기술자) 설정
• 검사할 FD가 저장되는 fd_set 구조체 변수를 (예: fds) 선언
• FD_ZERO()를 이용하여 fds 변수 초기화
• FD_SET()를 이용하여 검사할 FD 설정

 

타임 아웃 설정
• timeval 구조체 변수 tm을 선언
• 타임아웃 시간을 입력

 

select() 함수 호출
• 타임 아웃 동안 검사할 FD들의 이벤트를 모니터링
• 타임아웃 동안 이벤트가 없으면 0을 반환
• 이벤트가 발생하면 해당되는 FD를 fds에 등록

 

결과 확인
• FD_ISSET()을 이용하여 검사할 FD에 이벤트 상태를 검사

fd_set 구조체

select() 함수는 fd_set 구조체 변수(예: fd_set fds)에 등록된 FD들을 검사
FD의 값을 fds의 오프셋(offset)으로 활용
fd_set 구조체는 1024개의 FD를 등재할 수 있는 크기를 가짐
fd_set 구조체 변수에 FD(파일 기술자)의 설정은 FD_ZERO(), FD_SET(), FD_CLR()에 의해 이루어짐

fd_set 구조체 변수 설정 함수

함수: FD_ZERO()
• 변수의 모든 비트를 0으로 설정

 

함수: FD_SET()
• 해당 FD 오프셋의 값을 1로 설정

 

함수: FD_CLR()
• 해당 FD 오프셋의 값을 0으로 설정

타임 아웃

select() 함수는 주어진 시간(timeout) 동안 등재된 FD들을 모니터링함
• 시간은 마이크로초(μs) 단위로 설정 가능
• 이벤트가 감지되면, timeout의 값을 갱신
• 단, 운영체제의 스케줄 정책에 따른 실시간성(real time)은 제공하지 않음

 

select()함수의 timeout 파라미터의 값에 따라 동작이 다름
• NULL : 이벤트가 있을 때까지 대기(blocking)
• timeout={tv_sec=0, tv_usec=0} : 대기하지 않음
• 그 외 : 주어진 값 동안 기다림(일반적인 설정)

select() 함수내 timeout값 처리

I/O 상태 모니터링

 

함수: select()
• 설정된 FD들에 대하여 timeout 동안 상태를 감시
• 해당 FD에 이벤트가 있으면 관련 비트를 1로 설정

 

• 인자:
– nfds : FD의 최대값(모를 시: FD_SETSIZE)
– *readfds : 입력 감시용 FD들
– *writefds : 출력 감시용 FD들(사용빈도 낮음)
– *exceptfds : 예외 처리 감시용 FD들(사용빈도 낮음)

 

• 결과 값:
– 0 : 아무런 이벤트가 없음(타임아웃 발생)
– -1: 에러
– 양수: 이벤트 개수

모니터링 결과 확인

함수: FD_ISSET()
• 해당 FD 오프셋의 값이 1로 되어있는지 확인

 

• 인자:
– fd : 점검할 FD
– *set : select()에 의한 결과물

 

• 결과 값:
– 1 : 이벤트 발생
– 0 : 이벤트 없음