学习进程的同步的时突然变的很浮躁,今天先跳到死锁
Deadlock 死锁
一组被阻塞的进程,每个进程持有一个资源,并等待获取集合中另一个进程持有的资源。
资源是什么?
操作系统中的一切都是资源
硬件资源 软件资源等等等等各种资源。
进程使用资源的过程:
Request open(), malloc(), wait() 请求资源
use 使用资源
Release 释放资源 close(), free(), signal()
平时就算定义一个整数,比如int a这样,也都有着进程使用资源的所有过程,只不过编译器在定义语法的时候已经帮助我们搞定了。
栈溢出
void* thread1(void * param){
for( ; ; ){
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
value++;
pthread_mutex_unlock(&mutex1);
pthread_mutex_unlock(&mutex2);
}
}
void* thread2(void * param){
for( ; ; ){
pthread_mutex_lock(&mutex2);
pthread_mutex_lock(&mutex1);
value++;
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
}
}
很明显,上面的样例就会造成死锁。
死锁发生的四个基本条件:
互斥条件 : 在任意时刻只有一个进程使用
保持等待:吃着碗里的看着锅里的
不可剥夺:一个资源被拿到后不会被强行剥夺
循环等待:一推进程在循环等待
有环的话可能有死锁,没环一定没死锁。
有环的时候:
如果每个资源只有一个。
如果每个资源有多个,就不一定了。
接下来进入重点
怎么解决死锁。
Deadlock prevention 死锁阻止
Deadlock aviodance 死锁避免
这俩是死锁永远不会发生
Deadlock
请听下回分解。。