任务管理与延时

news2024/11/14 18:00:12

1、添加任务管理器

任务管理器其实就是一个大的结构体,然后将一些重要的数据结构集中到一起。重点创建了两个队列ready_list和task_list来管理任务

2、进程主动放弃CPU

目前的系统中,CPU总是被用于安排运行处于就绪队列头部的进程的代码,所以导致了如果该进程总是处于头部,那么其后的任务将迟迟得不到运行的机会,会被活活“饿死”

解决办法:

1)进程将自己移到队列尾部

2)调用task_dispatch()获取下一将要运行的任务并切换过去

3、简单的调度算法:时间片运行

3、让进程按照时间片运行

解决了处于队列头部的任务,如果不主动调用 yield() 时,如何强制其放弃CPU运行,从而给其他进程运行的机会。

因此借用定时器中断剥夺进程的CPU使用权,以周期性的定时中断为基准,给每个任务相同的CPU使用时长,一旦超过时长则被强制剥夺进程的CPU使用权进入队尾部

4、临界资源及简单的保护

临界资源:指在多线程或多进程的环境中,多个线程或进程需要访问和修改的共享资源。由于这些共享资源在同一时间只能被一个线程或进程安全地访问和修改,因此需要使用同步机制来确保它们的操作是原子性的,从而防止数据的不一致和竞态条件(Race Condition)的发生。

一次只让一个进程执行临界区中的代码,目前进程之间的运行是按照时间片运行,由定时器中断处理程序完成,因此可以简单的将中断给禁用就可以防止定时中断处理程序被调用,进而防止任务切换的发生

因此在程序中,增加了两个函数用于实现开关中断功能

/**
 * @brief 进入中断保护
 */
irq_state_t irq_enter_protection (void) {
    irq_state_t state = read_eflags();
    irq_disable_global();
    return state;
}

/**
 * @brief 退出中断保护
 */
void irq_leave_protection (irq_state_t state) {
    write_eflags(state);
}

5、让进程延时运行

延时的原理:将进程从就绪队列中移除,这样操作系统就不用安排CPU运行这个进程的代码。之后等指定的时间结束后,再将进程插入就绪队列。

由于系统中可能会有多个进程同时延时,为了将这些进程有效的管理,额外做了一个延时队列,将需要延时的进程暂时插入到就绪队列中。同时在进程的task_t结构中纪录进程需要延时多长时间。

之后在每个定时中断发生时,扫描这个延时队列。当发现某个进程延时到达时,将其从队列中移除插回延时队列。

存在延时准确性问题:

使用sys_sleep进行延时,实际的延时是有误差的,不会准确的延时指定的时间。因为调用延时函数的时机、延时到达后进程还要继续等待才能有机会运行。

存在的问题:

当系统中所有任务都尝试延时时,系统将崩溃,操作系统不知道做什么,因此考虑增加空闲进程,这个进程就是在其他进程都不需要运行的时候才运行。空闲进程不采用延时。

使用空闲进程后,其不会对其它进程造成任何影响,同时又能有效地让操作系统总是有个进程可以运行。这样就解决了其它任务都延时而导致系统崩溃的问题。

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

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

相关文章

中仕公考怎么样?军队文职技能岗位介绍

军队文职技能岗位有哪些?中仕为大家介绍一下! ①公务员岗 学历要求:大专及以上; 工作内容:在勤务岗位从事服务保障工作; 报考优势:不限专业、对于专业要求不高; ②驾驶员 学历要求:大专及以上; 工作内容:运输物资和保养维护单位机动车辆; 报考优势:每年招考人数比较少…

零基础国产GD32单片机编程入门(七)USART串口485通讯实战含源码

