操作系统有多难?说实话它挺难的。但是站在用户角度来看,他费了很多的功夫,内部各种算法与调度,只为达到一个简单的目的,一切皆为程序片服务。
嵌入式操作系统有如雨后春笋,吃不完,就算能吃完你也嚼不完,就算你能嚼得完,也消化不完,这时候我们会遇到很多问题,我们精力有限到底该学哪一款?其实也没必要因为此而苦恼,因为虽然他们各有千秋,但是当你真正的解开其外衣以后,你会发现其实每一款RTOS其核心都是差不多的,不同的是在实时性、精简性、组件丰富性、、移植性上会各有千秋,偏向不同,等你掌握其内核以后对于任意一款都可以轻松上手。
但是要想掌握内核却并不是那么容易的,需要你在实战中不断地遇到坑,填坑,你填的越多,你对他的理解就越深,掌握的就越牢固,这里我想换一种形式来聊聊关于内核那些事,在这方面我也是个新手(高手直接绕行,没啥意思),与大家一起学习一起分享。
切入正题,开篇就讲一切皆为程序片服务,那什么是程序片,如图:
从图中可以看到,一段可执行代码就是一个程序片,至于多长怎么拆分,完全看你,一般来讲都是按功能拆分,专业一点来讲都是按照资源管理来拆分。
2.在裸奔的情况下,所有的程序片都是按顺序执行,这种方式有着得天独厚的优势,就是一切都是按顺序发生,完全可控,所以这种情况全局变量(也叫共享变量)的威力就显现出来了,便于控制,便于定义和使用,不要跟我讲什么封装艺术,什么管道机制,在这种路子下,梭哈最为实在。他的劣势也自然很明显,他们之间都是排着队执行的,想要突然插队,那几乎是不可能的,当然也能做但是会随着需求的爆发(越来越多插队情况)变得越来越难控制,因为他从生下来就注定了是个顺序结构。
这种结构能解决很大一部分问题,尤其是在嵌入式领域,深耕多年任劳任怨,但是很遗憾,他很难解决所有问题,不然也不会有后来的操作系统出现了。
内核的本质就是调度这些程序片,让他们可以再任意位置被其它程序片打断,转而去执行其它的时间片。
要完成这个调度任务,我们来分析一下,需要做哪些工作:1.得给每个程序片起个名字吧,方便确认谁是谁,好调度,学名:线程名或任务名。
2.既然定义了很多的程序片,如何调度呢?起跑线一样的情况下,先让谁跑总得有个先后顺序,学名:线程优先级或任务优先级。
3.程序片要被切换,那么程序片最起码要有两种状态,停止态和运行态,实际比这要复杂很多,至少有四种,运行态、就绪态、阻塞态、挂起态。
4.程序片在运行时被切换,如何保存现场呢?想想中断是怎么运行的,你需要一个给每一个程序片定义一个栈,在程序片被抢占的时候保存执行的现场。学名:线程栈或任务栈。
内核想要管理许多程序片,他该怎样做呢,一张图带你读懂内核管理机制:
除此以外还会遇到一个问题,程序片是应用开发者的主战场,但是内核要实现管理功能,需要在程序片级做一些操作,于是程序片又被拆分了两类出来,系统级和应用级,系统线程IDLE ,应用线程。