diff --git "a/doc/\347\254\254\344\270\203\347\253\240-\345\274\202\346\255\245IO\347\263\273\347\273\237\350\260\203\347\224\250.md" "b/doc/\347\254\254\344\270\203\347\253\240-\345\274\202\346\255\245IO\347\263\273\347\273\237\350\260\203\347\224\250.md" index 5b62d44..f6228d9 100644 --- "a/doc/\347\254\254\344\270\203\347\253\240-\345\274\202\346\255\245IO\347\263\273\347\273\237\350\260\203\347\224\250.md" +++ "b/doc/\347\254\254\344\270\203\347\253\240-\345\274\202\346\255\245IO\347\263\273\347\273\237\350\260\203\347\224\250.md" @@ -62,4 +62,5 @@ IO multiplexing对应的I/O系统调用是select和epoll等,也称这种IO方 ## 流程图 -异步IO系统调用 \ No newline at end of file +![](../assets/异步IO系统调用.png) + \ No newline at end of file diff --git "a/doc/\347\254\254\344\271\235\347\253\240-\346\200\247\350\203\275\346\265\213\350\257\225.md" "b/doc/\347\254\254\344\271\235\347\253\240-\346\200\247\350\203\275\346\265\213\350\257\225.md" index 89c2eae..0936f91 100644 --- "a/doc/\347\254\254\344\271\235\347\253\240-\346\200\247\350\203\275\346\265\213\350\257\225.md" +++ "b/doc/\347\254\254\344\271\235\347\253\240-\346\200\247\350\203\275\346\265\213\350\257\225.md" @@ -21,9 +21,11 @@ |协程|9.5|12.8|19.7|29.7|39.6|43.8|48.4|62.2| |进程|13.6|20.9|29.9|44.1|53.6|67.6|74.4|81.2| -任务切换与进程切换性能对比 +![](../assets/任务切换与进程切换性能对比(qemu).png) + -任务切换对比进程切换优化率 +![](../assets/任务切换对比进程切换优化率(qemu).png) + ### k210平台 下面数据均采用3次重复实验求平均值。(k210烧写太慢了,而k210下测出的数据比较稳定) @@ -33,7 +35,8 @@ |协程|9.0|17.0|28.6|43.0|61.3|70.0|83|97.6| |进程|12.3|22.0|34.0|49.0|66.3|74.0|86.0|99.0| -任务切换对比进程切换优化率 +![](../assets/任务切换对比进程切换优化率(k210).png) + ## 与rCore-Tutorial-v3进行对照实验 本章节主要是在飓风内核和`rCore-Tutorial-v3`之间进行关于`多任务切换`的对照实验,旨在探讨飓风内核中运行多任务与传统内核运行多任务之间的性能对比。 @@ -93,7 +96,8 @@ pub fn main() -> i32 { |飓风内核|13.2|14.0|26.4|43.8|59.4|83.8| |rCore-Tutorial-v3|40.6|75.8|125.8|158.2|224.6|238.8| -飓风内核与rCore-Tutorial运行多任务性能对比(qemu) +![](../assets/飓风内核与rCore-Tutorial运行多任务性能对比(qemu).png) + ## k210平台 @@ -107,4 +111,5 @@ pub fn main() -> i32 { |飓风内核|1.0|1.0|2.0|3.0|4.0|5.7|7.0|8.0| |rCore-Tutorial-v3|37.3|75.0|113.3|153.3|192|231.3|270.7|310.3| -飓风内核与rCore-Tutorial运行多任务性能对比(k210) \ No newline at end of file +![](../assets/飓风内核与rCore-Tutorial运行多任务性能对比(k210).png) + \ No newline at end of file diff --git "a/doc/\347\254\254\345\205\253\347\253\240-\351\243\223\351\243\216\345\206\205\346\240\270\347\232\204\344\270\212\345\261\202\345\272\224\347\224\250\345\205\274\345\256\271\346\200\247.md" "b/doc/\347\254\254\345\205\253\347\253\240-\351\243\223\351\243\216\345\206\205\346\240\270\347\232\204\344\270\212\345\261\202\345\272\224\347\224\250\345\205\274\345\256\271\346\200\247.md" index 8e83d4e..80b645d 100644 --- "a/doc/\347\254\254\345\205\253\347\253\240-\351\243\223\351\243\216\345\206\205\346\240\270\347\232\204\344\270\212\345\261\202\345\272\224\347\224\250\345\205\274\345\256\271\346\200\247.md" +++ "b/doc/\347\254\254\345\205\253\347\253\240-\351\243\223\351\243\216\345\206\205\346\240\270\347\232\204\344\270\212\345\261\202\345\272\224\347\224\250\345\205\274\345\256\271\346\200\247.md" @@ -24,10 +24,12 @@ Rust里面异步编程模型围绕着`Future`这个核心概念,标准库子 ## 可行性 这里我们想让大家看一下`async-std`的目录结构: -async-std目录结构 +![](../assets/async-std目录结构.png) + 然后再看一下飓风内核用户程序的目录结构: -tornado-user目录结构 +![](../assets/tornado-user目录结构.png) + 是不是有非常高的相似度? diff --git "a/doc/\347\254\254\345\215\201\347\253\240-\347\224\250\346\210\267\347\250\213\345\272\217\346\274\224\347\244\272\350\257\264\346\230\216.md" "b/doc/\347\254\254\345\215\201\347\253\240-\347\224\250\346\210\267\347\250\213\345\272\217\346\274\224\347\244\272\350\257\264\346\230\216.md" index becac7f..7791d69 100644 --- "a/doc/\347\254\254\345\215\201\347\253\240-\347\224\250\346\210\267\347\250\213\345\272\217\346\274\224\347\244\272\350\257\264\346\230\216.md" +++ "b/doc/\347\254\254\345\215\201\347\253\240-\347\224\250\346\210\267\347\250\213\345\272\217\346\274\224\347\244\272\350\257\264\346\230\216.md" @@ -30,26 +30,30 @@ unsafe { 注释/取消注释上图的相应代码块即可,比如像运行`任务切换演示程序`,取消前面两行的注释,将其他代码注释掉,然后使用`cargo qemu`运行就可以了。 ## 任务切换演示程序 -任务切换演示程序 +![](../assets/任务切换演示程序.png) + 该演示程序主要演示了怎么进行不同地址空间的任务的切换,首先地址空间1的用户程序往共享调度器里面添加了一个任务,然后通过`yield`系统调用切换到地址空间2,地址空间2的用户程序也往共享调度器里面添加了一个任务,然后运行执行器,发现从共享调度器里面拿出来的任务是在地址空间1,于是通过`yield`系统调用切换到地址空间1中运行,这时候地址空间1的用户程序打印出`yield back 1`,表示重新回到自己的执行流,然后运行执行器,运行完一个任务之后(该任务打印"[user] yield test task0"),发现下一个任务是在地址空间2的,于是又通过`yield`系统调用切换到地址空间2中运行,这时候地址空间2的用户程序继续运行执行器,拿出一个任务运行(该任务打印"[user] yield test task1")之后,发现共享调度器中没有任务了,于是系统退出。 ## 异步IO系统调用演示程序 -异步IO系统调用演示程序 +![](../assets/异步IO系统调用演示程序.png) + 该演示程序主要演示了怎么通过异步IO系统调用从块设备中读取块,这里读取了块号为0的块,打印前10个字节,结果显示正好是FAT32文件系统的头部。 异步IO系统调用的实现原理请参考[第七章-异步IO系统调用](./第七章-异步IO系统调用.md)。 ## 任务间通信演示程序 -任务间通信演示程序 +![](../assets/任务间通信演示程序.png) + 该演示程序主要演示了怎么进行任务间通信,这里主要通过通道(channel)进行通信,先通过`bounded`函数获得一个发送者(`Sender`)和一个接收者(`Receiver`),然后利用`Arc`智能指针让它们在任务间共享,发送方可以通过`send`方法发送消息,接收方可以通过`receive`接受消息。 如果接收方调用`receive`方法的时候通道缓冲区为空,则返回`Pending`,同理,发送方调用`send`方法的时候通道缓冲区已满,则返回`Pending`。这就是该演示程序结果中输出`start receive from channel`和`receive 0 from channel`中间掺杂输出`send 0 to channel`的原因。 ## 飓风内核自身对照实验性能测试程序 -任务与进程上下文切换对比测试程序 +![](../assets/任务与进程上下文切换对比测试程序.png) + 具体请参考[第九章-性能测试](./第九章-性能测试.md)。 diff --git "a/doc/\347\254\254\345\233\233\347\253\240-\347\224\250\346\210\267\346\211\247\350\241\214\345\231\250\344\270\216yield\347\263\273\347\273\237\350\260\203\347\224\250.md" "b/doc/\347\254\254\345\233\233\347\253\240-\347\224\250\346\210\267\346\211\247\350\241\214\345\231\250\344\270\216yield\347\263\273\347\273\237\350\260\203\347\224\250.md" index b78ec88..129a7bd 100644 --- "a/doc/\347\254\254\345\233\233\347\253\240-\347\224\250\346\210\267\346\211\247\350\241\214\345\231\250\344\270\216yield\347\263\273\347\273\237\350\260\203\347\224\250.md" +++ "b/doc/\347\254\254\345\233\233\347\253\240-\347\224\250\346\210\267\346\211\247\350\241\214\345\231\250\344\270\216yield\347\263\273\347\273\237\350\260\203\347\224\250.md" @@ -70,5 +70,6 @@ const fn user_contex_va(asid: usize) -> usize { > ps: RISC-V指令集中tp寄存器指代`thread pointer`,和硬件线程有一点关系,(据说)编译器一般会把线程的上下文基地址放这里来索引一些线程上下文里面的变量。 有了上面三个要素,yield系统调用的流程就如下图所示: -yield系统调用 +![](../assets/yield系统调用.png) +