diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2024-04-28 18:31:51 +0200 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2024-04-28 18:31:51 +0200 |
commit | 81779e3dd91e147c883974588a3be0410f225d42 (patch) | |
tree | 75b75cb5eab276bf801a4a5021ca88b2c34c33b2 /content/2023-01-14-xpost-matcha-threads.md | |
parent | 801e1f4793faa64b8de4c2b92a9c5dbcd818b969 (diff) | |
download | blog-81779e3dd91e147c883974588a3be0410f225d42.tar.gz blog-81779e3dd91e147c883974588a3be0410f225d42.zip |
xpost: add figure to match threads
Diffstat (limited to 'content/2023-01-14-xpost-matcha-threads.md')
-rw-r--r-- | content/2023-01-14-xpost-matcha-threads.md | 73 |
1 files changed, 0 insertions, 73 deletions
diff --git a/content/2023-01-14-xpost-matcha-threads.md b/content/2023-01-14-xpost-matcha-threads.md deleted file mode 100644 index 9500300..0000000 --- a/content/2023-01-14-xpost-matcha-threads.md +++ /dev/null @@ -1,73 +0,0 @@ -+++ -title = "xpost: Cooperative-multitasking studies (matcha-threads)" - -[taxonomies] -tags = ["threading", "linux", "x86", "arm", "riscv"] -+++ - -This is a cross post to a **cooperative-multitasking implementation** that I -did in the past and hosted on github [>> matcha-threads <<][matcha]. - -Cooperative-multitasking allows to perform the thread scheduling in user space. -Executing threads need to give the control back to the `scheduler` such that -other threads can run. Since control is returned explicitly to the scheduler, -threads need to **"cooperate"**. - -The following code snippet shows an example of two such threads: -```cpp -#include "lib/executor.h" -#include "lib/thread.h" -#include <cstdio> - -void like_tea(nMatcha::Yielder& y) { - std::puts("like"); - y.yield(); - std::puts("tea"); -} - -int main() { - nMatcha::Executor e; - e.spawn(nMatcha::FnThread::make(like_tea)); - e.spawn(nMatcha::FnThread::make([](nMatcha::Yielder& y) { - std::puts("I"); - y.yield(); - std::puts("green"); - })); - e.run(); - return 0; -} -``` - -Which gives the following output when being run: -```txt -I -like -green -tea -``` - -The main focus of that project was to understand the fundamental mechanism -underlying cooperative-multitasking and implement such a `yield()` function as -shown in the example above. - -Looking at the final implementation, the yield function does the following: -```txt -yield: - 1. function prologue - 2. push callee-saved regs to current stack - 3. swap stack pointers (current - new) - 4. pop callee-saved regs from new stack - 5. function epilogue & return -``` - -Implementations for different ISAs are available here: -- [x86_64][yield-x86] -- [arm64][yield-arm64] -- [armv7a][yield-arm] -- [riscv64][yield-rv64] - -[matcha]: https://github.com/johannst/matcha-threads -[yield-x86]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/x86_64/yield.s -[yield-arm]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/arm/yield.s -[yield-arm64]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/arm64/yield.s -[yield-rv64]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/riscv64/yield.s |