Linux并发与同步专题

Stella981
• 阅读 447

并发访问:多个内核路径同时访问和操作数据,就有可能发生相互覆盖共享数据的情况,造成被访问数据的不一致。

临界区:访问和操作共享数据的代码段。

并发源:访问临界区的执行线程或代码路径。

在内核中产生并发访问的主要有如下4种:

  • 中断和异常:中断发生后,中断处理程序和被中断的进程之间有可能产生并发访问。中断<==>被中断的线程
  • 软中断和tasklet:软中断或者tasklet随时可能会被调度执行,从而打断当前正在执行的进程上下文。软中断<==>进程上下文
  • 内核抢占:调度器支持可抢占特性,会导致进程和进程之间的并发访问。进程<==>进程
  • 多处理器并发执行:多处理器上可以同时运行多个进程。A处理器进程<==>B处理器进程

对于单处理器系统,主要有一下并发源:(硬中断 > 软中断和tasklet > 进程上下文)

  • 中断处理程序可以打断软中断、tasklet和进程上下文。
  • 软中断和tasklet之间不会并发,但是可以打断进程上下文的执行。
  • 在支持抢占的内核中,进程上下文之间会并发。
  • 在不支持抢占的内核中,进程上下文之间不会产生并发。

对于SMP系统,有如下并发情况:

  • 同一类型的中断处理程序不会并发,但是不同类型的中断有可能送达到不同的CPU上,因此不同类型的中断处理程序可能会存在并发执行。
  • 同一类型的软中断会在不同的CPU上并发执行。
  • 同一类型的tasklet是串行执行的,不会在多个CPU上并发。
  • 不同CPU上的进程上下文会并发。

并发保护的是资源或者数据,而不是保护代码;包括静态局部变量、全局变量、共享的数据结构、缓存、链表、红黑树等各种形式的资源数据。

下面是本专题展开的章节:

Linux并发与同步专题 (1)原子操作和内存屏障

Linux并发与同步专题 (2)spinlock

Linux并发与同步专题 (3) 信号量

Linux并发与同步专题 (4) Mutex互斥量

Linux并发与同步专题 (5) 读写锁

Linux并发与同步专题 (6) RCU

Linux并发与同步专题 (7) 内存管理中的锁

Linux并发与同步专题 (8) 最新更新与展望

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
stm32 USART_IT_IDLE中断 一帧数据
USART\_IT\_IDLE中断,是串口收到一帧数据后,发生的中断。也可以叫做一包数据USART\_IT\_IDLE和USART\_IT\_RXNE区别当接收到1个字节,会产生USART\_IT\_RXNE中断当接收到一帧数据,就会产生USART\_IT\_IDLE中断清中断方法//USART_IT_RX
Stella981 Stella981
2年前
Linux 信号signal处理机制
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。一、信号的基本概念本节
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
初探 Objective
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和
Wesley13 Wesley13
2年前
2.Java 并行程序基础
1.初始线程:线程的基本操作1.新建线程2.终止线程stop造成数据不一致3.线程中断publicvoidThread.interrupt()//中断线程publicbooleanThread.isTnterrup
Stella981 Stella981
2年前
Linux 网络包接收过程的监控与调优
Linux内核对网络包的接收过程大致可以分为接收到RingBuffer、硬中断处理、ksoftirqd软中断处理几个过程。其中在ksoftirqd软中断处理中,把数据包从RingBuffer中摘下来,送到协议栈的处理,再之后送到用户进程socket的接收队列中。!Linux教程(https://oscimg.oschina.net/oscnet/up