并发的各种概念定义

2019-11-12  本文已影响0人  rock_fish
数据竞争(Data Race)

数据共享读, 数据可写(会发生变化)

竞态条件(Race Condition)
互斥

进程、线程竞争使用具有排它性的共享资源。

临界资源

临界资源、互斥资源或者共享变量(一次值允许一个进程、线程使用)。

临界区(互斥区)

对临界资源实施操作的程序片段

同步

系统中多个进程、线程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。
关键字:多*程,通信,时序(协作)

同步机制

为何叫同步机制,而不是叫别的??因为常常把互斥看做一种特殊的同步,实际上同步机制技能解决互斥问题也能解决同步问题,

线程上下文

是指再某一时间CPU寄存器和程序计数器的内容

Tss任务状态段,位于内存中的一段数据

经典同步机制-信号量以及PV操作

信号量:
描述:进程、线程间传递信息的一个整数值
定义:

struc semaphore{
  int count
  queueType queue;//等待队列
}

操作:初始化 ,P和V(P、v分别是荷兰语的test(proberen)和 increment(verhogen))

P V
DOWN UP
- +
p(s){
  s.count--;
  if(s.count < 0){
    该进程状态设置为阻塞状态;
    将该进程插入s.queue这个等待队列末尾
    进程、线程让出cpu,操作系统调度选择新的线程、进程来运行;
  }
  //如果count 不小于0 ,那么继承继续持有cpu,继续运行。
}
v(s){
  s.count++;
  if(s.count <= 0){
    唤醒s.queue这个等待队中等待的一个进程;
    将其状态设置为就绪态,并将其插入就绪队列。
  }
  //如果count > 0,继续持有cpu,继续运行。
}

如何解决互斥和同步的问题?

同步机制-管程

如何解决互斥和同步问题

管程的大麻烦
image.png
HOARE管程

Q等待
Q被放置到条件变量等待队列中。
P唤醒Q P等待Q执行;
1.Q在条件变量队列中被移除唤醒,
2.P被放置到紧急等待队列中,
3.优先级 紧急等待队列 > 入口等待队列
缺点:两次进程、线程切换
P唤醒Q,P:活动,Q:等待
P等待Q, P: 休眠,Q:激活;Q执行完,P激活。

image.png image.png

条件变量的实现

wait(c)操作:

signal(c)操作:
c:链为空,则相当于空操作,执行此操作的进程继续执行;否则唤醒第一个等待着,执行此操作的进程进入紧急等待队列末尾。

管程的实现

实现途径:

MESA管程
image.png
  1. 当不知道多少进程被激活时候,这种方式非常方便。
  2. 无法判准确判读按激活那个进程/线程,也可以使用广播。
CAS

CAS(Compare and swap ):比较并交换
白话说是 ,如果你是nn的情况下(比较),那么我才要把你更新成mm(交换);如果..那么.. 对应 and;所以是比较并交换。
JUC里的AtomicInteger,AtomicBoolean,AtomicLong等内部都用CAS操作来实现原子操作的功能。

ABA

ABA是一种现象,即从A变为B,又从B变为A,如果第一次看到第一个A,第二次看到第二个A, 两个A都是A,好像没有变化,但是其实漏掉中间状态B。如果我们的程序要求区分第一个A和第二个A,即认为两个A不同,且能区别,那只能通过附加的版本信息来标识区分。举个例子昨天的你和今天的你 都是你 ,但是又不是相同的你,如何区分两个你呢,比如今天的你是xx年xx月xx日的你,那么昨天的你就是xx年xx月mm日的你,附加上版本信息(这里用了日期)。
数据库的乐观锁,一般也都是采用加上一个Version字段,不但目标值要相同,版本也要相同。
JUC中的AtomicStampedReference,就是提供引用+stamp(版本)的方式来增强CAS的实现,我们可以借助它来避免ABA问题

自旋
while(xxx){
    //获取最新的值
   currentValue = get();
   // cas操作成功了,就退出;
   if(true == CAS(... , currentValue,destValue)){
      break;
    }
    //cas操作不成功,继续循环。这个循环的线程中不会主动的释放CPU的使用权。
}
公平锁 && 非公平锁

多个线程都申请持有锁,锁同一时刻只能被一个线程持有;
当持有锁的线程使用完毕,释放锁之后,其他线程开始抢占锁,其中一个线程拿到锁之后,其他线程等待锁释放后再争夺。

上一篇下一篇

猜你喜欢

热点阅读