From 9dc053e9198b2128fa4629e6e6ee1ac102cf1162 Mon Sep 17 00:00:00 2001 From: YuanShenKing Date: Sat, 30 Nov 2024 20:05:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Zia6=E7=9A=84=E7=AC=AC=E4=B8=89=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E6=80=BB=E7=BB=93=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\346\256\265\346\200\273\347\273\223.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 "source/_posts/2024\347\247\213\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223.md" diff --git "a/source/_posts/2024\347\247\213\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223.md" "b/source/_posts/2024\347\247\213\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223.md" new file mode 100644 index 0000000000..e926349cc7 --- /dev/null +++ "b/source/_posts/2024\347\247\213\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223.md" @@ -0,0 +1,56 @@ +--- +title: 2024秋季开源操作系统第三阶段总结 +date: 2024-11-30 20:03:03 +tags: + - author: Zia6 + - repo: https://github.com/Zia6/oscamp +--- +# ArceOS Unikernel 学习总结 + +不知不觉,在开源操作系统训练营中学习 ArceOS Unikernel 已经过去了几周。回顾这段学习经历,我深深感受到了从一个普通开发者到系统级开发的转变过程。通过这次学习,我对操作系统的理解有了质的飞跃。 + +## 学习心得 + +最让我感到惊讶的是,原来操作系统可以像开发应用程序一样模块化。在学习之前,我对操作系统的印象还停留在庞大而复杂的整体概念上。但通过 ArceOS 的学习,我发现操作系统其实可以被拆分成一个个独立的组件,每个组件都有其明确的职责和边界。这种组件化的思想不仅让系统更容易理解和维护,也为定制化需求提供了极大的灵活性。 + +## 技术收获 + +### 第一周:打好基础 +第一周的学习主要聚焦在基础概念和核心功能的实现上: + +1. 从最简单的彩色 "Hello World" 开始,逐步熟悉了 ArceOS 的项目结构和开发流程 +2. 通过实现 early 内存分配算法,深入理解了操作系统是如何管理内存的 +3. 在调度算法的改造过程中,真正体会到了协作式调度和抢占式调度的区别 + +### 第二周:深入应用 +第二周的内容则更加贴近实际应用场景: + +1. 学习了如何加载和执行外部应用程序 +2. 实现了内核与应用程序的通信机制 +3. 掌握了地址空间分离和切换的技术要点 + +## 技术难点突破 + +在学习过程中,最具挑战性的部分是实现抢占式调度算法。这需要对系统中断机制有深入理解,同时还要考虑: +- 如何合理设置时间片 +- 如何处理优先级 +- 如何确保调度的公平性 + +另一个有趣的挑战是实现应用程序的加载与执行。这让我深入理解了: +- 程序加载的整个流程 +- 内存布局的规划 +- ABI 接口的设计与实现 + +## 个人感悟 + +这次学习经历让我对操作系统有了全新的认识。原来操作系统并不是那么遥不可及,通过合理的模块化设计,我们完全可以构建出自己的操作系统。这种认知的转变也让我在日常应用开发中更注重系统层面的思考。 + +## 未来展望 + +通过这次学习,我对系统级开发产生了浓厚的兴趣。接下来我打算: +1. 深入研究 ArceOS 的其他组件 +2. 尝试开发一些自定义的系统组件 +3. 探索 Unikernel 在云计算场景中的应用可能 + +最后要特别感谢课程老师的悉心指导,让我能够在短时间内掌握这么多系统级的知识。这次学习经历不仅提升了我的技术能力,更重要的是开阔了我的技术视野。 + From 863e0a5a6634a1d95162f7266e7db9f821e7c573 Mon Sep 17 00:00:00 2001 From: YuanShenKing Date: Sun, 22 Dec 2024 15:28:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?zxx=E7=9A=84=E7=AC=AC=E5=9B=9B=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- ...\346\234\272\345\210\266\347\232\204OS.md" | 64 +++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 "source/_posts/\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223\357\274\214\345\237\272\344\272\216\345\274\202\346\255\245\345\215\217\347\250\213\346\234\272\345\210\266\347\232\204OS.md" diff --git a/package.json b/package.json index 894859abe9..27665f98a5 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "server": "hexo server" }, "hexo": { - "version": "7.0.0" + "version": "4.2.1" }, "dependencies": { "hexo": "^4.2.1", @@ -25,4 +25,4 @@ "hexo-renderer-stylus": "^1.1.0", "hexo-server": "^1.0.0" } -} +} \ No newline at end of file diff --git "a/source/_posts/\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223\357\274\214\345\237\272\344\272\216\345\274\202\346\255\245\345\215\217\347\250\213\346\234\272\345\210\266\347\232\204OS.md" "b/source/_posts/\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223\357\274\214\345\237\272\344\272\216\345\274\202\346\255\245\345\215\217\347\250\213\346\234\272\345\210\266\347\232\204OS.md" new file mode 100644 index 0000000000..a2c55135b2 --- /dev/null +++ "b/source/_posts/\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223\357\274\214\345\237\272\344\272\216\345\274\202\346\255\245\345\215\217\347\250\213\346\234\272\345\210\266\347\232\204OS.md" @@ -0,0 +1,64 @@ +--- +title: 第四阶段总结,基于异步协程机制的OS +date: 2024-12-22 15:22:59 +tags: + - author: Zia6 + - repo: https://github.com/Zia6/AsyncRun +--- + + +# 三周学习总结:Rust 异步编程与 io-uring 实现 + +在过去的三周里,我专注于学习 Rust 异步编程,深入了解了异步运行时的设计原理,并通过实现一个基于 io-uring 的简易运行时系统(AsyncRun)来实践这些知识。在此,我将总结我这三周的学习历程,涵盖了异步编程的基础、深入分析 Tokio 运行时的实现,以及基于 io-uring 的自定义运行时的设计与实现。 + +## 第一周:Rust 异步编程基础 + +在第一周,我主要集中于学习 Rust 异步编程的基础。通过阅读《Async/Await》教程和简单的例子,我深入了解了 Rust 异步模型的基本概念。这篇教程介绍了如何使用 `async` 和 `await` 关键字来简化异步编程,并有效避免回调地狱的问题。 + +### 学习内容: +- **Rust 异步编程概念:** 通过学习 `async` 和 `await`,我掌握了如何将异步操作与同步操作结合,避免阻塞主线程,提高程序的并发性。 +- **Future 和 Stream 类型:** 在 Rust 中,`Future` 和 `Stream` 是处理异步操作的核心类型。理解它们的工作原理,对于编写高效的异步代码至关重要。 +- **异步清理(Async Cleanup):** 我还阅读了一些关于 Rust 异步清理的博客,了解了如何在 Rust 的异步代码中进行资源的自动清理,防止内存泄漏。 + +## 第二周:深入学习 Tokio 运行时 + +在第二周,我深入研究了 **Tokio** 运行时。作为 Rust 中最流行的异步运行时,Tokio 被广泛应用于高并发、低延迟的系统中。我通过阅读《Tokio Internals》一文,学习了 Tokio 的总体设计思路,特别是在任务调度和执行方面的核心原理。 + +### 学习内容: +- **Tokio 运行时架构:** 我了解了 Tokio 是如何组织任务的,并深入研究了任务的生命周期管理。特别是如何在多线程环境下调度异步任务,以及调度器如何高效地管理线程池。 +- **源码分析:** 我重点分析了 Tokio 的 `task` 和 `schedule` 部分的源码,通过阅读源码,我进一步理解了 Tokio 任务调度机制的实现原理。 +- **博客总结:** 为了加深理解,我撰写了两篇博客,分别总结了: + - [Tokio Task 阅读总结](https://zia6.github.io/2024/12/10/Tokio-Task%E9%98%85%E8%AF%BB/) + - [多线程下的 Schedule 机制](https://zia6.github.io/2024/12/10/Tokio-Task%E9%98%85%E8%AF%BB/) + +## 第三周:深入探索 io-uring 和实现自定义 Runtime + +在第三周,我转向了更加高效的异步 I/O 机制 **io-uring**。io-uring 是 Linux 内核提供的一种高性能 I/O 机制,它通过零拷贝和直接从用户空间发起 I/O 操作,显著减少了 I/O 延迟。 + +### 学习内容: +- **io-uring 和传统 I/O 比较:** 我写了一篇博客,详细总结了 **io-uring**、**epoll** 和 **select** 三种 I/O 机制的区别、使用场景以及性能差异。通过实验数据,我展示了它们在高并发场景下的性能表现。 + - [io-uring 学习总结](https://zia6.github.io/2024/12/22/io-uring%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/) +- **实现基于 io-uring 的运行时:** 作为这一周的实践,我实现了一个简易的基于 io-uring 的异步运行时,命名为 **AsyncRun**。该运行时通过 io-uring 提供的高效异步 I/O 操作,能够在处理大量并发任务时保持较低的延迟和较高的吞吐量。 + +### AsyncRun 运行时设计与实现 + +**AsyncRun** 是我为了解决高效 I/O 调度与任务执行问题,基于 io-uring 实现的异步运行时。它的设计目标是通过结合 io-uring 提供的零拷贝、高效任务调度机制,在高并发和低延迟场景下提高异步任务的执行效率。 + +#### 核心特点: +- **基于 io-uring 实现:** `AsyncRun` 使用 io-uring 处理 I/O 操作,减少了 I/O 请求的上下文切换,显著提升了 I/O 操作的性能。 +- **异步任务调度:** 运行时设计了一个任务调度器,能够高效地将任务分配给可用的执行器,保证异步任务能够快速响应。 +- **单线程支持:** 该运行时不支持多线程,所有的任务调度和执行都发生在单线程环境下,以避免并发带来的复杂性。 +- **低延迟与高吞吐量:** 通过结合 io-uring 和高效的任务调度机制,`AsyncRun` 在高并发场景下提供低延迟和高吞吐量,适用于需要高效 I/O 的应用场景。 + +#### 运行时架构: +1. **任务调度器:** 任务调度器负责管理异步任务的生命周期,动态调整任务的执行优先级和分配策略。 +2. **io-uring 管理:** 通过 io-uring 提交异步 I/O 请求,并在操作完成后通过回调函数处理结果。这样可以避免传统 I/O 中频繁的系统调用和上下文切换。 +3. **执行器:** 执行器负责将任务分配给运行时环境中的单一线程,确保任务能够尽可能高效地执行。 + +你可以在我的 [GitHub 仓库](https://github.com/Zia6/AsyncRun) 查看完整的代码,并了解如何使用它。 + +## 收获与展望 + +通过这三周的学习与实践,我不仅加深了对 Rust 异步编程的理解,还学到了如何设计和实现一个高效的异步运行时系统。尤其是在深入分析 Tokio 运行时的实现后,我对如何在多线程环境下调度异步任务有了更清晰的认识。 + +未来,我计划继续深入研究异步运行时,特别是性能优化和扩展性方面的问题。通过实现基于 io-uring 的 Runtime,我已经掌握了如何在高并发环境下高效地管理异步任务。下一步,我将尝试将这些经验应用到更复杂的系统中,进一步提升其性能和可靠性。