一、并发的原理
1、竞争条件发生在当多个进程或者线程在读写数据时,其最终结果依赖于多个进程的指令执行顺序。
2、临界资源:两个或更多的进程需要访问的不可共享的资源。
3、临界区:使用临界资源的那一部分代码。
4、互斥
互斥产生的两个问题:死锁、饥饿(如三个进程P1、P2、P3,访问权轮流授予P1,P2,而P3无法访问资源)
二、信号量
1、基本原理:为了在进程之间发信号,定义一个称为信号量的特殊变量,进程传送信号使用 semSignal(s),进程接收信号使用semWait(s)
2、定义:信号量是一个具有整数值的变量,在它之上定义三个原子操作:
- 一个信号量可以初始化成非负数。
- semWait 操作使信号量减1。如果值<0,则执行semWait 的进程被阻塞,否则进程继续执行。—— 让进程进入阻塞队列
- semSignal 操作使信号量加1。如果值 <=0(说明现在有进程正被阻塞),则被semWait 操作阻塞的进程将被解除。—— 将一个进程从阻塞队列放到就绪队列
信号量原语的定义
struct semaphone{
int count;
queueType queue;
}
void semWait(semaphore s)
{
s.count--;
if(s.count < 0)
{
place this process in s.queue;
block this process;
}
}
void semSignal(semaphore s)
{
s.count ++;
if(s.count <= 0)
{
remove a process P from s.queue;
place process P on ready list;
}
}
3、信号量的应用
- 互斥:每个进程在进入临界区之前执行semWait (s)
- 生产者/消费者问题: