Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Stack allocation

Boost , Chapter 1. Fiber , Chapter 1. Fiber

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

fiber использует внутри execution_context, который управляет набором регистров и стеком. Память, используемая стеком, распределена/распределяется через stack_allocator, который требуется для моделирования концепции stack-allocator.

stack_allocator может быть передан fiber::fiber() или fibers::async().

stack-allocator concept

stack_allocator должен удовлетворить концепцию stack-allocator требования, указанные в следующей таблице, в которой a является объектом stack_allocator тип, sctx - stack_context<125>, и размер>>>>><38>

выражение

тип возврата

примечания

a(size)

creates a stack allocator

a.allocate()

stack_context

создает стек

a.deallocate(sctx)

void

deallocates the stack created by a.allocate()

[Important] Important

Реализация allocate() может включать логику для защиты от превышения доступных размеров стека контекста, а не оставить его как неопределенное поведение.

[Important] Important

Призыв deallocate() с stack_context не получен из allocate() приводит к неопределенному поведению.

[Note] Note

Память для стека не требуется для выравнивания; выравнивание происходит внутри execution_context.

См. также Boost.Context tab allocation. В частности, методы traits_type описаны для boost::context::stack_traits.

Class protected_fixedsize_stack

Boost.Fiber предоставляет класс protected_fixedsize_stack, который моделирует концепцию stack-allocator. Он добавляет страницу охраны в конце каждого стека, чтобы защитить от превышения стека. Если к охранной странице имеется доступ (операция чтения или записи), то нарушение сегментации/доступа генерируется операционной системой.

[Important] Important

Использование protected_fixedsize_stack дорого. Запуск нового волокна с стеком этого типа влечет за собой накладку установки защиты памяти; после выделения этот стек так же эффективен для использования как fixedsize_stack.

[Note] Note

Приложение guard page not отображается в физической памяти, используются только виртуальные адреса.

#include <boost/fiber/protected_fixedsize.hpp>
namespace boost {
namespace fibers {
struct protected_fixedsize {
    protected_fixesize(std::size_t size = traits_type::default_size());
    stack_context allocate();
    void deallocate( stack_context &);
}
}}

Member function allocate()

stack_context allocate();

Preconditions:

traits_type::minimum_size() <= размер и traits_type::2>s_unbounded()>>>> traits_type>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><1>>>>>>>>>>>>>>>.

Effects:

Аллоцирует память по крайней мере размер байты и сохраняет указателей на стек и его фактический размер в sctx. В зависимости от архитектуры (стек растет вниз/вверх) сохраненный адрес является самым высоким/низким адресом стека.

Member function deallocate()

void deallocate( stack_context & sctx);

Preconditions:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

Effects:

Распределяет пространство стека.

Class pooled_fixedsize_stack

Boost.Fiber предоставляет класс pooled_fixedsize_stack, который моделирует концепцию stack-allocator. В отличие от protected_fixedsize_stack он не добавляет страницу охраны в конце каждого стека. Память управляется внутри boost::pool<>.

#include <boost/fiber/pooled_fixedsize_stack.hpp>
namespace boost {
namespace fibers {
struct pooled_fixedsize_stack {
    pooled_fixedsize_stack(std::size_t stack_size = traits_type::default_size(), std::size_t next_size = 32, std::size_t max_size = 0);
    stack_context allocate();
    void deallocate( stack_context &);
}
}}

Constructor

pooled_fixedsize_stack(std::size_t stack_size, std::size_t next_size, std::size_t max_size);

Preconditions:

traits_type::is_unbounded() || ( traits_type::maximum_size() >= stack_size и 0 < n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

Effects:

Аллоцирует память по крайней мере stack_size байты и хранит указателей на стек и его фактический размер в sctx. В зависимости от архитектуры (стек растет вниз/вверх) сохраненный адрес является самым высоким/низким адресом стека. Аргумент next_size определяет количество стек для запроса из системы в первый раз, что *этот должен выделить системную память. Третий аргумент max_size контролирует, сколько памяти может быть выделено для стек — значение нуля не означает верхнего предела.

Member function allocate()

stack_context allocate();

Preconditions:

traits_type::is_unbounded() || ( traits_type::maximum_size() >= stack_size).

Effects:

Аллоцирует память по крайней мере stack_size байты и хранит указателей на стек и его фактический размер в sctx. В зависимости от архитектуры (стек растет вниз/вверх) сохраненный адрес является самым высоким/низким адресом стека.

Member function deallocate()

void deallocate( stack_context & sctx);

Preconditions:

sctx.sp является действительным, traits_type::максимум() <3&2> ( traits_type::максимум_размер() >2> sctx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

Effects:

Распределяет пространство стека.

[Note] Note

Этот аллокатор стека не безопасен.

Class fixedsize_stack

Boost.Fiber предоставляет класс fixedsize_stack, который моделирует концепцию stack-allocator. В отличие от protected_fixedsize_stack он не добавляет страницу охраны в конце каждого стека. Память просто управляется std::malloc() и std::free<321>().

#include <boost/context/fixedsize_stack.hpp>
namespace boost {
namespace fibers {
struct fixedsize_stack {
    fixedsize_stack(std::size_t size = traits_type::default_size());
    stack_context allocate();
    void deallocate( stack_context &);
}
}}

Member function allocate()

stack_context allocate();

Preconditions:

traits_type::minimum_size() <= размер и traits_type::2>_максимум>>>>>>>>>>>>>>>.

Effects:

Аллоцирует память по крайней мере размер байты и сохраняет указателей на стек и его фактический размер в sctx. В зависимости от архитектуры (стек растет вниз/вверх) сохраненный адрес является самым высоким/низким адресом стека.

Member function deallocate()

void deallocate( stack_context & sctx);

Preconditions:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

Effects:

Распределяет пространство стека.

Class segmented_stack

Boost.Fiber поддерживает использование segmented_stack, т.е. стек растет по требованию. Клетчатка создается с минимальным размером стека, который будет увеличен по мере необходимости. Класс segmented_stack модели stack-allocator концепция<37>. В отличие от protected_fixed_size_stack и fixedsize_stack он создает стек, который растет по требованию.

[Note] Note

Сегментированные стеки в настоящее время поддерживаются только gcc от версии 4.7 и clang от версии 3.4. Для того, чтобы использовать segmented_stack Boost.Fiber должен быть построен с свойством segmented-stacks, например, toolset=gcc segmented-stacks=on на командной строке b2/bjam.

#include <boost/fiber/segmented_stack.hpp>
namespace boost {
namespace fibers {
struct segmented_stack {
    segmented_stack(std::size_t stack_size = traits_type::default_size());
    stack_context allocate();
    void deallocate( stack_context &);
}
}}

Member function allocate()

stack_context allocate();

Preconditions:

traits_type::minimum_size() <= размер и traits_type::2>_максимум>>>>>>>>>>>>>>>.

Effects:

Аллоцирует память по крайней мере размер байты и сохраняет указателей на стек и его фактический размер в sctx. В зависимости от архитектуры (стек растет вниз/вверх) сохраненный адрес является самым высоким/низким адресом стека.

Member function deallocate()

void deallocate( stack_context & sctx);

Preconditions:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

Effects:

Распределяет пространство стека.

[Note] Note

Если библиотека составлена для сегментированных стек, то segmented_stack является единственным доступным аллокатором стека.


PrevUpHomeNext

Статья Stack allocation раздела Chapter 1. Fiber Chapter 1. Fiber может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 1. Fiber ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 19:23:57/0.0086328983306885/0