Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zia6的第三阶段总结报告 #631

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"server": "hexo server"
},
"hexo": {
"version": "7.0.0"
"version": "4.2.1"
},
"dependencies": {
"hexo": "^4.2.1",
Expand All @@ -25,4 +25,4 @@
"hexo-renderer-stylus": "^1.1.0",
"hexo-server": "^1.0.0"
}
}
}
56 changes: 56 additions & 0 deletions source/_posts/2024秋季开源操作系统第三阶段总结.md
Original file line number Diff line number Diff line change
@@ -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 在云计算场景中的应用可能

最后要特别感谢课程老师的悉心指导,让我能够在短时间内掌握这么多系统级的知识。这次学习经历不仅提升了我的技术能力,更重要的是开阔了我的技术视野。

Original file line number Diff line number Diff line change
@@ -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,我已经掌握了如何在高并发环境下高效地管理异步任务。下一步,我将尝试将这些经验应用到更复杂的系统中,进一步提升其性能和可靠性。