이 글의 내용은 PHP7 커널 분석 2의 I/O 모델에 관한 것입니다. 이제 공유합니다. 필요한 친구들이 참고할 수 있습니다.
1. 동기화: 내 클라이언트(C측 호출자)의 기능입니다. . 결과를 기다리다가 죽기 전에 함수가 끝나지 않았습니다.
2. 비동기: 나(c 측 호출자)가 함수를 호출하고 함수의 결과를 알 수 없습니다. 즉, 콜백 알림입니다.
3. 나(S 측의 호출 수신자, 함수)를 호출한다는 의미입니다. 나(S 측 호출 수신자, S 측 함수)가 데이터를 완전히 수락하거나 결과를 얻을 때까지 반환하지 않습니다.
4. Non-blocking: 나(s측 호출 수신자, 함수)를 호출하면 I(s측 호출 수신자, 함수)가 즉시 반환되고 결과를 얻은 후 호출자에게 알림을 의미합니다
다섯 가지 I/O 모델
(1) Blocking I/O(블로킹 I/O)
사용자 프로세스가 시스템 호출을 수행하면 커널은 I/O의 첫 번째 단계를 시작하고 데이터를 버퍼에 준비합니다. 준비가 완료되면 커널 버퍼에서 사용자 프로세스의 메모리로 데이터가 복사됩니다. 이때 사용자 프로세스는 블록 상태에서 해제되고 다시 실행됩니다.
(2) Non-Blocking I/O (Non-Blocking I/O)
사용자 프로세스는 2단계에서만 차단되고 1단계에서는 차단되지 않으나 1단계에서는 차단됩니다. 단계 이 단계에서 사용자 프로세스는 맹목적으로 기다릴 필요가 없으며 데이터가 준비되었는지 확인하기 위해 지속적으로 커널을 폴링하므로 이 모델은 더 많은 CPU를 소비합니다.
(3) I/O 다중화
I/O 실행의 두 단계는 모두 사용자 프로세스에 의해 차단되지만 두 단계는 독립적입니다. 전체 I/O 작업에서 사용자 프로세스는 두 가지를 시작했습니다. 시스템 호출. I/O 차단과의 차이점은 첫 번째 단계에서는 여러 설명자가 준비될 때까지 기다릴 수 있다는 것입니다
(4) 신호 기반 I/O
I/O 중에만 실행됩니다. 두 번째 단계에서는 사용자 프로세스를 차단합니다. , 첫 번째 단계에서는 차단이 없습니다. I/O 실행의 첫 번째 단계에서 이 모델은 데이터 준비가 완료된 후 데이터가 준비되었음을 사용자 프로세스에 적극적으로 알리는 즉, 사용자 프로세스에 콜백합니다. 알림에는 두 가지 유형이 있습니다. 하나는 사용자 프로세스가 응답하지 않으면 항상 알림이 전송되는 수평 트리거링이고, 다른 하나는 한 번만 알림을 받는 에지 트리거링입니다.
(5) 비동기 I/O(Asynchrnous I/O)
사용자 프로세스가 시스템 호출을 시작하면 즉시 다른 작업을 시작한 다음 I/O의 두 단계로 진행할 수 있습니다. 실행 모든 작업이 완료된 후 커널은 작업이 완료되었음을 사용자 프로세스에 알리기 위해 사용자 프로세스에 알림을 보냅니다.
I/O 멀티플렉싱 기술
select
(1).select()는 fd_set의 데이터 구조를 제공하며, 각 요소는 열린 파일 핸들(소켓 핸들이든 다른 파일이든)과 연관될 수 있습니다. 접촉을 설정하기 위한 작업은 프로그래머에 의해 완료됩니다. select()가 호출되면 커널은 IO 상태에 따라 fd_set의 내용을 수정하여 select(를 실행한 프로그래머에게 알립니다. ) 프로세스에서 읽거나 쓸 수 있는 소켓 또는 파일. 주로 소켓 통신에 사용됩니다.
(2) 프로그램이 선택을 실행한 후 데이터 입력이 없으면 프로그램은 데이터가 있을 때까지 대기합니다(차단된 경우). 즉, 프로그램에서 루프 및 휴면이 필요하지 않습니다.
(3) select를 호출할 때마다 fd_set 컬렉션을 사용자 모드에서 커널 모드로 복사해야 합니다.
(4) 동시에 이 오버헤드는 매우 커집니다. select를 호출할 때 커널에서 이를 탐색하고 전달해야 합니다. fd_set가 많을 때 이 오버헤드도 매우 큽니다
(5). , 기본값은 1024
poll
(1)입니다. poll의 구현은 select와 매우 유사하지만, fd_set 컬렉션을 설명하는 방법만 다릅니다. select의 fd_set 구조 대신 pollfd 연결 목록 구조가 사용됩니다. 다른 모든 것은 비슷합니다.
(2). 모니터링 설명자 수에는 상한이 없습니다.
epoll/kqueue
(1) 모니터링 설명자 수에는 상한이 없습니다.
(2). 이는 폴링 방식이 아니며 무작위로 수행되지 않습니다. fd 수가 증가할수록 효율성은 감소합니다. 활성 상태이고 사용 가능한 fd만 콜백 함수를 호출합니다. 즉, epoll/kqueue의 가장 큰 장점은 "활성" 연결에만 관심이 있고 실제 네트워크에서는 총 연결 수와 관련이 없다는 것입니다. 환경에서는 epoll/kqueue의 효율성이 select 및 poll보다 훨씬 높습니다.
(3). 메모리 복사, mmap() 파일 매핑 메모리를 사용하여 커널 공간으로 메시지 전달 속도 향상
위 내용은 PHP7 커널 분석 2 I/O 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!