线程竞争与同步
背景介绍:
在多线程的环境里,如果共享资源没有上锁,将会出现共享数据混乱的情况。
在单核CPU系统里,系统以时间片调度的方式让多个程序轮流使用处理器,造成了【并发】的假象。
在进程/线程并发执行的过程中,进程/线程之间存在协作的关系,比如互斥、同步。
什么叫进程互斥?
两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与实践有关的错误,这种现象叫进程互斥。
操作系统如何实现进程/线程互斥:
- 锁:任何想进临界区的线程都必先加锁,完成访问后再解锁,释放临界资源。
- 忙等待锁(自旋锁):当线程获取不到锁时会一直循环,不做任何事情,直到锁可用。
- 无忙等待锁:获取不到锁是,不自旋,把当前线程放到锁等待队列,执行调度程序,把CPU让给其他线程执行。
- 信号量:表示资源的数量,对应的变量是一个sem变量。由两个原子操作PV的系统调用函数控制信号量(PV必须成对出现):
- P操作:进入临界区之前,将sem-1,如果sem<0,则进程/线程阻塞等待,否则继续。
- V操作:离开临界区之后,将sem+1,如果sem>=0,唤醒一个等待中的进程/线程。
通过互斥信号量方式,能保证临界区任何时刻只有一个线程在执行,达到了互斥效果。
什么叫进程同步?
异步环境下的一组并发进程因直接制约而互相发送消息、相互合作、相互等待,使得进程按一定的速度执行的过程称为进程间的同步。具有同步关系的一组并发进程叫合作进程。
使用PV信号量实现进程同步的演示流程如下:
以上参考:https://mp.weixin.qq.com/s/Akv6c4fGlpT4VlhRo3gscw