关闭

lk对临界区的操作

257人阅读 评论(0) 收藏 举报
分类:
在lk中当要进入临界区的时候一般会用enter_critical_section 和 exit_critical_section来保护
static inline __ALWAYS_INLINE void enter_critical_section(void)
{
critical_section_count++;
if (critical_section_count == 1)
arch_disable_ints();
}
从enter_critical_section 函数中可以看到只有第一次进入的时候才关掉中断。


static inline __ALWAYS_INLINE void exit_critical_section(void)
{
critical_section_count--;
if (critical_section_count == 0)
arch_enable_ints();
}


其中arch_enable_ints 和 arch_disable_ints的实现分别如下
/* void arch_enable_ints(void); */
FUNCTION(arch_enable_ints)
mrs r0, cpsr
bic r0, r0, #(1<<7) /* clear the I bit */
msr cpsr_c, r0
bx lr


/* void arch_disable_ints(void); */
FUNCTION(arch_disable_ints)
mrs r0, cpsr
orr r0, r0, #(1<<7)
msr cpsr_c, r0
bx lr

可见在这两个临界区中是是禁止中断的。进入临界区的时候critical_section_count 会加1
离开临界区的时候会减1,可以临界区是可以嵌套的。
当临界区嵌套是可以直接调用两次enter_critical_section
对应的离开临界区也要调用两次exit_critical_section。


对应的code 类似:


enter_critical_section()
enter_critical_section()
.
.
.
exit_critical_section()
exit_critical_section()


第二次进入临界区的时候,可以调用
static inline void inc_critical_section(void) { critical_section_count++; }
对应的离开临界区的时候
static inline void dec_critical_section(void) { critical_section_count--; }


对应的code 类似:
enter_critical_section()
inc_critical_section()
.
.
.
dec_critical_section()
exit_critical_section()


当某些操作需要判断当前是否在临界区中,例如临界区中中断是被关掉的。可以用in_critical_section来判断,
static inline __ALWAYS_INLINE bool in_critical_section(void)
{
return critical_section_count > 0;
}

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

操作系统的死锁概念,临界区概念

操作系统中有若干进程并发执行, 它们不断申请、使用、释放系统资源,虽然系统的进程协调、通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能继续运行,否则就阻塞的情况。此时,若不借助...
  • lujiandong1
  • lujiandong1
  • 2015-03-22 21:42
  • 1498

Java多线程 之 临界区、ThreadLocal(十)

1.临界区临界区就是在同一时刻只能有一个任务访问的代码区。在java中通常使用下面的方式来实现:synchronized(syncObject) { //critical section }...
  • fan2012huan
  • fan2012huan
  • 2016-06-29 11:04
  • 3050

操作系统概念学习笔记 11 进程同步(一)

进程同步 互相协作的进程之间有共享的数据,于是这里就有一个并发情况下,如何确保有序操作这些数据、维护一致性的问题,即进程同步。从底层到高级应用,同步机制依次有临界区、信号量、管程、原子事务。多个进程并...
  • sunmc1204953974
  • sunmc1204953974
  • 2015-06-16 10:00
  • 3215

java 多线程 临界区的操作

import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.co...
  • liang_henry
  • liang_henry
  • 2016-12-06 14:19
  • 438

操作系统实验临界区的互斥访问

  • 2010-06-23 18:21
  • 312KB
  • 下载

临界区的LockCount为何小于-1

转自 http://blog.sina.com.cn/s/blog_467824880100d2b7.html 某日,在浙大国家实验室,与老方和小崔调试监控死锁问题。机柜里一溜架装服...
  • forfuture3513
  • forfuture3513
  • 2016-07-13 21:48
  • 354

再看copy_on_write缩小临界区的例子

本例子是模拟的读者写者问题,采用shared_ptr+写时拷贝实现,其中我觉得一个比较值得注意的地方是考虑到对象可能在临界区析构而将析构移除临界区,这对于多线程来说要多看多思。 #include...
  • liuxuejiang158
  • liuxuejiang158
  • 2013-10-31 21:53
  • 1212

一种临界区的实现

一种临界区的实现
  • lif12345
  • lif12345
  • 2016-11-28 17:49
  • 185

临界区的硬件互斥方案

临界区互斥的硬件解决 基本硬件机制包括禁止中断、Test-and-Set指令、Swap指令。 1、禁止中断    这是最简单的方法,进程一旦进入临界区就禁止一切中断,在离开临界区前放开中...
  • God2469
  • God2469
  • 2013-08-02 11:31
  • 2734

WaitForSingleObject与事件、信号量、互斥、临界区的用法

 临界区 临界区是一种最简单的同步对象,它只可以在同一进程内部使用。它的作用是保证只有一个线程可以申请到该对象 void InitializeCriticalSe...
  • zhu3522728
  • zhu3522728
  • 2015-01-12 19:58
  • 303
    个人资料
    • 访问:256246次
    • 积分:12790
    • 等级:
    • 排名:第1301名
    • 原创:1062篇
    • 转载:0篇
    • 译文:11篇
    • 评论:9条
    最新评论