计算机操作系统零散笔记——关于死锁(一)

学习进程的同步的时突然变的很浮躁,今天先跳到死锁

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
请听下回分解。。

发布了75 篇原创文章 · 获赞 26 · 访问量 7672

猜你喜欢

转载自blog.csdn.net/qq_40962234/article/details/104251992