Mathieu Lacage <mathieu.lac...@sophia.inria.fr> writes:

> On Thu, 2009-02-26 at 14:05 -0800, Ian Lance Taylor wrote:
>> I've put a project proposal for split stacks on the wiki at
>> http://gcc.gnu.org/wiki/SplitStacks .  The idea is to permit the stack
>> of a single thread to be split into discontiguous segments, thus
>> permitting many more threads to be active at one time without worrying
>> about stack overflow or about wasting lots of stack space for inactive
>> threads.  The compiler would have to generate code to support detecting
>> when new stack space is needed, and to deal with some of the
>> consequences of moving to a new stack.
>
> It would be totally awesome to do this if you could provide an option to
> delegate to a user-provided function the allocation and deallocation of
> the stack blobs needed by threads.

Yes, this would be a goal.


> i.e., the problem I run into is that I create a lot of user-space
> threads and I need to allocate at the very least 2 pages (1 normal page,
> 1 guard page) for each thread:
>   - 2 pages of address space is a lot if you have a lot of threads: it's
> easy to run out of address space (physical memory is less of a concern
> for me)
>   - 2 pages is not enough for a lot of threads and if one of my threads
> hits the 2-page limit, I have to stop my program and restart it with a
> bigger stack space for the offending thread which can be quickly
> "annoying".

Yes, this is the kind of issue the project is intended to address.


> So, ideally, I would be able to not allocate statically any address
> space for my threads and defer stack space allocation only when needed.
> Ideally, I would even be able to use heap memory for that stack space if
> I wanted to.

Right.


> Another use-case I could foresee for this would be to be able to profile
> the runtime stack-usage of an application/set of threads to optimize it.

Right.


>> I would be interested in hearing comments about this.
>> 
>> I'm not currently working on this, but I may start working on it at some
>> point.
>
> I looked a bit at the page you pointed. A couple of questions:
>
>   - if you want to use the stack protector and split stacks, it should
> be fairly trivial to extend the data structure which contains the stack
> protector with a new field, no ?

No, as Daniel mentioned this is part of glibc on GNU/Linux systems, and
is difficult to change.


>   - what would be a typical size for the stack space slop ? (for
> example, on i386 ?)

At this point I really don't know.


>   - I understand that you need to copy the function parameters from the
> old stack to the new stack, but, why would you need to invoke the C++
> copy or move constructors for this ? Would a memcpy not be sufficient to
> ensure proper C++ semantics in this case ? An example which shows how a
> memcpy would break might be interesting.

Daniel showed how this can fail for objects with internal pointers.
This includes __gnu_cxx::__vstring, which is likely to be the default
std::string class in libstdc++ 7, so this is not an unlikely occurrence.

Ian

Reply via email to