多道程序与分时多任务--rCore[3]

news2024/10/2 1:34:57

概念

  • 协作式操作系统

计算机硬件在快速发展,内存容量在逐渐增大,处理器的速度也在增加,外设 I/O 性能方面的进展不大。于是就想到,让应用在执行 I/O 操作或空闲时,可以主动 释放处理器 ,让其他应用继续执行。

  • 抢占式操作系统

在应用程序员的脑海里,整个计算机就应该是为他们自己的应用准备的,不用考虑其他程序的运行。这导致应用程序员在编写程序时,无法做到在程序的合适位置放置 放弃处理器的系统调用请求 ,这样系统的整体利用率还是无法提高。
所以,站在系统的层面,还是需要有一种办法能强制打断应用程序的执行。

把一个程序的一次完整执行过程称为一次 任务 (Task),把一个程序在一个时间片(Time Slice)上占用处理器执行的过程称为一个 任务片 (Task Slice)。操作系统对不同程序的执行过程中的 任务片 进行调度和管理,即通过平衡各个程序在整个时间段上的任务片数量,就能达到一定程度的系统公平和高效的系统效率。

总体结构

多道程序操作系统 - Multiprog OS的总体结构:
1

通过上图,大致可以看出Qemu把包含多个app的列表和MultiprogOS的image镜像加载到内存中,RustSBI(bootloader)完成基本的硬件初始化后,跳转到MultiprogOS起始位置,MultiprogOS首先进行正常运行前的初始化工作,即建立栈空间和清零bss段,然后通过改进的 AppManager 内核模块从app列表中把所有app都加载到内存中,并按指定顺序让app在用户态一个接一个地执行。app在执行过程中,会通过系统调用的方式得到MultiprogOS提供的OS服务,如输出字符串等。

协作式多道程序操作系统 – CoopOS的总体结构:
2

CoopOS进一步改进了 AppManager 内核模块,把它拆分为负责加载应用的 Loader 内核模块和管理应用运行过程的 TaskManager 内核模块
TaskManager 通过 task 任务控制块来管理应用程序的执行过程,支持应用程序主动放弃 CPU 并切换到另一个应用继续执行,从而提高系统整体执行效率。应用程序在运行时有自己所在的内存空间和栈,确保被切换时相关信息不会被其他应用破坏。如果当前应用程序正在运行,则该应用对应的任务处于运行(Running)状态;如果该应用主动放弃处理器,则该应用对应的任务处于就绪(Ready)状态。操作系统进行任务切换时,需要把要暂停任务的上下文(即任务用到的通用寄存器)保存起来,把要继续执行的任务的上下文恢复为暂停前的内容,这样就能让不同的应用协同使用处理器了。

分时多任务操作系统 – TimesharingOS的总体结构:
3

TimesharingOS最大的变化是改进了 Trap_handler 内核模块,支持时钟中断,从而可以抢占应用的执行。并通过进一步改进 TaskManager 内核模块,提供任务调度功能,这样可以在收到时钟中断后统计任务的使用时间片,如果任务的时间片用完后,则切换任务。从而可以公平和高效地分时执行多个应用,提高系统的整体效率。

多道程序放置与加载

  • 多道程序放置
    多个应用同时放在内存中,所以他们的起始地址是不同的,且地址范围不能重叠
    由于每个应用被加载到的位置都不同,也就导致它们的链接脚本 linker.ld 中的 BASE_ADDRESS 都是不同的。不用直接 cargo build 构建应用的链接脚本,而是写一个脚本定制工具 build.py ,为每个应用定制了各自的链接脚本。
  • 多道程序加载
    所有的应用在内核初始化的时候就一并被加载到内存中。为了避免覆盖,它们自然需要被加载到不同的物理地址。这是通过调用 loader 子模块的 load_apps 函数实现的

任务切换

为了提高效率,我们需要引入新的操作系统概念 任务 、 任务切换 、任务上下文 。
任务切换支持的场景是:一个应用在运行途中便会主动或被动交出 CPU 的使用权,此时它只能暂停执行,等到内核重新给它分配处理器资源之后才能恢复并继续执行

  • __switch 函数
    调用 __switch 之后直到它返回前的这段时间,原 Trap 控制流 A 会先被暂停并被切换出去, CPU 转而运行另一个应用在内核中的 Trap 控制流 B 。然后在某个合适的时机,原 Trap 控制流 A 才会从某一条 Trap 控制流 C 切换回来继续执行并最终返回。
    _switch 函数和一个普通的函数之间的核心差别仅仅是它会 换栈

(当前正在执行的任务的 Trap 控制流,我们用一个名为 current_task_cx_ptr 的变量来保存放置当前任务上下文的地址;而用 next_task_cx_ptr 的变量来保存放置下一个要执行任务的上下文的地址。)
4

多道程序与协作式调度

任务运行状态:任务从开始到结束执行过程中所处的不同运行状态:未初始化、准备执行、正在执行、已退出

任务控制块:管理程序的执行过程的任务上下文,控制程序的执行与暂停

