>  기사  >  백엔드 개발  >  PHP 스레드 프로세스 및 동시 인스턴스에 대한 자세한 설명

PHP 스레드 프로세스 및 동시 인스턴스에 대한 자세한 설명

小云云
小云云원래의
2018-03-08 09:36:281435검색


프로세스

프로세스란 무엇인가요? 프로세스는 실행 중인 프로그램이고, 프로세스는 컴퓨터에서 실행되는 프로그램의 인스턴스입니다. 프로세스는 프로세서에 할당되어 실행될 수 있습니다. 프로세스에는 일반적으로 명령어 세트와 시스템 리소스 세트가 포함됩니다. 여기서 명령어 세트는 프로그램 코드를 의미하고, 시스템 리소스 세트는 I/O, CPU, 메모리 등을 의미합니다. 요약하자면, 프로세스는 특정 데이터 수집에 대한 특정 독립적 기능을 가진 프로그램의 실행 활동이라는 것도 이해할 수 있습니다. 프로세스는 시스템의 리소스 할당 및 스케줄링을 위한 독립적인 단위입니다.

프로세스가 실행되면 프로세스는 다음 요소로 구성되어 고유하게 표현될 수 있습니다.

  • 프로세스 설명자: 다른 프로세스와 구별하는 데 사용되는 프로세스의 고유 식별자입니다. Linux에서는 프로세스 ID라고 하며 시스템 호출 분기 중에 생성됩니다. 그러나 getpid를 통해 반환되는 것은 pid 필드가 아니라 스레드 그룹 번호 tgid입니다.

  • 프로세스 상태: 우리가 종종 일시 중지, 실행 중 등이라고 부르는 상태는 현재 상태를 나타냅니다.

  • 우선순위: 다른 프로세스에 비해 프로세스 간 실행 일정과 관련됩니다.

  • 프로그램 카운터: 프로그램에서 실행될 다음 명령어의 주소입니다. 이 주소는 커널 또는 사용자 메모리 공간의 메모리 주소입니다.

  • 메모리 포인터: 프로그램 코드 및 프로세스 관련 데이터에 대한 포인터는 물론 다른 프로세스와의 공유 메모리 블록에 대한 포인터도 포함됩니다.

  • 컨텍스트 데이터: 프로세스가 실행될 때 프로세서 레지스터의 데이터입니다.

  • I/O 상태 정보: 명시적인 I/O 요청, 프로세스에 할당된 I/O 장치 등을 포함합니다.

  • 계정 정보: 총 프로세서 시간, 사용된 총 클럭 수 및 시간이 포함될 수 있습니다. 제한 사항 등

위 요소는 프로세스 제어 블록이라는 데이터 구조에 배치됩니다. 프로세스 제어 블록은 운영체제가 다중 프로세스를 지원하고 다중 프로세싱을 제공할 수 있도록 하는 구조이다. 운영 체제가 프로세스를 전환할 때 두 단계를 수행합니다. 하나는 현재 프로세서의 프로세스를 중단하고 다른 하나는 다음 프로세스를 실행하는 것입니다. 인터럽트 또는 실행에 관계없이 프로세스 제어 블록의 프로그램 카운터, 컨텍스트 데이터 및 프로세스 상태가 변경됩니다. 프로세스가 중단되면 운영 체제는 프로그램 카운터와 프로세서 레지스터(프로세스 제어 블록의 컨텍스트 데이터에 해당)를 프로세스 제어 블록의 해당 위치에 저장하고 프로세스 상태도 변경될 수 있습니다. 차단 상태 또는 차단 상태로 들어갈 수 있습니다. 다음 프로세스가 실행되면 운영체제는 규칙에 따라 다음 프로세스를 실행 상태로 설정하고, 실행될 프로세스의 프로그램 컨텍스트 데이터와 프로그램 카운터를 로드한다.

Threads

프로세스에는 리소스 소유권과 예약 실행이라는 두 가지 특징적인 부분이 있습니다. 리소스 소유권은 프로세스가 프로세스를 실행하는 데 필요한 메모리 공간, I/O 및 기타 리소스를 포함한다는 것을 의미합니다. 스케줄링 실행은 프로세스 실행 도중의 실행 경로 또는 프로그램의 명령 실행 흐름을 의미합니다. 이 두 기능 부분은 분리될 수 있습니다. 분리 후 데이터 소유권이 있는 부분을 일반적으로 프로세스라고 하며, 실행 코드 중 디스패치 가능한 부분이 있는 부분을 스레드 또는 경량 프로세스라고 합니다.

스레드는 "실행 단서"라는 의미를 가지며 프로세스는 멀티 스레드 환경에서 리소스 소유자로 정의되며 프로세스의 프로세스 제어 블록을 계속 저장합니다. 스레드의 구조는 프로세스의 구조와 다릅니다. 각 스레드에는 다음이 포함됩니다.

  • 스레드 상태: 스레드의 현재 상태입니다.

  • 실행 스택

  • 개인 데이터 영역: 각 스레드의 지역 변수를 위한 정적 저장 공간

  • 레지스터 세트: 프로세서의 일부 상태를 저장합니다

각 프로세스에는 프로세스 제어 블록과 사용자 주소 공간이 있고, 각 스레드에는 독립적인 스택과 독립적인 제어 블록이 있으며, 각 스레드에는 자체적인 독립적인 실행 컨텍스트가 있습니다. 그 구조는 그림 8.1에 나와 있습니다.

