>  기사  >  백엔드 개발  >  phpCOW 메커니즘에 대한 자세한 설명

phpCOW 메커니즘에 대한 자세한 설명

小云云
小云云원래의
2018-03-28 13:56:361655검색

Copy-on-Write(COW라고도 함)는 이름에서 알 수 있듯이 쓰기 시 수정을 위해 실제로 메모리 복사본을 복사합니다. COW는 스레드와 메모리 사용을 최적화하기 위해 *nix 시스템에서 처음 사용되었으며 이후 C++의 STL 등 다양한 프로그래밍 언어에서 널리 사용되었습니다. PHP 커널에서 COW는 주요 메모리 최적화 방법이기도 합니다. 변수와 메모리에 대한 이전 논의에서 참조 카운팅은 변수를 파괴하고 재활용하는 데 중요한 식별 역할을 합니다. 참조 카운팅의 목적은 COW가 정상적으로 작동할 수 있도록 하여 최적의 메모리 사용을 달성하는 것입니다.

기록 중 복사의 역할

다음은 코드 조각입니다.

<?php
var_dump(memory_get_usage());//先打印出当前内存情况
$arr = array_fill(0, 100000, &#39;tioncico&#39;);//生成一个0-100000键的数组
var_dump(memory_get_usage());//打印内存
$arr_copy = $arr;//把数组赋值给另一个
var_dump(memory_get_usage());//打印内存
$j=1;
foreach($arr_copy as $i) {//循环遍历该数组键值查看内存情况
    $j += count($i);
}
var_dump(memory_get_usage());//打印内存

즉, 참조를 사용하지 않더라도 PHP 변수가 값을 전달하고 값을 할당하면 모두 동일한 메모리를 가리키지만 $arr_copy 값이 변경되면 어떻게 되나요? <?php

var_dump(memory_get_usage());
//$tipi = array_fill(0, 3, &#39;php-internal&#39;);
//不用array_fill的原因可自己试着打印下
$tipi[0]=&#39;php-internal&#39;;
$tipi[1]=&#39;php-internal&#39;;
$tipi[2]=&#39;php-internal&#39;;
 
var_dump(memory_get_usage());
 
$copy = $tipi;
 
xdebug_debug_zval(&#39;tipi&#39;, &#39;copy&#39;);
 
var_dump(memory_get_usage());
 
$copy[0] = &#39;123&#39;;
 
xdebug_debug_zval(&#39;tipi&#39;, &#39;copy&#39;);
 
var_dump(memory_get_usage());

결과는 다음과 같습니다. (참고: 이 결과는 php5.6 웹 환경에서는 php7 참조가 다름)



$arr가 $arr_copy에 값을 할당해도 실행 메모리는 크게 변하지 않으며, 5443320 메모리 양을 직접 늘리면

이후 foreach 순회에서도 메모리 증가는 없습니다

$arr를 $arr_copy에 할당하면 $arr의 전체 값이 메모리에 복사되지 않습니다. , 그러나 $arr_copy의 값은 $arr_copy 데이터를 가져오는 것과 동일한 $arr를 가리키지만 여전히 $arr가 값을 저장하는 메모리를 가리킵니다

즉, 참조를 사용하지 않더라도 PHP 변수는 값을 전달하고 값을 할당하며 모두 동일한 메모리를 가리키고 있지만 $arr_copy 값이 변경되면 어떻게 될까요?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


<?php

var_dump(memory_get_usage());

//$tipi = array_fill(0, 3, 'php-internal');

//不用array_fill的原因可自己试着打印下

$tipi[0]='php-internal';

$tipi[1]='php-internal';

$tipi[2]='php-internal';

 

var_dump(memory_get_usage());

 

$copy $tipi;

 

xdebug_debug_zval('tipi''copy');

 

var_dump(memory_get_usage());

 

$copy[0] = '123';

 

xdebug_debug_zval('tipi''copy');

 

var_dump(memory_get_usage());

결과는 다음과 같습니다. (참고: 이 결과는 php5.6 웹 환경에서의 결과이며, php7의 참조가 다릅니다.)

phpCOW 메커니즘에 대한 자세한 설명

$copy[0 ] 값이 변경되면 php는 $copy[0]에 대해 메모리를 다시 적용한 후 새로운 값이 할당되지만 다른 값의 메모리 상태에는 영향을 미치지 않습니다. 쓰기 중 복사의 최소 세분성은 zval 구조입니다. zval 구조 모음(예: 배열 및 객체 등)의 경우 메모리를 복사해야 할 때 복잡한 객체가 처리를 위해 가장 작은 세분성으로 분해됩니다. 이렇게 하면 메모리에 있는 복잡한 개체의 특정 부분이 수정될 때 개체의 모든 요소를 ​​메모리 복사본으로 "분리"할 필요가 없으므로 메모리 사용량이 절약됩니다.

(기사 내 xdebug_debug_zval은 xdebug 확장 기능에 있는 함수로, 변수의 참조 정보를 보는 데 사용됩니다)

위 내용은 phpCOW 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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