任务相关系统调用:应用程序和操作系统直接的接口,用于程序主动暂停 sys_yield 和主动退出 sys_exit。
sys_yield 表示应用自己暂时放弃对CPU的当前使用权,进入 Ready 状态。
sys_exit 表示应用退出执行。

  • 任务运行状态、任务控制块
    在一段时间内,内核需要管理多个未完成的应用,而且我们不能对应用完成的顺序做任何假定,并不是先加入的应用就一定会先完成。必须在内核中对每个应用分别维护它的运行状态。
    任务控制块非常重要,它是内核管理应用的核心数据结构。
// os/src/task/task.rs

#[derive(Copy, Clone, PartialEq)]
pub enum TaskStatus {
    UnInit, // 未初始化
    Ready, // 准备运行
    Running, // 正在运行
    Exited, // 已退出
}

// os/src/task/task.rs

#[derive(Copy, Clone)]
pub struct TaskControlBlock {
    pub task_status: TaskStatus,
    pub task_cx: TaskContext,
}
  • 任务管理器
// os/src/task/mod.rs

pub struct TaskManager {
    num_app: usize,
    inner: UPSafeCell<TaskManagerInner>,
}

struct TaskManagerInner {
    tasks: [TaskControlBlock; MAX_APP_NUM],
    current_task: usize,
}

运行状态变化图:
5

分时多任务系统与抢占式调度

  • 分时多任务:操作系统管理每个应用程序,以时间片为单位来分时占用处理器运行应用。
  • 时间片轮转调度:操作系统在一个程序用完其时间片后,就抢占当前程序并调用下一个程序执行,周而复始,形成对应用程序在任务级别上的时间片轮转调度。维护一个任务队列,每次从队头取出一个应用执行一个时间片,然后把它丢到队尾,再继续从队头取出一个应用,以此类推直到所有的应用执行完毕。
  • 时钟中断与计时器
    操作系统的计时功能是依靠硬件提供的时钟中断来实现的。
    在 RISC-V 64 架构上,该计数器保存在一个 64 位的 CSR mtime 中,我们无需担心它的溢出问题,在内核运行全程可以认为它是一直递增的。
    一旦计数器 mtime 的值超过了 mtimecmp,就会触发一次时钟中断。

计时器的控制:

// os/src/timer.rs

use riscv::register::time;

pub fn get_time() -> usize {
    time::read()
}
  • 抢占式调度
// os/src/trap/mod.rs

match scause.cause() {
    Trap::Interrupt(Interrupt::SupervisorTimer) => {
        set_next_trigger();
        suspend_current_and_run_next();
    }
}

trap_handler 函数下新增一个条件分支跳转,当发现触发了一个 S 特权级时钟中断的时候,首先重新设置一个 10ms 的计时器,然后调用上一小节提到的 suspend_current_and_run_next 函数暂停当前应用并切换到下一个。


参考:rCore-Tutorial文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux- 系统随你玩之--grep查找文件内容

1、前言 我们在使用过程中经常需要对当前获取的文件进行过滤、提取和分析&#xff0c;以便快速查找到含有指定内容的文件或指定信息的那些行。本章我们继续深入了解有关文本检索的内容。 2、grep 查找文件内容 Linux系统中grep命令是一种强大的文本搜索工具&#xff0c;它能…

使用Loki收集网络设备日志

新钛云服已累计为您分享716篇技术干货前言Loki是Grafana Labs团队的开源项目&#xff0c;是一个水平可扩展&#xff0c;高可用性&#xff0c;多租户的日志聚合系统&#xff0c;它的设计非常简洁易于操作。受Prometheus启发的&#xff0c;可以水平扩展、高可用以及支持多租户的日…

S-HUB如何实现数据库对接WEBSERVICE API

近几年SAAS被大家逐步认可&#xff0c;越来越多的企业购买SAAS服务&#xff0c;但是仍然有很多自建各种业务系统&#xff0c;这些系统建设时一般都只考虑自身业务&#xff0c;而不是特别注重与别的系统之间的互联互通。而企业为了提升效率&#xff0c;又需要将这些业务与别的系…

Java开发 - 双向链表不可怕

前言 说起链表&#xff0c;那还是当初上学的时候学习的&#xff0c;印象里就觉得像锁链一样一环扣一环&#xff0c;后来工作后就几乎没实际接触过链表&#xff0c;每当遇到链表&#xff0c;总是不知道该怎么讲&#xff0c;因为对链表的本质一无所知。也是在学习了Java后&#…

剑指offer----C语言版----第三天

目录 1. 替换空格 1.1 题目描述 1.2 题目背景 1.3 必要的思考 1.4 思路一 1.5 思路二 1.6 思路三&#xff08;学方法&#xff09; 1.7 小试牛刀 1. 替换空格 原题链接&#xff1a;剑指 Offer 05. 替换空格 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/p…

回首2022,展望2023(年度总结)

回首2022&#xff0c;展望2023 热爱技术的伙计们&#xff1a; 哈喽&#xff0c;这篇文章经过一周左右的写写改改&#xff0c;在2022最后的工作日与大家见面&#xff0c;有人说总结是为了更好的开始。是的&#xff0c;一年的时间真的很快&#xff0c;马上就是2023了&#xff0…

