并发与竞争

简介: 并发与竞争

什么是并发与竞争

并发会造成多个程序同时访问一个共享资源,这时候由并发同时访问一个共享资源而产生的问题就是竞争。比如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月前
|
缓存 安全 Java
高性能解决线程饥饿的利器 StampedLock
高性能解决线程饥饿的利器 StampedLock
56 1
|
3月前
|
消息中间件 前端开发 NoSQL
腾讯面试:什么锁比读写锁性能更高?
在并发编程中,读写锁 ReentrantReadWriteLock 的性能已经算是比较高的了,因为它将悲观锁的粒度分的更细,在它里面有读锁和写锁,当所有操作为读操作时,并发线程是可以共享读锁同时运行的,这样就无需排队执行了,所以执行效率也就更高。 那么问题来了,有没有比读写锁 ReentrantReadWriteLock 性能更高的锁呢? 答案是有的,在 Java 中,比 ReentrantReadWriteLock 性能更高的锁有以下两种: 1. **乐观锁**:乐观锁是一种非阻塞锁机制,它是通过 Compare-And-Swap(CAS)对比并替换来进行数据的更改的,它假设多个线程(
39 2
|
13天前
|
存储 缓存 otter
一个无竞争的缓存
一个无竞争的缓存
16 1
|
1月前
|
安全 算法 编译器
C++一分钟之-内存模型与数据竞争
【7月更文挑战第10天】了解C++11内存模型对多线程编程至关重要。它定义了线程间同步规则,包括顺序一致性、原子操作和内存屏障。数据竞争可能导致不确定行为,如脏读和丢失更新。可通过互斥量、原子操作和无锁编程避免竞争。示例展示了`std::mutex`和`std::atomic`的使用。掌握内存模型规则,有效防止数据竞争,确保多线程安全和性能。
35 0
|
3月前
|
Java
什么锁比读写锁性能更高?
Java并发编程中,ReentrantReadWriteLock是高效的锁机制,但在高并发环境下,乐观锁(如CAS)和JDK 8引入的StampedLock可提供更高性能。StampedLock支持读锁、写锁和乐观读锁,其乐观读锁在读多写少的场景下能提升并发性能,通过tryOptimisticRead方法实现。当乐观读锁无效时,可无缝切换至悲观读锁。
【并发技术03】传统线程互斥技术—synchronized
【并发技术03】传统线程互斥技术—synchronized
|
存储 缓存 Java
【并发技术12】线程锁技术的使用(二)
【并发技术12】线程锁技术的使用
|
设计模式
【并发技术04】线程技术之死锁问题
【并发技术04】线程技术之死锁问题
|
安全 数据库
【并发技术06】线程范围内共享数据
【并发技术06】线程范围内共享数据