目录
1.进程控制的概念
进程由创建产生,由调度执行,由撤销消亡。
2.进程的创建
申请PCB空间,为新进程分配资源,把有关信息填入PCB,将PCB插入就绪队列中。
3.进程间互斥与同步的概念
因直接制约关系(各个程序段要求共享信息)而需要相互等待,相互合作,以达到各进程相互协调而执行的过程称为同步。
因间接制约关系(各个程序竞争使用同一个资源)而导致进程交替执行的过程称为互斥。
- 同步:多个进程按一定顺序执行;
- 互斥:多个进程在同一时刻只有一个进程能进入临界区。
4.临界资源和临界区
把某段时间只允许一个程序使用的资源称为临界资源。
把访问临界资源的代码段称为临界区。
5.同步机制应遵循的原则
空闲让进 忙则等待 有限等待 让权等待
6.信号量与P/V操作
信号量:表示临界资源可用的数目。
P/V操作:在信号量上定义了两个操作P原语和V原语。该信号量的值只能被P/V修改且不可被中断。
信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。
- down : 如果信号量大于 0 ,执行 -1 操作;如果信号量等于 0,进程睡眠,等待信号量大于 0;
- up :对信号量执行 +1 操作,唤醒睡眠的进程让其完成 down 操作。
down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。
如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。
7.生产者与消费者问题
问题分析:
同步关系:直接制约关系。
当生产者速度大于消费者时,生产者会阻塞,等消费者消费后才能继续生产产品。
互斥关系:直接制约关系。
缓冲池中只能由消费者或生产者其中之一使用。
设变量:
设 mutex 公有信号量 初值为1 用于实现临界区互斥
设 empty 生产者私有信号量 初值为n 表示空缓冲区数目
设 full 生产者私有信号量 初值为0 表示满缓冲区数目
设 整型 i , j 分别为空缓冲区的头指针和满缓冲区的头指针
注:p操作顺序不可颠倒。
代码:
semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;
int i = 0;
int j = 0;
void P(){
while(1){
produce next product;
p(empty);
p(mutex);
buf[i] = product;
i=(i+1)%n;
v(full);
v(mutex);
}
}
void C(){
while(1){
p(full);
p(mutex);
product = buf[j];
j=(j+1)%n;
v(empty);
v(mutex);
consume product;
}
}
int main(){
parbegin(p(),c());
}