提交 9c01b263 编写于 作者: Y Yifan Wu

Apply recent updates.

上级 1f347716
......@@ -150,4 +150,4 @@ tips
- 简单总结本次实验你编程的内容。(控制在5行以内,不要贴代码)
- 由于彩色输出不好自动测试,请附正确运行后的截图。
- 完成问答问题。
- (optional) 你对本次实验设计及难度/工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。
\ No newline at end of file
- (optional) 你对本次实验设计及难度/工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。
......@@ -120,4 +120,3 @@ challenge: 支持多核,实现多个核运行用户程序。
- 简单总结与上次实验相比本次实验你增加的东西(控制在5行以内,不要贴代码)。
- 完成问答问题。
- (optional) 你对本次实验设计及难度/工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。
......@@ -173,4 +173,4 @@ challenge: 实现多核,可以并行调度。
- `user-multitask in rv64 <https://github.com/chyyuu/os_kernel_lab/tree/v4-user-std-multitask>`_
- `绿色线程 in x86 <https://github.com/cfsamson/example-greenthreads>`_
- `x86版绿色线程的设计实现 <https://cfsamson.gitbook.io/green-threads-explained-in-200-lines-of-rust/>`_
- `用户级多线程的切换原理 <https://blog.csdn.net/qq_31601743/article/details/97514081?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control>`_
\ No newline at end of file
- `用户级多线程的切换原理 <https://blog.csdn.net/qq_31601743/article/details/97514081?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control>`_
......@@ -32,14 +32,27 @@
本节接下来主要站在应用开发者和用户的角度来介绍如何理解进程概念并基于它编写应用程序。
.. warning::
.. note::
**为何要在这里才引入进程**
根据我们多年来的OS课程经验,学生对 ``进程`` 的简单定义“ **正在执行的程序** ”比较容易理解。但对于多个运行的程序之间如何切换,会带来哪些并发问题,进程创建与虚拟内存的关系是啥等问题很难一下子理解清楚,也不清楚试图解决这些问题的原因。
这是由于在 ``进程`` 这个定义背后,有特权级切换、异常处理,程序执行的上下文切换、地址映射、地址空间、虚存管理等一系列的知识的支撑,才能理解清楚操作系统对进程的整个管理过程。所以,我们在前面几章对上述知识进行了铺垫。并以此为基础,更加全面地来分析操作系统是如何管理进程的。
.. note::
**进程,线程和协程**
**TODO:进程、线程与协程**
进程,线程和协程是操作系统中经常出现的名词,它们都是操作系统中的抽象概念,有联系和共同的地方,但也有区别。计算机的核心是CPU,它承担了基本上所有的计算任务;而操作系统是计算机的管理者,它可以以进程,线程和协程为基本的管理和调度单位来使用CPU执行具体的程序逻辑。
.. warning::
从历史角度上看,它们依次出现的顺序是进程、线程和协程。在还没有进程抽象的早期操作系统中,计算机科学家把程序在计算机上的一次执行过程称为一个任务(task)或一个工作(job),其特点是任务和工作在其整个的执行过程中,不会被切换。这样系统效率会比较低。
在引入分时切换机制和虚拟内存机制后,进程的概念就被提出了,进程成为CPU(也称处理器)调度(scheduling)和分派(switch)的对象,各个进程间以时间片为单位轮流使用CPU,且每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。
**TODO:章节设计:为何要在这里才引入进程概念**
随着计算机的发展,对计算机系统性能的要求越来越高,而进程之间的切换开销相对较大,于是计算机科学家就提出了线程。线程是程序执行中一个单一的顺序控制流程,线程是进程的一部分,一个进程可以包含一个或多个线程。各个线程之间共享进程的地址空间,但线程有自己独立的栈。且线程是处理器调度和分派的基本单位。
协程(coroutines,也称纤程(Fiber)或绿色线程(GreenThread)),也是程序执行中一个单一的顺序控制流程,建立在线程之上(即一个线程上可以有多个协程),但又比线程更加轻量级的处理器调度对象。协程是由用户态的协程管理库来进行管理和调度,操作系统是看不到协程的。因此,协程的整个处理过程不需要有特权级切换和操作系统的直接介入。而且协程可以设置更小的栈或者多个协程共享线程的栈。这样,协程在时间和空间的管理开销上,相对于线程和进程都有很大的改善。在具体实现上,协程可以在用户态运行时库这一层面通过函数调用来实现;也可在语言级支持协程,比如Go语言引入的 ``go`` 关键字,Rust语言引入的 ``async`` 、 ``wait`` 关键字等,通过编译器和运行时库二者配合来简化程序员编程的负担并提高整体的性能。
进程模型与重要系统调用
------------------------------------------------------------
......
......@@ -118,6 +118,7 @@ Blocks 给出 ``os`` 目录也占用 8 个块进行存储。实际上目录也
简易文件与目录抽象
-------------------------------------------------
我们的内核实现对于目录树结构进行了很大程度上的简化,这样做的目的是为了能够完整的展示文件系统的工作原理,但代码量又不至于太多。我们进行的简化如下:
- 扁平化:仅存在根目录 ``/`` 一个目录,剩下所有的文件都放在根目录内。在索引一个文件的时候,我们直接使用文件的文件名而不是它含有 ``/`` 的绝对路径。
......@@ -242,4 +243,4 @@ Blocks 给出 ``os`` 目录也占用 8 个块进行存储。实际上目录也
- 第 20~25 行,我们打开文件 ``filea`` ,向其中写入字符串 ``Hello, world!`` 而后关闭文件。这里需要注意的是我们需要为字符串字面量手动加上 ``\0`` 作为结尾。在打开文件时 *CREATE* 标志使得如果 ``filea`` 原本不存在,文件系统会自动创建一个同名文件,如果已经存在的话则会清空它的内容。而 *WRONLY* 使得此次只能写入该文件而不能读取。
- 第 27~32 行,我们以只读 *RDONLY* 的方式将文件 ``filea`` 的内容读取到缓冲区 ``buffer`` 中。注意我们很清楚 ``filea`` 的总大小不超过缓冲区的大小,因此通过单次 ``read`` 即可将 ``filea`` 的内容全部读取出来。而更常见的情况是需要进行多次 ``read`` 直到它的返回值为 0 才能确认文件的内容已被读取完毕了。
- 最后的第 34~38 行我们确认从 ``filea`` 读取到的内容和之前写入的一致,则测试通过。
\ No newline at end of file
- 最后的第 34~38 行我们确认从 ``filea`` 读取到的内容和之前写入的一致,则测试通过。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册