Zeev Suraski wrote: > At 12:55 AM 6/9/2002, Brian Pane wrote: > >> I just looked through zend_alloc.c. It looks like the HeapCreate only >> happens once, at startup--did I get that right? > > > It's called on the per-thread startup (start_memory_manager(), which > is called from alloc_globals_ctor(), which is the per-thread > allocation 'constructor'). > >> For PHP processing, do >> you need a memory heap that is created at startup and used by all >> requests, >> or is it sufficient to create and destroy a private heap for each >> request? > > > We can go either way, but won't allocating and freeing these heaps > increase fragmentation? Remember that PHP functions will also > allocate memory outside these heaps (in 3rd party libraries).
In the httpd, we've done two things to minimize the fragmentation: * Memory for these heaps is almost always allocated in chunks of a fixed size, 8KB. * There's a two-layer structure to the heaps: - apr_pool objects are what the application uses. Each pool provides a fast alloc interface, no free function, and a "destructor" that returns all the allocated space when the pool is destroyed. - apr_allocator objects provide blocks of memory for the apr_pools to use. Each apr_allocator maintains a free list of blocks. When a pool is destroyed, its space is returned to the apr_allocator from which it was created. The next time we create a pool from that apr_allocator, we can take an 8KB block from that allocator's free list rather than interacting with the system heap. --Brian -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php