PHP 스레드 프로세스 및 동시 인스턴스에 대한 자세한 설명

그림 8.1 프로세스 모델 다이어그램

스레드는 실행 중인 프로세스와 다소 다릅니다. 각각의 독립 스레드에는 프로그램 실행을 위한 진입점, 순차적 실행 시퀀스 및 프로그램 종료점이 있습니다. 그러나 스레드는 독립적으로 실행될 수 없으며 프로세스 내에 존재해야 하며 프로세스는 다중 스레드 실행 제어를 제공합니다. 논리적인 관점에서 볼 때 멀티스레딩의 의미는 프로세스에서 여러 실행 부분을 동시에 실행할 수 있다는 것입니다. 이때 프로세스 자체는 기본 실행 단위가 아니라 스레드의 컨테이너입니다.

프로세스에 비해 스레드의 장점은 새 스레드를 생성하든, 스레드를 종료하든, 스레드 간 데이터 공유나 통신을 수행하든 그보다 속도가 더 크다는 것입니다. 프로세스.


동시성 및 병렬성

공존이라고도 하는 동시성은 여러 동시 활동을 처리하는 기능을 의미하며 반드시 동시에 발생할 필요는 없습니다. 예를 들어, 최신 컴퓨터 시스템은 동시에 여러 프로그램을 프로세스 형태로 메모리에 로드할 수 있으며, 프로세서의 시분할 다중화를 사용하여 하나의 프로세서에서 동시에 실행되는 듯한 느낌을 줍니다.

병렬은 동시에 발생하는 두 개의 이벤트를 말하며 동시성이라는 의미를 가지지만, 동시성이 반드시 병렬성을 의미하는 것은 아닙니다.

동시성과 병렬성의 차이점은 하나의 프로세서가 여러 작업을 동시에 처리하고 여러 프로세서 또는 멀티 코어 프로세서가 여러 다른 작업을 동시에 처리한다는 것입니다. 전자는 논리적 동시성이라면 후자는 물리적 동시성이다.

PHP의 다양한 동시성 모델

두 가지 모델이 있는데 PHP는 어떤 모델을 사용하나요? 대답은 모두 지원된다는 것입니다. 이는 PHP가 다중 스레드 모델을 지원한다는 것을 의미합니다. 다중 스레드 상황에서는 일반적으로 리소스 공유 및 격리 문제를 해결해야 합니다. PHP 자체는 스레드로부터 안전합니다.

특정 모델은 어떤 SAPI가 사용되는지에 따라 다릅니다. 예를 들어 Apache에서는 다중 스레드 모델 또는 다중 프로세스 모델이 사용될 수 있습니다. 그리고 php-fpm은 다중 프로세스 모델을 사용합니다.

현재 권장되는 방법은 php-fpm 모델을 사용하는 것입니다. 이 모델은 PHP에 많은 장점을 갖고 있기 때문입니다.

  1. 메모리 해제가 간단하고, 다중 프로세스 모델을 사용할 때 프로세스를 쉽게 해제할 수 있습니다. 메모리 종료, PHP에는 많은 확장이 있기 때문에 약간의 부주의로 인해 메모리 누수가 발생할 수 있습니다. FPM은 프로세스 종료를 통해 폭력을 제거하여 문제를 해결합니다.

  2. 강력한 재해 복구 기능. 동일한 문제의 경우 확장 프로그램이나 PHP로 인해 분할 오류가 발생할 수 있습니다. 단일 프로세스 다중 스레드 모델인 경우 전체 PHP가 중단됩니다. 이는 서비스에 영향을 미칩니다. 여러 프로세스가 있는 경우 특정 프로세스가 종료되어도 전체 서비스에는 영향을 미치지 않습니다.

다중 프로세스에는 다중 프로세스의 장점이 있고, 멀티스레딩에도 멀티스레딩의 장점이 있습니다. 예를 들어 HHVM은 멀티스레딩 모델을 선택합니다. 멀티스레딩 모델의 가장 큰 장점은 동일한 프로세스 공간에서 포인터를 직접 사용할 수 있어 정보 공유 및 통신이 편리하다는 점이다.

예를 들어, PHP에서는 apc, opcache 등이 공유 메모리를 사용하여 opcode를 공유합니다. HHVM에서는 공유 메모리를 사용할 필요가 없습니다. 복잡한 데이터 구조, 포인터 문제로 인해 C/C++의 데이터 구조는 멀티스레드 상황에서 공유될 수 있습니다. 이는 효율성 향상에도 도움이 됩니다.

멀티 프로세싱과 멀티 스레딩 사이에는 또 다른 명백한 모델 차이가 있습니다. 바로 요청을 처리할 때의 논리입니다.

멀티 프로세스의 경우 프로세스 간에 FD 연결을 전달하기가 어렵습니다. 일반적으로 많은 프로세스가 상위 프로세스에서 로드 밸런싱을 구현합니다. 그러한 모델에서는 무리 문제가 발생할 수 있습니다. listen(), 然后各个子进程accept()

멀티 스레딩 모델에서는 독립 스레드를 사용하여 요청을 수락한 다음 이를 각 작업자 스레드에 전달할 수 있습니다.

관련 권장 사항:

단일 스레드 JS 실행 문제에 대한 자세한 설명

PHP의 멀티 스레드 프로그래밍 지원 및

을 사용하여 PHP 멀티 스레드 클래스를 구현하는 사례

위 내용은 PHP 스레드 프로세스 및 동시 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.