竞争条件
定义:两个或者多个进程读写某些共享数据,而最后的结果取决于进程运行的时序的现象。
如何避免竞争条件:避免两个进程同时位于临界区中。
如何使得并发进程能够高效的运行:
- 不能同时位于临界区
- 不能对CPU的速度和数量做要求
- 临界区外的进程不得阻塞其他进程
- 进程不能无限期等待进入临界区
临界区
定义:对共享内存进行访问的程序片段。他不是一个区域,而是一个程序。
互斥
互斥:确保一个进程在使用一个共享变量或者文件的时候,其他进程不能进行同样的操作。
*** 互斥是避免竞争条件的手段 ***
实现互斥的方案
- 屏蔽中断法
- 锁变量法
- 严格轮换法
- Peterson解法
- 指令法(TSL或者XCHG)
以上的互斥方案都是基于忙等待的互斥,还有一种是非忙等待的互斥。
- 忙等待:连续测试一个变量,直到某个值出现为止
- 非忙等待的互斥:使用进程通信原语sleep&wakeup来使得进程睡眠和唤醒。
- 原语:若干条指令构成的程序段,执行的时候不可以被中断,即:要么全部执行完毕,要么全部都不执行。
- PV操作
- P操作:分配资源,信号量-1,如果结果<0,阻塞该进程放入等待队列并调度其他进程,否则进程继续执行。
- V操作:释放资源,信号量值+1,如果信号量还是<=0,从等待队列中唤醒一个进程,否则进程继续执行。
PV操作和唤醒睡眠操作一样,同样是原语。
信号量与互斥量
- 信号量:系统中可以使用的资源个数
- 互斥量:不需要计数的信号量,简化版本。
-
快速用户区互斥量
-
pthread的互斥量
-
pthread的另一种同步方式:条件变量(转CSAPP-线程笔记LINK)
-
管程
- 定义:一个由过程、变量、数据结构等组成的一个集合。进程在需要的时候调用管程中的过程。是一个模块、接口。
- 性质:任意时刻,管程中只能有一个活跃的进程。
- 实现:使用条件变量和wait signal操作。
管程互斥的实现由编译器负责,C语言不支持管程。
消息传递
- 使用send&recieve原语进行发送和接受消息。
- 信箱:一个用来对一定数量的消息进行缓冲的地方
屏障
- 用于进程组的同步
- 当所有进程到达屏障,则一起被释放,否则被挂起
其他IPC机制:RCU读-复制-更新机制
- 优点:不需要加锁