k-mean聚类的python实现

文章目录介绍KMeans()函数介绍实例导入相关包整理数据手肘法确定分类个数创建模型绘制结果分为3类的结果作者&#xff1a;张双双介绍 sklearn.cluster模块提供了常用的非监督聚类算法。 该模块中每一个聚类算法都有两个变体: 一个是类(class)另一个是函数(function)。 类实现了…

day06 Debug基础练习

1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具&#xff0c;它可以用于查看程序的执行流程&#xff0c;也可以用于追踪程序执行过程来调试程序。 1.2 Debug介绍与操作流程 如何加断点 选择要设置断点的代码行&#xff0c;在行号的区域后面单击鼠标左键即可 …

刷题记录:牛客NC24858Job Hunt [最长路+两种不同判环详解]

传送门:牛客 题目描述: 奶牛们正在找工作。农场主约翰知道后&#xff0c;鼓励奶牛们四处碰碰运气。而且他还加了一条要求&#xff1a;一头牛在一个城市 最多只能赚D&#xff08;1≤D≤1000&#xff09;美元&#xff0c;然后它必须到另一座城市工作。当然&#xff0c;它可以在…

2自由度陀螺仪滑模控制和PID控制跟踪目标轨迹

目录 前言 1.陀螺仪模型 2.滑模跟踪控制 3.PID控制 4.总结 前言 不为别的&#xff0c;这篇小文章只为内涵某人&#xff0c;问候一下他&#xff1a;不是有手就行&#xff0c;哈哈~ 1.陀螺仪模型 2.滑模跟踪控制 对于2自由度陀螺仪有两个方向x、y跟踪&#xff0c;所以需要…

对于软件测试认识的几大误区,看看你有没有?

对于软件开发来说&#xff0c;软件测试可能还不被大众了解&#xff0c;很多开发人员&#xff0c;包括很多软件高层管理人员&#xff0c;由于缺乏软件测试的知识和实践经验&#xff0c;对软件测试的认识还有很多的误区&#xff1a; 误区一&#xff1a;如果软件发布后有质量问题…

我们一起来谈谈高并发和分布式系统的幂等如何处理!

什么是幂等性 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数或幂等…

Codeforces Round #841 (Div. 2)

题目链接 A. Joey Takes Money 题目描述 input output 题意&#xff1a; 有一个长度为n的数组&#xff0c;你可以进行一步操作&#xff0c;选择两个i,j&#xff0c;然后再选择两个数x,y&#xff0c;使得a[i]a[j] xy&#xff0c;然后将a[i] x,a[j] y&#xff0c;问任意步操…

Spring 中运用的 9 种设计模式

Spring中涉及的设计模式总结&#xff0c;在面试中也会经常问道 Spring 中设计模式的问题。本文以实现方式、实质、实现原理的结构简单介绍 Sping 中应用的 9 种设计模型&#xff0c;具体详细的刨析会在后面的文章发布&#xff0c;话不多说&#xff0c;来个转发、在看、收藏三连…

京东软件测试岗:惨不忍睹的三面,幸好做足了准备,月薪17k,已拿offer

我今年25岁&#xff0c;专业是电子信息工程本科&#xff0c;19年年末的时候去面试&#xff0c;统一投了测试的岗位&#xff0c;软件硬件都有&#xff0c;那时候面试的两家公司都是做培训的&#xff0c;当初没啥钱&#xff0c;他们以面试为谎言再推荐去培训这点让我特别难受。 …

Unity 搭建ILRuntime开发环境

Unity热更新目前主流的方案有: Lua, ILRuntime, puerts, huatuo方案。前两个大家都比较熟悉了&#xff0c;puerts 是基于TypeScript开发的热更新&#xff0c;huatuo是基于C#的方案。后两个大家会比较陌生。本系列分享基于ILRuntime来做热更新。 对啦&#xff01;这里有个游戏开…

【财务】FMS财务管理系统---存货管理

前一篇文章介绍了付款相关的内容&#xff0c;本文中笔者继续介绍FMS财务管理系统的设计&#xff0c;今天是关于存货管理的介绍。 财务存货管理应该就是针对公司的生产原材料、物料、成品、加工品的数量与金额的管控。 在前面也介绍了&#xff0c;存货属于公司的资产&#xff0…

纯Java实现一个网页版的Xshell

前言 最近由于项目需求&#xff0c;项目中需要实现一个WebSSH连接终端的功能&#xff0c;由于自己第一次做这类型功能&#xff0c;所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用&#xff0c;当时看到了很多这方面的项目&#xff0c;例如&#xff1a;GateOne、webss…

微信小程序实现身份证识别-orc

项目中有一个识别身份证的需求&#xff0c;经过调研&#xff0c;最后决定使用微信小程序orc插件进行开发。 一:首先登录小程序公众平台。 1:进入设置> 第三方设置。 2:添加ocr插件。 3:添加完后&#xff0c;需要领取免费额度&#xff0c;100次/天。 https://fuwu.weixin…

SpringBoot+Vue实现后疫情时代下的旅游管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…