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循环中的代码就是临界区。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。