> I assume this is incompatible with work stealing and task migration
> between threads?

It is compatible, assuming that the number of large stacks is sufficiently 
larger than the number of threads.

Basically, each green task can only run on a specific large stack, but as long 
as you aren't unlucky that all runnable green tasks you'd steal are running on 
a large stack that has already a running green task, then you can steal one.

The probability of that obviously decreases the more large stacks you use; 
large stacks can only consume address space (if you wipe them with 
madvise(MADV_DONTNEED) or similar when unused), so one can reasonably have 256 
8MB large stacks on 32-bit, for instance.

So for instance, if you had an HT 4-core machine with 8 system threads running 
green tasks and 1024 large stacks, the probability of a green task that is not 
blocked but not executable (because its large stack is in use) is 7/256; 
obviously if K tasks are not blocked, then the probability of having none 
executable becomes (7/256)^K (i.e. exponentially lower).

On 64-bit, the probability can be made arbitrarily low, although you consume 
more kernel memory to store the metadata associated with the memory mappings 
for the large stacks.

It would require to rearchitecture the work stealing code to work with a 
two-level data structure and first steal a large stack with at least one 
non-blocked task, and then run the task, rather than directly stealing the 
task.                                        
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to