一、线层
-
实时操作系统怎么调度的?(Freertos调度算法原理大致描述,线程切换怎么做的)
调度启动:
产生SVC中断,把第一个任务加载到栈中
任务切换:
systick中断或者taskdelay->taskYIELD->pendsv->在就绪列表里面选择最高优先级的任务运行
保存上下文,进入临界段更新pxCurrentTCB
相同优先级:时间片
- 有了进程为什么还要有线程?
-
优先级翻转是什么?
当高优先级想要得到被低优先级占用的互斥量,低优先级任务就会被暂时提高,提高到到持有该资源的最高优先级任务同个优先级。
-
优先级翻转的实现?
在一个任务拿锁后, 其他任务尝试拿锁失败,如果设置了阻塞时间,则该任务会被阻塞,在进入阻塞前, 函数会判断当前任务的优先级是否高于拥有锁任务的优先级,如果高于, 则会先提高拥有锁任务的优先级。
-
临界段
在RTOS中,使用最多的临界段是OS本身的调用,但是我们用户也是需要对临界资源进行保护的(临界资源是一次仅允许一个线程使用的共享资源),特别是一些全局变量(pxCurrentTCB)
二、线程通信
-
内核同步有哪些方式?
1)任务通知
这些情况不能用:缓冲多个数据项(任务的通知值一次只能保存一个值);广播多个任务
2)信号量
常用在中断通知任务
3)事件
相比与基于队列的信号量,事件的数据结构(一个指针挂载等待任务和一个变量记录标志位)用到的RAM更小,速度更快
做法:在任务里使用wait等待唤醒
wait的实现:挂到任务等待列表,当发布事件时就会去查询等待列表下有没有等待的任务,有则进行任务切换。
- 信号量和互斥量,用互斥量实现信号量值为10的情况
三、内存管理
-
FreeRTOS的内存管理
1)heap_1 只申请,不释放
2)heap_2 最佳匹配
3)heap_3 简单封装malloc,free,使其具有保护功能
4)heap_4 最佳匹配+合并相邻内存
5)heap_5 最佳匹配+合并跨非连续内存区
四、基础名词
-
死锁
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。
-
死锁的四个条件
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
-
自旋锁的底层实现原理
自旋锁是一种特殊的互斥锁,当资源被加锁后,其他线程想要再次加锁,此时该线程不会被阻塞睡眠而是陷入循环等待状态(CPU不能做其它事情),循环检查资源持有者是否已经释放了资源,这样做的好处是减少了线程从睡眠到唤醒的资源消耗,但会一直占用CPU的资源。适用于资源的锁被持有的时间短,而又不希望在线程的唤醒上花费太多资源的情况。
实现:volatile lock变量
-
为什么自旋锁不能睡眠?
需要循环检测lock变量