七、(正点原子)Linux并发与竞争

        Linux是多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。

一、并发与竞争

        1、简介

        并发就是多个“用户”同时访问同一个共享资源,带来的问题就是竞争问题。Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。现在的 Linux 系统并发产生的原因很复杂,总结一下有下面几个主要原因:

  • 多线程并发访问
  • 抢占式并发访问
  • 中断程序并发访问
  • SMP(多核)间并发访问

        举一个简单的例子:比如说C语言中 a = 3 这样一句代码,它编译时候其实不是一句代码,而是编译成汇编的3句代码:

1 ldr r0, =0X30000000     /* 变量 a 地址 */
2 ldr r1, = 3             /* 要写入的值 */
3 str r1, [r0]            /* 将 3 写入到 a 变量中 */

        比如正在执行上面的第二条语句时候,这个时候被其他任务打断,CPU被其他任务占用而且这个任务也是给一个变量赋值 b = 5 那么当这个任务运行到第二步时又被前面 a = 3 的任务打断,那么此时 r1 寄存器的值保存的就不是 3 而是 5 导致出现错误。

        2、保护的内容是什么

        并发是同时访问一个共享资源,那么共享资源是什么呢?说简单一点,共享资源其实就是数据,比如一个全局变量等等,所以找到要保护的数据才是重点,一般像全局变量设备结构体这些肯定是必须保护的对象,其他的数据就要根据实际的驱动而定。

二、原子操作

        1、简介

        原子在化学中是最小的组成,不可再往下分,所以,原子操作就是指不可以再进一步分割的操作,一般原子操作用于变量或位操作。Linux内核提供了两组API函数,一组是对整型(int)变量进行操作,一组是对进性操作。

  • 整型原子操作API

        Linux内核定义了叫 atomic_t 的结构体来完成整型数据的原子操作,使用原子变量来代替整型变量。定义在 include/linux/types.h中:

        2、原子操作API函数 

        要使用原子操作API函数(定义在include/asm/atomic.h),首先要定义一个atomic_t的原子变量。

函数 描述
ATOMIC_INIT(int i) 定义原子变量并初始化
int atomic_read(atomic_t *v) 读取v的值,并返回
void atomic_set(atomic_t *v, int i) 给v写入i值
void atomic_add(int i,atomic_t *v) 给v加上i值
void atomic_sub(int i,atomic_t *v) 给v减去i值
void atomic_inc(atomic_t *v)

v自增1

void atomic_dec(atomic_t *v) v自减1
int atomic_inc_return(atomic_t *v) v自增1,并返回v的值
int atomic_dec_return(atomic_t *v) v自减1,并返回v的值
int atomic_inc_and_test(atomic_t *v) v自增1,如果v==0返回真,否者返回假
int atomic_dec_and_test(atomic_t *v) v自减1,如果v==0返回真,否者返回假
int atomic_sub_and_test(int i,atomic_t *v) v减i值,如果v==0返回真,否者返回假
int atomic_add_negative(int i,atomic_t *v) v加i值,如果v为负返回真,否者返回假

                如果使用的时64位的SOC的话,要使用到64位的原子变量:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tofu_Cabbage

你的打赏是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值