最近,我在一次采访中被问到这个问题,如果我们通过互斥来实现中断,那么当中断时会产生临界区效应。在用户代码或内核代码中实现临界区是否有任何影响。
发布于 2020-12-22 20:44:46
它取决于临界区的范围和临界区的实现。临界区是应用于代码段的约束,它阻止对某些共享数据的并发访问。
关于单核微控制器
需要保护以下类型的数据。
关键部分可以通过以下方式实现
互斥锁禁用所有中断(在用户上下文和OS内核中可用) context)
对于选项1,由于操作系统,特别是上下文切换器是使用中断来实现的,这也将有效地禁用OS上下文切换和临时多线程。这确保只有当前线程或中断上下文可以访问数据。因此,禁用中断是对所有3种类型的共享数据的有效保护。然而,临时禁用中断会增加微控制器的中断等待时间和OS的调度等待时间,因为在重新启用中断之前,中断处理程序和OS都无法响应。
如果数据仅在线程之间共享,则可以选择使用操作系统软件互斥锁来实现临界区。操作系统限制一个线程一次访问锁定的互斥锁,如果线程仅在获取互斥锁时才访问数据,则对数据的访问是受保护的。操作系统软件互斥通过操作系统调度来保护共享数据,并且操作系统和中断在临界区期间保持完全可操作。这种类型的实现不会阻止在临界区期间处理中断,也不会阻止未受影响的线程的调度。
OS软件互斥锁在保护线程和中断之间共享的数据方面无效,因为操作系统无法通过调度来阻止中断。
在操作系统本身依赖于共享数据的情况下,或者在没有操作系统的情况下,因为OS互斥还不可用,所以经常可以看到操作系统代码或裸机代码禁用中断以获得临界区。
https://stackoverflow.com/questions/63648669
复制