ホームページ  >  記事  >  バックエンド開発  >  PHP7 カーネル分析 9 メモリ管理

PHP7 カーネル分析 9 メモリ管理

不言
不言オリジナル
2018-04-13 15:22:471698ブラウズ

この記事の内容は、PHP7 カーネル解析 9 のメモリ管理に関するものです。必要な友達は参考にしてください。1. Zend メモリ プール

メモリ プールは、最下位レベルのメモリです。カーネル操作では、チャンク、ページ、スロットの 3 つの粒度でメモリ ブロックが定義されます。各チャンクのサイズは 2M、ページ サイズは 4KB であり、1 つまたは複数のページが複数のページに分割されます。ページ.スロットであるため、メモリを適用するときは、さまざまなアプリケーション サイズに応じて特定の割り当て戦略が決定されます:

Huge(chunk): 申请内存大于2M,直接调用系统分配,分配若干个chunk
Large(page): 申请内存大于3K(3/4 page_size),小于2044K(511 page_size),分配若干个page
Small(slot): 申请内存小于等于3K(3/4 page_size)

2.zend ヒープ構造

チャンクは 512 ページで構成されます。最初のページはチャンク構造を保存するために使用され、残りの 511 ページは主にラージ メモリとスモール メモリの割り当てに使用されます。ヒープはメモリ プールを表す最も重要な構造です。 3 種類のメモリ割り当てのうち、Zend にはヒープ構造が 1 つだけあり、管理に使用されます。 PHP7 カーネル分析 9 メモリ管理

3. メモリ割り当て

巨大な割り当て 2M を超えるメモリのアプリケーションは、適用されるメモリ ブロックが単一リンク リストを通じて管理されることを除いて、一般的なメモリ アプリケーションとあまり変わりません。巨大な割り当てとは、実際には複数のチャンクを割り当てることを意味します。チャンク割り当ては、ZendMM がシステムからメモリに適用できる唯一の粒度です。チャンク メモリを適用するときに重要な操作があります。これは、メモリ アドレスを ZEND_MM_CHUNK_SIZE に揃えることです。これは、適用されるチャンク アドレスがすべて ZEND_MM_CHUNK_SIZE の整数倍であることを意味します

大量の割り当て

は、page_size (4KB) の 3/4 より大きいです) およびそれ以下 511 page_size のメモリ アプリケーションは、チャンクのサイズが十分であることを意味します (512 ではなく 511 ページである理由は、適用すると最初のページが常にチャンク構造によって占有されるためです)。複数のページの場合、これらのページはすべて連続して割り当てられます。最後のチャンクが見つからない場合は、新しいチャンクを再割り当てし、チャンクのリンク リストに挿入します。
chunk->free_map は、ビットマップを使用してページの各グループの使用状況を記録します

a.首先会直接跳过group1,直接到group2检索
b.在group2中找到第一个可用page位置:67,然后向下找第一个不可用page位置:69,找到的可用内存块长度为2,小于3,表示此内存块不可用
c.接着再次在group2中查找到第一个可用page位置:71,然后向下找到第一个不可用page位置:75,内存块长度为4,大于3,表示找到一个符合的位置,虽然已经找到可用内存块但并不"完美",先将这个并不完美的page_num及len保存到best、best_len,如果后面没有比它更完美的就用它了
d.再次检索,发现group2已无可用page,进入group3,找到可用内存位置:page 130-132,大小比c中找到的合适,所以最终返回的page就是130-132
e.page分配完成后会将free_map对应整数的bit位从page_num至(page_num+page_count)置为1
Small割り当てPHP7 カーネル分析 9 メモリ管理 小さいメモリとは、(3/4 page_size) より小さいメモリを指します。これらのメモリは、最初に 1 つ以上のページに適用され、次にこれらのページが固定サイズにカットされるため、前のセクションで最初のステップは完全に Large に割り当てられます。 。 同じ。小型メモリには合計 30 の固定サイズ仕様があります: 8、16、24、32、40、48、56、64、80、96、112、128...1792、2048、2560、3072 バイトと呼ばれます。このスロット、これらのスロットのサイズは規則的です。最小のスロット サイズは 8 バイトで、最初の 8 スロットは 8 バイトずつ増分され、後続の 4 つの増分値ごとに 2 が乗算されます

step1: 首先根据申请内存的大小在heap->free_slot中找到对应的slot规格bin_num,如果当前slot为空则首先分配对应的page,free_slot[bin_num]始终指向第一个可用的slot
step2: 如果申请内存大小对应的的slot链表不为空则直接返回free_slot[bin_num],然后将free_slot[bin_num]指向下一个空闲位置
step3: 释放内存时先将此内存的next_free_slot指向free_slot[bin_num],然后将free_slot[bin_num]指向释放的内存,也就是将释放的内存插到链表头部
関連推奨事項: PHP7 カーネル分析 9 メモリ管理PHP7カーネル解析8など

PHP7カーネル解析7 Zendエンジン実行処理

PHP7カーネル解析6機能

以上がPHP7 カーネル分析 9 メモリ管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。