操作系统的抢占、重入
参考: https://blog.csdn.net/m0_64727117/article/details/130976784
一、抢占式内核、抢占式调度、抢占式中断:
某一中断执行完成后,如果有更高优先级的任务处于就绪状态,将执行更高优先级任务。
抢占式内核的优点:
(1)最高优先级的任务什么时候可以执行,可以得到CPU的使用权是已知的,使用抢占式内核使任务响应时间得到最优化。
抢占式内核的缺点:
(1)不能直接使用不可重入型函数,调用不可重入函数时,要满足互斥条件。否则调用不可重入型函数的话,低优先级的任务CPU使用权就被高优先级任务剥夺,不可重入型函数的数据有可能被破坏。
二、非抢占式内核、非抢占式调度、非抢占式中断:
一个任务只有主动放弃CPU的使用权,将cpu资源给其他任务(线程)使用,才能实现多任务并发。
非抢占式内核的优点:
(1)中断响应快
(2)允许使用不可重入型函数
(3)运行的任务占用CPU,不必担心被别的任务抢占
非抢占式内核的缺点:
(1)任务响应时间慢,高优先级的任务已经进入就绪状态,但是还不能运行
(2)非抢占式内核的任务响应时间不确定,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决上一个进程什么时候释放CPU的控制权。
linux kernel就是非抢占式。
RTOS多设置为抢占式。
三、重入型函数和不可重入型函数
在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,比如函数中的变量等。我进程A使用全局变量x,还没有使用完x的结果,就调用了进程B,那么我进程B如果也使用了全局变量x,那么就会导致x最后结果不确定。从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。
相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。
这也就是为什么,驱动中我们尽量少使用全局变量,因为多个同类设备,可能使用一个驱动,反复调用,如果驱动中使用了全局变量,那么每个设备调用的驱动都能更改这个全局变量,那么最后这个变量的结果就不确定了。