文章目录 一.概要二.USART串口基本介绍三.GD32单片机USART内部结构图四.USART内部信号流向五.USART示波器信号解析六.485通讯基本概念七.配置一个USART数据收发例程进行485通讯实验八.工程源代码下载九.小结 一.概要 USART(Universal Synchronous/Asynchronous Rec…

Python函数(12时间处理正则表达式)

Python基础语法文章导航: Python基础(01初识数据类型&变量)Python基础(02条件&循环语句)Python基础(03字符串格式化&运算符&进制&编码)Python基础(04 基础练习…

深入浅出:模拟实现 C++ STL 中的 unordered_map 和 unordered_set

目录 引言基础知识 散列表哈希函数负载因子模拟实现 unordered_set 数据结构设计哈希函数碰撞解决策略插入操作查找操作删除操作模拟实现 unordered_map 键值对存储插入操作查找操作删除操作代码示例总结 1. 引言 unordered_map 和 unordered_set 是 C 标准模板库 (STL) 中非…

【Python基础】Python运算符

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢! 文章目录 一、前言二、Python 运算符2.1 什么是运算符?2.2 Python算术运算符2.3 Python 比较运算符2.4 Pytho…

大数据-108 Flink 快速应用案例 重回Hello WordCount!方案1批数据 方案2流数据

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

OpenCV绘图函数(6)绘制椭圆函数ellipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 画出一个简单的或粗的椭圆弧或者填充一个椭圆扇形。 函数 cv::ellipse 使用更多的参数可以画出椭圆轮廓、填充的椭圆、椭圆弧或填充的椭圆扇形。…

复现很难吗?找我帮你解决烦恼

代码复现,算法复现,文章复现,科研复现 Matlab,Python均可 文献里的算法,方法均可复现, 提供代码改进,模型优化,增加模块,python代做,预测,微调&am…

潮玩宇宙无聊猿斗兽场游戏开发代码示例

明确游戏目标和定位:确定游戏的类型(比如是竞技类、策略类等)、风格、玩法规则等。设计游戏架构:包括服务器架构、客户端架构、数据库设计等。美术设计:创作游戏中的角色、场景、道具等美术资源。编程实现:…

五分钟本地部署Uptime Kuma运维监控结合内网穿透实现远程访问

文章目录 前言**主要功能**一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务,如何安装Docker详见: 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址…

MySQL:简述多版本并发控制MVCC

一、MVCC的概念 1、MVCC 数据库并发场景有三种,分别为: (1)读读:不存在任何问题,也不需要并发控制。 (2)读写:有线程安全问题,可能会造成事务隔离性问题&am…

App弱网测试是怎么测试的!

一、网络测试的一般流程 step1:首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2:其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是否会…

算法力扣刷题记录 九十【739. 每日温度】

前言 单调栈第一篇。单调栈解题思路如何? 一、题目阅读 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会…

2024 Python3.10 系统入门+进阶(十):Python字典及其常用操作详解

目录 一、初始化1.1 {}--直接创建字典1.2 dict()函数--创建字典1.3 fromkeys()方法--创建一个新字典 二、元素访问2.1 使用中括号[]语法2.2 get()方法--获取字典中指定键的值2.3 setdefault()方法--获取字典中指定键的值 三、新增和修改3.1 直接赋值3.2 update()方法--更新字典…

RabbitMQ练习(Routing)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考:《RabbitMQ练习(Hello World)》和《RabbitMQ练习(Work Queues)》。 确保RabbitMQ、Sender、Receiver、Receiver2容器…

人工智能训练师一级(高级技师)、二级(技师)考试指南

随着经济快速发展,人工智能技术在制造业、交通运输、农业、医疗健康、金融服务、物流配送以及城市服务等多个领域得到了广泛的应用。不仅带来产业的转型升级,更是对具备相应技能的人工智能训练师需求的激增。 根据教育部发布的《关于做好职业教育“…

BugKu练习记录:把猪困在猪圈里

题目: 用base64解码 再对应猪圈密码解码,得到答案 t h i s i s p i g p a s s w o r d

house of pig

文章目录 house of pig介绍:利用条件:利用流程: 例题:利用: 总结: house of pig 介绍: House of Pig 是一个将 Tcache Stash Unlink Attack 和 FSOP 结合的攻击,同时使用到了 Larg…

MQ专题:事务消息的实现方式

方案 事务消息投递的过程 step1:开启本地事务step2:执行本地业务step3:消息表t_msg写入记录,status为0(待投递到MQ)step4:提交本地事务step5:若事务提交成功,则投递消息…

【原创教程】电气电工13:按钮开关指示灯篇

按钮开关在电气电工工作中,看似简单,但是有些细节问题,我们还是要注意的。电气电工工作是一个完整的体系,任何一件事疏忽,都会埋下安全隐患。 首先我们来看下 开关按钮的定义: 按钮开关是指利用按钮推动传动机构,使动触点与静触点按通或断开并实现电路换接的开关。按…