この記事の内容は、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 つだけあり、管理に使用されます。
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
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 メモリ管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。