linux内核并发基本概念

在讨论linux内核并发之前,我们先来分享一个情景。

字符数组array是一个内核全局数组,执行函数ArrayWrite_A的线程称为线程A,执行函数ArrayWrite_B的线程称为线程B。线程A和线程B均可访问全局数组array,ArrayWrite_A函数实现的功能是将数组成员依次从0递增赋值到9,ArrayWrite_B函数实现的功能是将数组成员全部赋值为1。

假设此时线程A运行到函数ArrayWrite_A,我们期望的结果是函数ArrayWrite_A执行完后,数组array中的成员应该依次存放着0到9。如图1所示。

我们来模拟一下并发的场景。假设此时线程A运行到函数ArrayWrite_A,当函数ArrayWrite_A执行到indexA = 3时,数组成员被赋值的情况如图2所示。然而这时,线程A被操作系统调度程序切换出去,而调度执行了线程B,此时线程B开始执行函数ArrayWrite_B,假设函数ArrayWrite_B执行完毕,此时线程B被操作系统调度程序切换出去,那么数组成员被赋值的情况如图3所示。此时线程A得到重新调度执行,等到线程A执行完函数ArrayWrite_A时,数组成员的赋值情况如图4所示。此时,我们看到,全局数组array中的成员赋值情况,即不是线程A所期望的,也不是线程B所期望的。这样一个过程就称为竞态

通过这个场景,只是希望来帮助大家来理解linux内核并发相关的概念。全局数组array称为共享资源,共享资源能够被多个线程或进程访问,共享资源可以使软件资源,如全局变量、共享内存等,也可以是硬件资源,硬件资源的共享也很容易理解,例如你一边用视频播放器看着电影,一边用音频播放器听这音乐,那么你的声卡资源就被两个进程共享了。临界区呢?临界区就是访问共享资源的代码片段,这里需要理解的是临界区指的是代码,这段代码能够访问共享资源,在函数ArrayWrite_A和函数ArrayWrite_B中,for循环中的代码就是临界区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值