相关文章可见:
目录
1、什么是多任务机制?
解:在单一CPU情况下,不存在真正的多任务机制,存在的只有各个任务轮流获取CPU控制权的占用,所以其本质还是单任务或者说裸机运行,区别是在于有一个大管家管理各个任务在各个任务需要时做出最优判断,并将CPU控制权给到其任务。
1.1、为什么感觉多任务在同时运行?
解:由于CPU的执行速度非常快,不同架构的芯片,其运行周期是不定的,如:STM32为Cortex-M3有三级流水线,ARM给出的平均执行速度为1.25MIPS/Mhz。,为方便解释,这里以1MIPS/Mhz(Cpu的主频)为例,可以在1秒内执行1百万条指令。所以像高频的CPU,其CPU执行速度是超乎想象的。回归正题,在此基础上各任务的切换也是非常快的,所以感觉好像有很多任务在同时运行一样。
2、操作系统实时性的特征是什么?
解:实时系统的特征是延时可预测,能够在一个规定时间(时间比较短,一般都是ms级)内对信号做出反应,这就是为什么需要测试单任务内的代码运行时间长短,并合理分配资源的原因。
3、任务的状态有哪些?
解:任务不是随时都可以运行的,一个任务不能一直占用CPU控制权,而是当任务运行完后释放CPU控制权。所以引出任务的状态,确保各个任务都可以得到CPU控制权。一般任务状态有以下几个:
就绪态:就绪态的任务可以运行,但是需要等待占用CPU的任务或中断释放CPU控制权。
运行态:任务正在运行的状态。任何时刻仅有一个任务运行。
挂起态:条件不满足而挂起不能运行的任务,不参与调度。
阻塞态:任务因为等待某个事件(IO操作完成或信号量)的发送而暂时不能运行。
创建态:任务正在被创建,但尚未就绪。
终止态:任务已执行完毕,等待OS进行善后处理,如:回收其占用的资源。
4、什么是任务调度?
解:调度的概念通俗讲就是在多个任务中选择最优或最合适的任务执行。
4.1、CPU如何知道什么时候该执行哪个任务?
解:任务可以被设置唯一优先级,当多个任务在同一时刻均处于就绪态时,会优先选择优先级较高的任务运行。
4.2、什么是抢占式调度
解:在任务运行中,出现了优先级高于当前正在运行的任务时,会立即剥夺当前任务对CPU的控制权,并将其CPU控制权给到高优先级就绪态任务。
5、系统多任务的时间管理
解:操作系统、裸机运行和人一样,均需要一个时间节拍维持其正常运行。举个例子:一个人以正常速度步行时,其心跳一般在100次/分左右;当一个人慢跑时其心率在100~140次/分左右。所以我们CPU运行速度也是如此,CPU主频决定其运行的快慢,当然,当主频消失时,其CPU也就宕机了。
在多任务系统中,除了那种特殊任务(运行一次就关闭)外,在任务运行完成后均会调用OS的阻塞延时函数配置在多久时间后从挂起态进入就绪态。管理这个时间的函数很简单,就是先挂起该任务,设定其延时节拍数,然后就进行任务切换,在指定的节拍数到来后,将当前任务恢复到就绪态。
6、多任务实现思想
解:可能有人对其有疑问,只有一个CPU,如何实现多个独立程序的运行?其实很简单,要实现多任务,就是使每个任务相互独立但又非完全独立。如:人有自己的私有财产,也与其他人拥有有共有财产。任务也一样,任务有自己的Cpu、堆栈、程序代码、数据存储区,也有与其他任务共有的全局栈和共享栈。
CPU控制权是通过多任务机制获取的,其他部分需要我们自行分配。如:A/B/C三个任务均会调用函数Func()优先级由高到低,且为抢占式调度,当B任务在运行时调用函数Func(),正在函数Func中,此时A任务为就绪态,那么A任务会获取到CPU控制权,并允许函数Func(),此时是有可能破坏原任务的数据的,因为两任务有可能共用一套数据。所以为了防止这种情况发送,会采用两种方式处理该问题:函数的可重入设计与互斥调用。
6.1 什么是函数的可重入设计?
解:此类函数中所有变量均为局部变量,因为局部变量是在调用时临时分配的,所以在不同的任务中的不同时刻调用该函数,会因为他们的局部变量分配的存储空间不同(在哪调用,就占用哪个任务的堆栈)而不同。
6.2 什么是互斥调用?
解:实现互斥调用的方法如下:关中断、使用互斥信号及计数信号量(建议使用互斥信号,避免优先级翻转或影响OS实时性)
7、什么是任务TCB
解:任务控制块(TCB)是记录任务的执行环境,可以理解为一个独立的小型CPU,在OS中用于管理任务的一个数据结构。一个TCB包含了一个任务所有的必要信息,以便OS可以管理和控制该任务的执行。
8、TCB的作用有哪些?
解:任务标识:包含了任务的唯一标识符(任务ID),用于操作系统中唯一地址识别与引用。
状态管理:记录任务状态(如:运行、就绪等),以便操作系统可以根据任务状态进行调度。
上下文信息:保存任务的执行上下文,包含程序计数器(PC),寄存器文件、栈指针,这些信息在任务切换时用于保存和恢复任务的执行环境。
调度信息:包含了调度器需要的信息,如任务优先级、调度策略、时间片等,用于决定任务的执行顺序。
资源管理:记录任务所拥有的资源,如:打开的文件描述符、分配的内存、信号量等,以便操作系统可以管理资源的使用与释放。
同步与通信:包含用于任务同步和通信的信息,如:信号量、消息队列、条件变量等。
性能监控:记录任务的性能数据,如CPU使用时间、等待时间、执行次数,用于性能分析和监控。
父/子关系:在支持进程次结构的操作系统中,TCB可能会包含指向父进程和子进程的指针,以维护进程控制。
用户和组ID:包含任务的拥有者信息,如用户ID和组ID,用于权限检查和访问控制。
· 错误处理:包含错误码或异常处理信息,用于处理任务执行中出现的错误或异常情况。
总之,TCB是操作系统内核管理的关键数据结构,它提供了任务执行所需的所有信息,并使得任务可以在多任务环境中高效、安全地运行。
通过以上信息,应该可以大致理解操作系统的基本运行逻辑与思想。