RTOS的调度原理

我们这一系列的微信推送,仅仅是为了可以帮助大家快速地对操作系统有一个感性层面上的认识。当然,让人更好地记住一样复杂的东西,就是寻找另一样简单的东西来解释它。但是,这种方式的解释,是完全不符合教育应该有的严谨逻辑的。因此,让我们来收回这种非科学的论证,转而用科学的方法论来表述我们需要阐述的东西。

(一) 自己写一个调度算法

在很久很久以前,我大抵记得那是我大二学生时期,我就开始自己动手写过一个调度算法。其实现的功能非常简单,就是使两个“任务”分时地去交替执行,并且,利用定时器去决定这两个任务运行的时间。当时满心欢喜地想告诉全世界,自己完成了一个“内核”的框架。

现在想来,上述的这个行为真的是非常可笑的无知满足。因为这个算法的实现非常简单。简单阐述一下其原理,就是建立两个指向函数的指针变量,然后建立两个函数,并且用上述两个变量指向它们。定时器开始定时,假设周期为10ms,那么每隔10ms只要去切换着两个变量就可以了。这样子,如果宏观性上面,你就能看到两个任务是在同时运行了。

再来分析一下上述的东西,听着特别简单,但是经不住仔细推敲,它们肯定是不符合操作系统的任何特征的。首先,如果你的每个任务执行的时间小于10ms还好,万一超过了其分时分配的运行时间(10ms)而强行使用定时器去切换,那当前没运行完的数据完全就丢失了,没有任何拯救的余地。其次,它的任务没法被动态地建立,回收。还有很多很多的缺点。这是我大三恍然大悟的东西。因此,到现在我也不喜欢使用在主函数里面利用定时器产生计数值,根据计数值去切换运行函数的方式。为什么?因为你裸机编程的时候,特别是在某个函数里面有大量的通讯等待操作时,你无法保证每个函数的运行时间正好小于等于你设定的时间。因此总会出现,有些任务根本执行不到这一现象。

但是不幸的是,后来工作之后,发现很多电子工程师都是这样去处理他的程序流向的。

(二) 操作系统调度算法的原理

我开始研究操作系统,也是那时候在自信满满地用了我自己的“内核”做了几个项目之后,直到有一次做一个长距离Modbus高速通信,由于这个函数里面有一个做CRC检验失败等待重传的函数。而由于选用了高速的数据流,加上距离比较长,因此高频信号的畸变比较严重,导致了误码率很高。因此这个函数频繁被调用,但是后来发现,这个函数几乎不能被完整运行下来。分析了好久的原因,最后发现,原来这个函数执行的时间远远超过了我分配给它的运行时间了,因此,没等它执行完成,我的调度算法强制将其中断了。并且由于没有数据的保存机制,导致了整个函数只能执行一半就被销毁了。后来工作之后,也遇到过别的工程师这么做,劝其修改,还是不听,最后导致了严重的错误。从那以后,我宁愿while(1)到底,也不愿使用这样的方式了。

而一个成熟的操作系统内核,它的调度算法是会在中断当前任务之后,将数据保存下来的。

我们称当前运行的任务为“运行态”,而没有被运行的任务,我们称为“非运行状态”。但是关于“非运行状态”,这只是一个笼统的名称而已,这里面包含了众多的子状态。我们以后来详细说明一下“非运行状态”的具体细分。在这里注明一下,我们课程的逻辑当中,为了简化操作系统模型,因此把所有具体的非运行状态进行集合化,在一些高级的操作系统当中,这个问题有待讨论。

以最基本的分时操作系统来说,这里假设所有任务的优先级都是统一的,时间一到就会自动轮询。当时间到来时,运行态任务没有被执行完的数据,操作系统都会有一个机制,将这些数据进行保存,可以是压入堆栈。具体操作的过程,就是将寄存器里面的数据进行保存,有点类似于中断函数的调用。接着把可以回收的内存进行回收。然后,为下一个需要执行的任务分配内存,最后再去执行下一个需要执行的任务。而当时间又轮到了第一次没有执行完的任务之后,又会重新为其分配内存,然后把之前的数据取出来,继续执行。整个笼统的过程就是这样。

(0)

相关推荐

  • 实时操作系统的滴答Tick设置多少才合适?

    最近有读者问了这么一个问题:为啥RTOS的系统滴答(Tick)默认配置都是1000,我配置为100.10000,或者2000可以不? 相信很多初学者都有这个疑问,包括我初学RTOS也曾困惑滴答配置不同 ...

  • Linux 调度系统全景指南(上篇)

    本文主要是讲Linux的调度系统, 由于全部内容太多,分三部分来讲,调度可以说是操作系统的灵魂,为了让CPU资源利用最大化,Linux设计了一套非常精细的调度系统,对大多数场景都进行了很多优化,系统扩 ...

  • 实时操作系统RTOS实现多任务调度原理

    很多朋友长时间使用裸机编程,切换过来学习RTOS,就对其中很多概念产生误解. 大部分人开始学习RTOS实时操作系统时,对RTOS中的一些概念都不太理解. 一上来就是临界段.调度.信号量.互斥锁等这些概 ...

  • 30 张图讲解:Golang调度器GMP原理与调度全分析

    本文作者:刘丹冰Aceld 公众号同名 该文章主要详细具体的介绍Goroutine调度器过程及原理,可以对Go调度器的详细调度过程有一个清晰的理解,花费4天时间作了30+张图(推荐收藏),包括如下几个 ...

  • RTOS实现多任务调度的基本原理

    很多朋友长时间使用裸机编程,切换过来学习RTOS,就对其中很多概念产生误解. 大部分人开始学习RTOS实时操作系统时,对RTOS中的一些概念都不太理解. 一上来就是临界段.调度.信号量.互斥锁等这些概 ...

  • 【golang详解】go语言GMP(GPM)原理和调度

    GMP Goroutine调度是一个很复杂的机制,下面尝试用简单的语言描述一下Goroutine调度机制,想要对其有更深入的了解可以去研读一下源码. 目录 GMP 复用线程 并行 抢占 全局gorou ...

  • 世界微笑日 | “笑一笑,十年少”的心理学原理

    迪香式微笑 法国的一位医生迪香曾在1860年做过个实验.他用适度的电极电流刺激实验者的面部肌肉,看不同的肌肉动作可以产生什么样的表情.记录发现,人们微笑的时候动用了三块肌肉:嘴角肌.颧骨肌和眼角肌.嘴 ...

  • 【感应式IC卡】S50卡技术资料和工作原理

             S50卡,采用NXP MF1 IC S50制作的非接触智能卡,通常简称S50卡.Mifare 1K卡.M1卡或直接简称感应式IC卡,符合ISO14443A标准,拥有4字节UID号,是 ...

  • 考前冲刺 | 2021年高考政治之《生活与哲学》常考原理及方法论,收藏必背~

    来源:本文转自[好好向上高中政治],对作者的付出表示衷心感谢,如有不当,我们会第一时间删除.

  • 一文轻松看懂区块链的工作原理

    作者注:这篇文章是写给非计算机专业的朋友的科普文,尽量避开了比较专业的细节.如果你是计算机相关专业,或者具备一定数据结构.算法.密码学的知识,建议直接看文末参考资料中的三篇博文,或者更专业的资料. 区 ...

  • 省煤器原理动画

    省煤器原理动画