네트워크 IO 의 동기 화, 비동기, 차단, 비 차단 에 대하 여

높 은 병행 프로 그래 밍 에서 우 리 는 비동기, 비 차단 등 개념 을 자주 만 날 수 있다. 일부 자주 사용 하 는 기술, 예 를 들 어 비동기 httpclient, netty nio, nginx, node. js 등 이다. 그들의 원 리 는 대부분이 비동기, 비 차단 과 관련된다.특히 서버 개발 에서 동시 다발 적 인 요청 처 리 는 큰 문제 로 차단 식 함수 가 자원 낭비 와 시간 지연 을 초래 할 수 있다.이벤트 등록, 비동기 함 수 를 통 해 개발 자 는 자원 의 이 용 률 을 높 일 수 있 고 성능 도 개 선 될 것 이다.nginx 와 node. js 처리 병행 은 모두 이벤트 구동 비동기 비 차단 모드 를 사용 합 니 다.그 중에서 nginx 에서 처리 하고 병행 하 는 것 은 epoll, poll, quue 등 방식 입 니 다. node. js 는 libev 를 사용 합 니 다. 대규모 HTTP 요청 에 잘 처 리 됩 니 다.
그렇다면 도대체 무엇이 비동기, 비 차단 이 고 그들의 원 리 는 무엇 입 니까? 그들 사이 에는 어떤 차이 가 있 습 니까?사실은 많은 상황 에서 비동기 와 비 차단 (동기 화 와 차단) 은 같은 뜻 을 나타 내 지만 특정한 문맥 환경 에서 그들의 의 미 는 매우 다르다.그것들의 차 이 를 구체 적 으로 말 하기 전에 상하 문 배경 을 소개 합 니 다.
상하 문 배경
우리 가 만난 이 장면 들 은 대부분 사용자 프로 세 스 (또는 스 레 드) 가 네트워크 IO 를 진행 할 때 Socket 읽 기와 쓰 기 를 할 때 만 났 기 때문에 본 고 에서 토론 한 문맥 배경 은 Linux 환경 에서 의 network IO 를 바탕 으로 한다.그 중에서 우리 가 가장 흔히 볼 수 있 는 다섯 가지 IO 를 소개 합 니 다.
1.  blocking IO
2.  nonblocking IO
3.  IO multiplexing
4.  signal driven IO
5.  asynchronous IO

