并发与竞争

并发与竞争

在 Linux 系统中,处理并发和竞争条件是非常重要的。下面是几个处理并发和竞争条件的主要概念和机制:

进程和线程

进程:是程序的执行实例,每个进程都有自己的地址空间和执行上下文。Linux 系统中,多个进程可以并发运行。
线程:是进程内的执行单元,共享同一地址空间。因此,线程之间的通信更为直接。

临界区保护

临界区:指多个进程或线程访问共享资源的区域。通过使用互斥锁(Mutex)或其他同步机制,可以保护临界区,确保同一时间只有一个进程或线程访问共享资源,从而避免竞争条件。

信号量和互斥量

信号量:用于进程或线程间的同步和通信。在 Linux 中,可以使用信号量来保护共享资源或者限制对资源的访问。
互斥量:是一种特殊的信号量,通常用于保护临界区。

文件锁定

文件锁:可以用来控制对文件的访问,以防止多个进程同时修改同一个文件造成数据不一致的情况。在 Linux 中,可以使用 fcntl() 系统调用来获取文件锁。

条件变量

条件变量:是一种线程间同步的机制,它允许一个线程等待另一个线程满足特定的条件后才继续执行。

原子操作

原子操作:是不可被中断的操作,要么完全执行,要么完全不执行,不会被其他进程或线程中断。原子操作通常用于更新共享资源,以避免竞争条件。

ARM中实现原子操作

1、单核原子操作主要通过关中断实现。
2、多核系统中,单个的机器指令就不是原子操作,因为多核系统里是多指令流并行运行的,一个核在执行一个指令时,其他核同时执行的指令有可能操作同一块内存区域,从而出现数据竞争现象。多核系统中的原子操作通常使用内存栅障(memory barrier)来实现,即一个CPU核在执行原子操作时,其他CPU核必须停止对内存操作或者不对指定的内存进行操作,这样才能避免数据竞争问题。
多个CPUs和memory chip是通过总线互联的,在任意时刻,只能有一个总线设备访问该memory chip。来自两个CPU上的读memory操作被串行化执行,分别获得了同样的旧值。完成修改后,两个CPU都想进行写操作,把修改的值写回到memory。但是硬件限制使得CPU的写回必须是串行化的,因此CPU1首先获得了访问权,进行写回动作,随后,CPU2完成写回动作。在这种情况下,CPU1的对memory的修改被CPU2的操作覆盖了,因此执行结果是错误的。

LDREX  <Rt>, [<Rn>]

是base register,保存memory的address,LDREX指令从base register中获取memory address,并且将memory的内容加载到(destination register)中。这些操作和ldr的操作是一样的,那么如何体现exclusive呢?其实,在执行这条指令的时候,会有监视器local monitor观察状态

STREX <Rd>, <Rt>, [<Rn>]

STREX跟LDREX指令类似,是base register,保存memory的address,STREX指令从base register中获取memory address,并且将 (source register)中的内容加载到该memory中。这里的保存了memeory 更新成功或者失败的结果,0表示memory更新成功,1表示失败。STREX指令是否能成功执行是和local monitor状态相关的。下面的表格可以描述这种情况。
在这里插入图片描述
开始的时候,local monitor处于Open Access state的状态,thread 1执行LDREX 命令后,local monitor的状态迁移到Exclusive Access state(标记本地CPU对xxx地址进行了LDREX的操作),这时候,中断发生了,在中断handler中,又一次执行了LDREX ,这时候,local monitor的状态保持不变,直到STREX指令成功执行,local monitor的状态迁移到Open Access state的状态(清除xxx地址上的LDREX的标记)。返回thread 1的时候,在Open Access state的状态下,执行STREX指令会导致该指令执行失败(没有LDREX的标记,何来STREX),说明有其他的内核控制路径做了对内存的操作。

具体示例

/* 给一个原子变量mem增加value,将最新的mem值返回 */
__asm os_int32_t os_atomic_add_return(os_atomic_t *mem, os_int32_t value)
{
Loop_add_ret
    LDREX R2, [R0]
    ADD   R2, R2, R1
    STREX R3, R2, [R0]
    CBZ   R3, Loop_add_ret_exit
    B     Loop_add_ret
Loop_add_ret_exit
    MOV   R0, R2
    BX    LR
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值