第1章第1节 为什么要使用操作系统

源码请在https://github.com/ifreecoding/MbedRtos.git下载

 

第1节 为什么要使用操作系统

在没有操作系统的情况下,C语言是以函数为单位实现功能的,一个函数一个函数串行的执行,一个完整的功能会由多个函数共同完成。然而当软件系统的功能变得多而庞大的时候,这种方法几乎无法使用,因为此时各个功能之间必然会有千丝万缕的联系,不可能依次串行的完成每个功能,各个功能必然需要交替执行。以函数为功能单元的程序很难在执行一个函数的时候转而去执行另外不相关的函数,即使是使用一些技巧实现了,也会使整个软件结构变的混乱不堪,不利于软件的维护和扩展。函数的工作方式就决定了并不适合以它为功能单元运行复杂的程序,在这种情况下就需要使用操作系统了。操作系统是对函数运行管理的系统,它可以在一个函数还没有运行完就转而去执行另外一个函数,并且还可以恢复到原来的函数继续执行,这样就可以根据需要及时调整到需要运行的函数来满足各种要求。

以大家熟悉的Windows为例,Windows上运行了很多软件,有办公的、看电影的,玩游戏的,等等等等,太多了。你想过没有,它们是怎么运行的?它们是由不同的厂商开发的,它们之间如何协调?谁先运行谁后运行?这些就是操作系统要做的事。这些应用程序从宏观上看是在一台电脑上同时运行,但从微观上看它们是串行运行的。电脑的CPU每一时刻只能运行一个应用程序,运行很短的时间之后,CPU又去运行下一个应用程序,周而复始的这么运行。由于CPU的速度特别快,因此每个应用程序在很短的时间都可以运行很多次,以人的感觉来说,根本就感觉不到CPU在各个应用程序之间切换运行,因此我们就觉得电脑上的每个应用程序都是在同时运行。就像看电影一样,由于影片的刷新频率快过了人眼睛的可分辨频率,因此我们就觉得电影是在连续播放。这就是操作系统的一个重要功能——任务调度功能。

除此之外,操作系统还有很多功能,比如说文件系统。我们存储的游戏、电影文件是如何放在硬盘上的?为什么我们将几G的文件剪切到同一个硬盘分区上时间很短,而剪切到另外一个硬盘分区上则时间很长?为什么在Dos6下看不到NTFS分区的文件?这些都是操作系统的一个功能——文件管理功能。

另外,操作系统还具有设备管理功能。现在我们在Windows环境下,可以把一块显卡、声卡直接插到主板上,然后启动电脑,安装驱动程序,甚至不需要安装驱动程序就可以使用了。你可能认为电脑就应该是这样的,但实际上,这简单的背后是操作系统为我们做了很多工作,在过去操作系统并不完善的日子,我们需要手动为硬件分配物理地址、中断等资源,极其麻烦。

一个完整的操作系统应该是一个非常复杂非常庞大的系统,还需要包含很多其它的功能,但由于本人能力及精力有限,这些不在本手册的讲述之中,本手册将重点介绍实现嵌入式操作系统的内核调度功能,只侧重任务调度部分,编写一个操作系统内核,读者如有兴趣可自行在此基础上实现操作系统更多的功能。

对于功能简单的小系统设备来说,我们只需要设计一个while死循环就可以完成所有的软件功能,这种小系统一般没有复杂的外部输入,例如电子表,外部输入只有调节时间的按钮,软件的主要功能也只是读取定时器的数值并显示出来。我们以伪码的形式描述一个这样的软件结构:

int main(void)

{

    while(1)

    {

        1.判断按键输入并执行相关操作。

        2.读取定时器数值。

        3.刷新液晶屏显示时间。

    }

}

这个小系统的运行几乎不依赖于外界的输入,只要按照软件设定好的顺序周而复始的执行就可以实现所有功能。

但如果系统功能复杂一些统,使用上述的软件结构就显得有些不适合了。例如我们常用的手机,一般手机处于不通话的状态下,屏幕是黑的,但这并不代表软件没有工作,此时软件需要检测按键是否被按下,闹表定时是否到了,是否有电话来了等等,假设用户在使用手机上网,同时又在听音乐,而电话又来了,你想想软件这个while循环应该如何去写?手机中软件遇到的情况可要比我列出的上述情况复杂的多,仅仅使用这个while循环是无法完成的。

从手机的例子我们可以看到一个软件系统是由多个功能组成的,有些功能之间相对比较独立,例如听音乐与上网是没什么联系的,发短信与闹表是没什么联系的。因此,我们很容易想到,如果软件是以功能为单位去运行的,而各个功能又可以同时运行,那么每个功能只需要专注完成自己的功能就可以了,上述这么复杂的问题也就可以迎刃而解了。

但传统的函数调用方式无法同时运行多个功能函数,因此,我们就无法使用传统的函数方式同时执行多个功能。

前面我们说过,操作系统从宏观来看是可以实现多个功能同时运行的,这种宏观的同时运行是建立在微观的从一个函数的运行过程切换到另一个函数的运行过程实现的,并且还可以再切换回原来的函数继续运行。这种在函数间跳来跳去的运行方式就是操作系统赖以生存的最核心功能——系统调度功能。从原理上来说,这个实现过程并不复杂,并且只需要使用C语言和一点点汇编语言外加一点点技巧就可以实现,所用的软件与我们平时编程时用的软件没什么区别。

操作系统是以任务为执行单元的,每个任务就是一个相对独立的功能单元,各个任务之间可以并行运行,因此操作系统也就实现了多个功能的并行运行功能。每个任务是使用一个函数创建的,没有操作系统的函数和操作系统中创建任务的函数是没有什么区别的,主要区别在于操作系统可以使用一些技巧,让以任务形式存在的函数可以在运行时互相切换。当然,为了实现这个功能,还需要为创建操作系统的函数增加一些额外的属性,将函数变成任务,这个我们将会在后面章节讲述。


 

图 1  没有操作系统和有操作系统的函数执行过程

正是任务具有同时执行的特点,我们可以将几个不相关的功能分别用几个任务来实现,例如手机的听音乐、上网、发短信和闹表等功能,我们使用操作系统为每个功能建立一个任务,每个任务的代码只重点关心自己的功能,至于任务间的间插执行就交给操作系统了,这样就使得整个软件结构变的清晰简单。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值