signal driven IO 는 실제 적 으로 자주 사용 되 지 않 기 때문에 나머지 네 가지 IO 모델 만 언급 합 니 다.
IO 발생 시 관련 된 대상 과 절 차 를 말씀 드 리 겠 습 니 다.하나의 network IO (여기 서 read 예 를 들 어) 에 대해 서 는 두 개의 시스템 대상 과 관련 될 것 입 니 다. 하 나 는 이 IO 를 호출 하 는 프로 세 스 (또는 스 레 드) 이 고 다른 하 나 는 시스템 커 널 (kernel) 입 니 다.read 작업 이 발생 하면 두 단 계 를 거 칩 니 다.
  • 대기 데이터 준비 (Waiting for the data to be ready)
  • 커 널 에서 프로 세 스 로 데 이 터 를 복사 합 니 다 (Copying the data from the kernel to the process)
  • 이 두 가 지 를 기억 하 는 것 은 매우 중요 하 다. 왜냐하면 이러한 IO 모델 의 차 이 는 두 단계 에서 각각 다른 상황 이 있 기 때문이다.
    각종 IO 소개
    2.1 blocking IO
    Liux 에서 기본 적 인 상황 에서 모든 socket 은 blocking 입 니 다. 즉, 우리 의 프로 세 스 가 IO 작업 을 할 때 데이터 가 도착 하지 않 으 면 이 프로 세 스 는 막 힌 것 입 니 다.전형 적 인 읽 기 작업 절 차 는 대략 이렇다.
    사용자 프로 세 스 가 recvfrom 시스템 호출 을 호출 했 을 때 kernel 은 IO 의 첫 번 째 단 계 를 시 작 했 습 니 다. 데 이 터 를 준비 합 니 다.network io 에 있어 데이터 가 처음에 도착 하지 않 은 경우 가 많 습 니 다. (예 를 들 어 완전한 UDP 패 키 지 를 받 지 못 했 습 니 다) 이 럴 때 kernel 은 충분 한 데 이 터 를 기 다 려 야 합 니 다.사용자 프로 세 스 쪽 에 서 는 전체 프로 세 스 가 막 힐 것 입 니 다.kernel 은 데이터 가 준 비 될 때 까지 기 다 렸 다가 kernel 에서 사용자 메모리 로 데 이 터 를 복사 한 다음 에 kernel 이 결 과 를 되 돌려 주 고 사용자 프로 세 스 는 block 상 태 를 해제 하고 다시 실 행 됩 니 다.그래서 blocking IO 의 특징 은 IO 에서 실 행 된 wait 와 copy 두 단계 가 모두 block 되 었 다 는 것 이다.
    이러한 block IO 의 경우 요청 한 연결 이 많 지만 대부분 차단 되 어 있 습 니 다.cpu 의 핵 수 는 제한 되 어 있 기 때문에 일반적인 해결 방안 은 cpu 마다 여러 개의 스 레 드 를 사용 하여 여러 개의 연결 을 처리 하 는 것 입 니 다.이런 해결 방안 은 매우 큰 결함 이 있다.
    1.          ,1       512K( 2M)   ,  1000     512M( 2G)  
    2.           ,                    ,               ,         CPU     
    3.   cpu            (        ),                      
    

    block IO 에 존재 하 는 문제점 을 해결 하기 위해 no - blocking IO 개념 을 도입 했다.
    2.2 non-blocking IO
    no - blocking IO 는 간단 합 니 다. socket 을 비 차단 모드 로 설정 합 니 다. 이 때 read 를 호출 할 때 데이터 가 준비 되면 데 이 터 를 되 돌려 줍 니 다. 데이터 가 준비 되 지 않 으 면 EWOULBLOCK 와 같은 오 류 를 즉시 되 돌려 줍 니 다.이렇게 하면 스 레 드 를 막 지 는 않 지만, 당신 은 계속 폴 링 을 해서 읽 거나 기록 해 야 합 니 다.non - blocking socket 에 읽 기 작업 을 수행 할 때 프로 세 스 는 이 모양 입 니 다. 그림 에서 보 듯 이 사용자 프로 세 스 가 read 작업 을 보 낼 때 kernel 의 데이터 가 준비 되 지 않 았 다 면 사용자 프로 세 스 를 차단 하지 않 고 바로 error 로 돌아 갑 니 다.사용자 프로 세 스 의 측면 에서 볼 때 read 작업 을 시작 한 후에 기다 릴 필요 가 없 이 바로 결 과 를 얻 었 습 니 다.사용자 프로 세 스 가 결 과 를 error 로 판단 할 때 데이터 가 아직 준비 되 지 않 았 다 는 것 을 알 기 때문에 read 작업 을 다시 보 낼 수 있 습 니 다.커 널 의 데이터 가 준비 되 고 사용자 프로 세 스 의 system call 을 다시 받 으 면 바로 데 이 터 를 사용자 메모리 에 복사 한 다음 되 돌려 줍 니 다.
    위 에서 소개 한 바 와 같이 blocking IO 의 특징 은 IO 가 실행 하 는 wait 단계 에서 차단 되 지 않 지만 copy 단 계 는 차단 되 어 있다 는 것 이다.
    그러나 no - blocking IO 에 도 큰 결함 이 존재 합 니 다. 즉, IO 스 레 드 는 끊임없이 문의 socket 으로 읽 거나 기록 해 야 하기 때문에 우 리 는 IO 다 중 재 활용 을 도입 하 였 습 니 다.
    2.3 IO 멀 티 플 렉 싱 (IO 멀 티 플 렉 싱)
    IO multiplexing 은 IO 다 중 재 활용 이 고 일부 에 서 는 이러한 IO 방식 을 event driven IO (이벤트 구동 IO) 라 고도 부른다.그것 의 기본 원 리 는 운영 체 제 를 통 해 제공 되 는 select / epol 등 함수 들 의 끊 임 없 는 폴 링 이 담당 하 는 모든 socket 을 사용 하 는 것 입 니 다. 사용자 프로 세 스 가 스스로 폴 링 을 하 게 하 는 것 이 아니 라 이 socket 은 반드시 비동기 적 인 socket 으로 설정 해 야 합 니 다. 어떤 socket 에 데이터 가 도착 하면 사용자 프로 세 스 를 알려 야 합 니 다.이 프로 세 스 는 그림 과 같 습 니 다. 사용자 프로 세 스 가 select 를 호출 하면 전체 프로 세 스 가 block 되 고 kernel 은 모든 select 가 담당 하 는 socket 을 감시 합 니 다. 모든 socket 의 데이터 가 준비 되면 select 는 돌아 갑 니 다.이 때 사용자 프로 세 스 는 read 작업 을 호출 하여 kernel 에서 사용자 프로 세 스 로 데 이 터 를 복사 합 니 다.이 그림 은 Blocking IO 의 그림 과 크게 다 르 지 않 고 사실은 더 나쁘다.두 개의 system call (select 와 recvfrom) 을 사용 해 야 하기 때문에 blocking IO 는 하나의 system call (recvfrom) 만 호출 했 습 니 다.그러나 select 의 장점 은 여러 개의 connection 을 동시에 처리 할 수 있다 는 것 이다.
    위의 그림 에서 알 수 있 듯 이 다 중 모델 을 사용 하면 시스템 에서 select 를 한 번 더 호출 할 수 있 습 니 다. 처리 하 는 연결 수가 높 지 않 으 면 select / epol 을 사용 하 는 웹 server 가 multi - threading + blocking IO 를 사용 하 는 웹 server 보다 성능 이 좋 고 지연 이 더 클 수 있 습 니 다.select / epol 의 장점 은 하나의 연결 을 더 빨리 처리 할 수 있 는 것 이 아니 라 더 많은 연결 을 처리 할 수 있다 는 것 이다.
    그렇다면 IO 다 중 재 활용 의 장점 은 어디 에 있 을 까? 사실은 '다 중 재 활용' 이라는 단어 에 있다.위 에서 도 다 중 재 활용 은 하나의 스 레 드 를 사용 하여 여러 Socket (파일 설명자) 의 준비 상 태 를 검사 하 는 것 을 말한다. 예 를 들 어 select 와 epoll 함 수 를 호출 하여 여러 파일 설명자 로 전송 하 는 것 이다. 만약 에 파일 설명자 가 준비 되면 되 돌아 가 고 그렇지 않 으 면 시간 이 초 과 될 때 까지 막 힌 다.따라서 높 은 동시 다발 장면 에서 예 를 들 어 10000 개의 연결 을 처리 하려 면 1 개의 스 레 드 가 준비 상 태 를 감시 하고 준 비 된 모든 연결 에 대해 하나의 스 레 드 처 리 를 하거나 스 레 드 풀 에 직접 던 져 처리 해 야 한다. 물론 현재 스 레 드 로 처리 할 수도 있다. 그러면 이 IO 스 레 드 는 여러 개의 연결 을 동시에 관리 할 수 있다. 즉, 다 중 재 활용 이다.
    2.4 Asynchronous I/O
    Liux 의 asynchronous IO 는 사실 매우 적 게 사용한다.먼저 프로 세 스 를 보십시오. 사용자 프로 세 스 가 read 작업 을 시작 하면 바로 다른 일 을 시작 할 수 있 습 니 다.다른 한편, kernel 의 측면 에서 asynchronous read 를 받 으 면 먼저 되 돌아 오기 때문에 사용자 프로 세 스에 어떠한 block 도 생기 지 않 습 니 다.그리고 kernel 은 데이터 준비 가 완료 되 기 를 기다 리 고 데 이 터 를 사용자 메모리 에 복사 합 니 다. 이 모든 것 이 완료 되면 kernel 은 사용자 프로 세 스에 signal 을 보 내 read 작업 이 완료 되 었 음 을 알려 줍 니 다.
    3. 각종 IO 간 의 차이
    지금까지 4 개의 IO 모델 을 모두 소개 했다.이제 고 개 를 돌려 최초의 몇 가지 질문 에 대답 하 자. blocking 과 non - blocking 의 차 이 는 어디 에 있 습 니까? synchronous IO 와 asynchronous IO 의 차 이 는 어디 에 있 습 니까?
    Blocking vs non - blocking, 이 문 제 는 매우 간단 합 니 다. 앞의 소개 에서 이 두 가지 차 이 를 명확 하 게 설명 하 였 습 니 다.
    1. blocking IO   wait copy        
    2. non-blocking IO  wait             ,  copy        copy  
    

    synchronous IO 와 asynchronous IO 의 차 이 를 설명 하기 전에 두 가지 정 의 를 내 려 야 합 니 다.Stevens 가 내 린 정의 (사실은 POSIX 의 정의) 는 다음 과 같다.
    1. synchronous I/O:IO           ,  IO    
    2. asynchronous I/O:IO            ,        IO          
    

    이 정의 에 따 르 면 네트워크 IO 차원 에서 동기 화 이 보 는 차단 비 차단 에 비해 더욱 거시적인 개념 이다. 이전에 말 한 차단 IO, 비 차단 IO, IO 다 중 재 활용 은 모두 동기 화 IO 에 속 하 는데 이들 은 커 널 copy 데이터 단계 에서 프로 세 스 를 막 을 수 있 기 때문이다.비동기 IO 는 다 릅 니 다. 프로 세 스 가 IO 작업 을 시작 한 후에 다시 돌아 와 서 더 이상 무시 하지 않 습 니 다. 운영 체제 커 널 에서 신 호 를 보 낼 때 까지 운영 체제 IO 가 완성 되 었 다 고 프로 세 스 에 게 알 립 니 다. 이 전체 과정 에서 프로 세 스 가 전혀 막 히 지 않 았 습 니 다.
    각 IO 모델 의 비 교 는 그림 과 같다.
    위의 소 개 를 통 해 비 차단 IO 와 비동기 IO 의 차이 가 여전히 뚜렷 하 다 는 것 을 알 수 있다.비 차단 IO 에 서 는 프로 세 스 가 대부분의 시간 동안 block 되 지 않 지만 프로 세 스 에 주동 적 인 check 을 요구 하고 데이터 준비 가 끝 난 후에 도 프로 세 스 가 주동 적 으로 recvfrom 을 호출 하여 데 이 터 를 사용자 메모리 에 복사 해 야 합 니 다.비동기 IO 는 사용자 프로 세 스 가 전체 IO 작업 을 운영 체제 (커 널) 에 맡 긴 다음 운영 체제 가 끝 난 후에 신 호 를 보 내 는 것 과 완전히 다르다.이 기간 에 사용자 프로 세 스 는 IO 작업 상 태 를 검사 할 필요 도 없고 주동 적 으로 데 이 터 를 복사 할 필요 도 없다.
    참고 문서:http://blog.csdn.net/historyasamirror/article/details/5778378

    좋은 웹페이지 즐겨찾기