>  기사  >  백엔드 개발  >  PHP7 커널 분석 10 스레드 안전성

PHP7 커널 분석 10 스레드 안전성

不言
不言원래의
2018-04-13 15:27:081678검색

이 글의 내용은 PHP7 커널 분석 10의 스레드 안전성에 관한 것입니다. 이제 여러분과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다

1. 스레드 안전성 리소스 관리자

대부분의 PHP SAPI는 단일- cli, fpm, cgi와 같은 스레드 환경에서는 각 프로세스가 하나의 기본 스레드만 시작합니다. 이 모드에서는 스레드 안전 문제가 없지만 Apache와 같은 다중 스레드 환경도 있습니다. 이 경우 스레드 안전이 필요합니다. 이는 PHP에 가장 일반적인 변수(EG 및 CG)가 많기 때문에 문제가 됩니다. 여러 스레드가 동일한 변수를 공유하면 충돌이 발생합니다. 따라서 PHP는 다중 스레드에 대한 보안 메커니즘을 제공합니다. 적용 모델: Zend 스레드 안전(Zend Thread Safe, ZTS).
PHP는 스레드 안전 문제를 해결하기 위해 특별히 TSRM(Thread Safe Resource Manager)을 추상화합니다. 구현 원칙은 상대적으로 간단합니다. 리소스를 공유하기가 너무 어렵기 때문에 간단히 공유하지 않으면 각 스레드가 더 이상 공유하지 않습니다. 데이터를 사용할 때 각 스레드는 서로 간섭하지 않고 자체 복사본을 가져옵니다.
typedef struct {
    size_t size; //资源的大小
    ts_allocate_ctor ctor; //初始化函数
    ts_allocate_dtor dtor;
    int done;
} tsrm_resource_type;

struct _tsrm_tls_entry {
    void **storage; //资源数组
    int count; //拥有的资源数:storage数组大小
    THREAD_T thread_id; //所属线程id
    tsrm_tls_entry *next;
};
한 리소스를 여러 스레드에서 사용할 경우 먼저 TSRM에 리소스를 미리 등록한 다음 TSRM이 리소스에 고유 번호를 할당하고 이 리소스의 크기, 초기화 기능 등을 저장합니다. tsrm_resource_type 구조. 각 스레드는 TSRM이 할당한 번호를 통해서만 이 리소스에 액세스할 수 있습니다. 그런 다음 스레드가 이 번호로 리소스를 얻을 때 TSRM이 첫 번째 요청임을 확인하면 리소스를 기반으로 메모리 조각을 할당합니다. 등록 시 크기를 지정한 다음 초기화 함수를 호출하고 이 스레드에서 나중에 사용할 수 있도록 이 리소스를 저장합니다.
각 스레드에는 tsrm_tls_entry 구조가 있습니다. 현재 스레드의 모든 리소스는 스토리지 배열에 저장되며 아래 첨자는 각 리소스의 ID입니다. 또한 모든 스레드의 tsrm_tls_entry 구조는 전역 변수인 tsrm_tls_table 배열에 저장됩니다. 이 배열에 있는 각 스레드의 tsrm_tls_entry 구조 위치는 스레드 ID와 미리 설정된 스레드 수(tsrm_tls_table_size)에 따라 결정됩니다. tsrm_tls_table의 동일한 위치에 여러 스레드가 저장될 수 있으므로 tsrm_tls_entry는 연결 목록입니다. 리소스를 찾을 때 먼저 스레드 ID % tsrm_tls_table_size를 기준으로 tsrm_tls_entry를 얻은 다음 연결 목록을 순회하여 비교를 시작합니다. thread_id는 현재 스레드에 속하는지 여부를 확인합니다.

Thread Local Storage(TLS)는 현재 스레드의 tsrm_tls_entry를 생성한 후 이 값이 현재 스레드의 TLS에 저장되므로 ts_resource()가 리소스를 얻을 때 tsrm_tls_get()을 통해 직접 얻을 수 있으므로 저장됩니다. 잠금 및 검색 시간.

PHP7 커널 분석 10 스레드 안전성


관련 권장 사항:

PHP7 커널 분석 9 메모리 관리

PHP7 커널 분석 8 등

PHP 7 커널 분석 7 Zend 엔진 실행 프로세스


위 내용은 PHP7 커널 분석 10 스레드 안전성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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