并发与竞争

简介: 并发与竞争

什么是并发与竞争

并发会造成多个程序同时访问一个共享资源,这时候由并发同时访问一个共享资源而产生的问题就是竞争。比如A和B要打电话,但是公共电话只有一部。A和B要打电话就是并行,谁先打电话就是竞争,所以电话就是共享资源。

Linux是一个多任务的操作系统,并发和竞争在Linux中常的常见。所以在编写Linux驱动的过程中就要考虑并发与竞争。否则在访问共享资源的时候容易出问题,而这些问题往往小容易排查,很难定位。

如果不处理并发后果

这里我们讨论的是内核空间中的并发,用户空间中的并发不讨论,现在有俩个相同的驱动程序A和B,这俩个驱动程序并发执行,并且他们都要修改变量c。

情况1:

程序A先运行,程序A运行完在运行程序B,这种情况是理想情况。程序A和程序B完美运行,没有错误。

情况2:

程序A运行了一半,内核调度让程序B执行,程序B执行完以后在回来来执行程序A。但是程序A执行完以后,程序B是不是就相当于什么也没有做呢,变量c的值是程序A的值。

情况1是理想情况,但是我们根本无法预料到程序A和程序B到底是怎么运行的。如果不对共享资源进行保护。轻则程序白白运行一次,重则系统崩溃。

Linux造成并发情况

主要有以下几种情况:

  • (1)中断程序并发访问。中断是可以随时产生的,一旦产生中断,就会放下手头的工作,去执行中断中的任务,如果在执行中断中的任务的时候修改了共享资源,就会产生刚才我们讲的问题。
  • (2)抢占式并发访问。在Linux内核2.6版本以后,Linux内核支持了抢占,在支持抢占的情况下,正在执行的进程随时都有可能被抢占。
  • (3)多处理器(SMP)并发访问。多核处理器之间存在核间并发访问。

发生并发要保护什么

进程(运行起来的程序就是进程)并发访问共享资源是不安全的,如果俩个进程同时访问空间资源,就是发生竞争。所以我们要保护共享资源,什么是共享资源呢?放在现实生活中,共享资源可以是在第一张幻灯片中提到的公共电话,也可以是我们日常生活中的共享单车,共享充电宝等。这些都是共享资源。

放在代码中,共享资源就是某个整形的全局变量,或者驱动中的设番结构体。当然!其他的数据也可能是共享数据,这个就要根据实际的驱动程序来实际分析了。

目录
相关文章
|
3月前
|
存储 缓存 otter
一个无竞争的缓存
一个无竞争的缓存
40 1
|
4月前
|
安全 算法 编译器
C++一分钟之-内存模型与数据竞争
【7月更文挑战第10天】了解C++11内存模型对多线程编程至关重要。它定义了线程间同步规则,包括顺序一致性、原子操作和内存屏障。数据竞争可能导致不确定行为,如脏读和丢失更新。可通过互斥量、原子操作和无锁编程避免竞争。示例展示了`std::mutex`和`std::atomic`的使用。掌握内存模型规则,有效防止数据竞争,确保多线程安全和性能。
57 0
【并发技术03】传统线程互斥技术—synchronized
【并发技术03】传统线程互斥技术—synchronized
|
存储 缓存 Java
【并发技术12】线程锁技术的使用(二)
【并发技术12】线程锁技术的使用
|
设计模式
【并发技术04】线程技术之死锁问题
【并发技术04】线程技术之死锁问题
|
安全 数据库
【并发技术06】线程范围内共享数据
【并发技术06】线程范围内共享数据
|
存储 缓存 并行计算
使用多线程编程来实现并发时,需要考虑并发所带来的哪些风险呢?
分布式系统的一个重要特征就是计算能力是可以并发或者并行的。 在分布式系统中,往往会将一个大任务进行分解,而后下发给不同的节点去计算,从而节省整个任务的计算时间。
|
存储 Java 程序员
【多线程与高并发】- synchronized锁的认知
synchronized 是 Java 语言的一个关键字,它允许多个线程同时访问共享的资源,以避免多线程编程中的竞争条件和死锁问题。
130 0
【多线程与高并发】- synchronized锁的认知