From b8177f0750dfaf7b3c406b48e985881e1179d8c3 Mon Sep 17 00:00:00 2001 From: MingyuChen Date: Tue, 4 Jul 2023 10:06:26 +0800 Subject: [PATCH] adds framework of runtime to readme Signed-off-by: MingyuChen --- README.md | 19 +++++++++++++++++-- README_zh.md | 23 +++++++++++++++++++---- figures/runtime_framework.png | Bin 0 -> 12995 bytes figures/structure.png | Bin 15383 -> 9510 bytes 4 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 figures/runtime_framework.png diff --git a/README.md b/README.md index 29d5997..c567f44 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,20 @@ Rust asynchronous runtime, provides functionalities such as spawning async tasks ylong_runtime depends on the other three crates. - ylong_io: provides event-driven net io, using epoll or iocp to achieve non-blocking tcp or udp - ylong_ffrt: provides function flow runtime APIs. It serves as an alternative scheduler for ylong_runtime. -- ylong_macros: provides procedural macros for `select!` and ``main``/``test``. +- ylong_macros: provides procedural macros for `select!`. + +### Runtime framework +![runtime_framework](./figures/runtime_framework.png) + +ylong_runtime's APIs could be divided into four different modules: +- Sync: Synchronization mechanism. +- Async IO: Asynchronous net IO and file IO. +- Parallel Calculation: Parallel iterator and concurrent calculation. +- Timer: Asynchronous timer. + +For inner layer, there are Reactor and Executor: +- Reactor: Listens to system events such as IO and also timer events. Wakes the corresponding tasks through the events. +- Executor: Schedules and executes each tasks. There are two interchangeable executors for the runtime. ## Compile Build @@ -68,7 +81,9 @@ ylong_runtime | | |── core_affinity # Vore affinity components | | └── num_cpus # Num cpus components | └── tests # Sdv of ylong_runtime -└── ylong_runtime_macros # Macros for runtime +└── ylong_runtime_macros + |── examples # Examples of ylong_macro + └── src # Procedural macro implementation for runtime ``` ## Usage diff --git a/README_zh.md b/README_zh.md index 50cb893..d4d434d 100644 --- a/README_zh.md +++ b/README_zh.md @@ -3,16 +3,29 @@ ## 简介 Rust异步运行时库,用于生成并执行异步任务。同时提供了异步网络IO,异步文件IO,定时器,同步原语,并行迭代器等功能。 -### 图一 整体架构图 +### 图1 整体架构图 ![structure](./figures/structure.png) -### 图二 模块间关系 +### 图2 模块间关系 ![inner_dependencies](./figures/inner_dependencies.png) ylong_runtime 依赖以下三个库 - ylong_io: 提供了事件驱动型网络IO,通过epoll或iocp实现了非阻塞性的tcp和udp。 - ylong_ffrt: 提供了Function Flow Runtime的接口,可作为ylong_runtime的底层调度器。 -- ylong_macros: 提供了ylong_runtime所需的过程宏功能,用于`select!`功能, 以及`main`/`test`。 +- ylong_macros: 提供了ylong_runtime所需的过程宏功能,用于`select!`功能。 + +### 图3 Runtime结构图 +![runtime_framework](./figures/runtime_framework.png) + +ylong_runtime对外API分为四个模块: +- Sync: 同步原语 +- Async IO: 异步网络IO & 文件IO +- Parallel Calculation: 并行计算 +- Timer: 异步计时器 + +对内模块分为Reactor以及Executor +- Reactor: 进行IO等系统事件以及Timer事件的监听,并通过监听到的事件唤醒对应任务。 +- Executor: 进行任务调度以及任务执行的主体,ylong_runtime拥有两个可互相替换的调度器。 ## 目录 ``` @@ -51,7 +64,9 @@ ylong_runtime | | |── core_affinity # 绑核实现 | | └── num_cpus # 获取核数实现 | └── tests # ylong_runtime 测试用例 -└── ylong_runtime_macros # ylong_runtime 宏实现 +└── ylong_runtime_macros + |── examples # ylong_runtime_macros 代码示例 + └── src # ylong_runtime 过程宏实现 ``` ## 编译构建 diff --git a/figures/runtime_framework.png b/figures/runtime_framework.png new file mode 100644 index 0000000000000000000000000000000000000000..ff94bf03655cfd708f9bed019ed5b1bc128b5307 GIT binary patch literal 12995 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 OL{?H!qWHDm=l=m{HN!&y literal 0 HcmV?d00001 diff --git a/figures/structure.png b/figures/structure.png index 1234e3c41369ac4d2b63d5a091e0e40057050b14..5800a0c04ebcc847f742ec37fee94cef09831c2d 100644 GIT binary patch literal 9510 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 literal 15383 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 W$5BhcUJo?