菜鸟笔记
提升您的技术认知

操作系统笔记

进程,线程,协程与并行,并发进程线程协程的区别死锁进程,线程,多线程i++的线程安全性同步和异步孤儿进程和僵尸进程/proc进程信息linux中的分段和分页互斥量 mutex线程进程间通信进程创建进程优先级进程的基础知识进程与线程的区别(面试题)线程的控制(创建,终止,等待,分离)可重入 VS 线程安全死锁的概念一级缓存和二级缓存的理解一句话解说内存屏障 Memory barrierbrk(), sbrk() 用法详解malloc/free函数的简单实现一文讲透 “进程、线程、协程”Linux进程状态线程池的陷阱linux内核学习之进程和线程进程与线程的区别和联系内存寻址linux IO子系统和文件系统读写流程Page cache和buffer cache的区别与联系漫谈linux文件IO多线程和多进程的区别内存泄漏字节、字、位、比特的概念和关系如何避免死锁ANSI是什么编码?CPU寻址范围(寻址空间)CPU 使用率低高负载的原因创建多少个线程合适操作系统下spinlock锁解析、模拟及损耗分析线程堆栈堆和栈的内存分配堆和栈的概念和区别堆和栈的区别,申请方式,程序的内存分配什么是 POD 数据类型Linux内存分配小结--malloc、brk、mmap系统调用与内存管理(sbrk、brk、mmap、munmap)进程描述和控制CPU执行程序的原理编译的基本概念Linux虚拟地址空间布局一个程序从源代码到可执行程序的过程程序的运行机制——CPU、内存、指令的那些事分页内存管理——虚拟地址到物理地址的转换深刻理解Linux进程间通信fork之后父子进程的内存关系fork之后,子进程继承了父进程哪些内容关于协程及其锁的一些认识对协程的一点理解std::thread join和detach区别CAS和ABA问题CAS算法锁和无锁无锁队列的实现Lock-Free 编程锁开销优化以及CAS

死锁

阅读 : 298

死锁的定义:

一组进程中,每个进程都无限等待该组进程中另一进程所占有的资源,因而永远无法得到资源,这种现象称为进程死锁,这一组进程就称为死锁进程。

死锁的四个条件:

1、互斥使用(资源独占:打印机,十字路口)

一个资源每次只能给一个进程使用

2、占有且等待(请求和保持,部分分配:十字路口)

进程在申请新的资源的同时保持对原有资源的占有

3、不可抢占(不可剥夺:十字路口)

资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放

4、循环等待(十字路口)

存在一个进程等待队列{P1,P2,...,Pn},

其中P1等待P2占有的资源,P2等待P3占有的资源,...,Pn等待P1占有的资源,形成一个进程等待环路

死锁的预防:破坏产生死锁的四个条件之一

1、破坏“互斥使用/资源独占”条件

资源转换技术:把独占资源变成共享资源(SPOOLing技术的引入,设计一个“守护进程/线程”负责管理打印机)

2、破坏“占有且等待”条件

方案1、要求每个进程在运行前必须一次性申请它所要求的所有资源。问题:资源利用率低;饥饿 现象。

方案2、允许进程动态申请资源的前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态前,释放已占有的全部资源,若需要再重新申请。

3、破坏“不可抢占”条件

实现方案:可以通过操作系统抢占这一资源(两个进程优先级不同)

局限性:适用于状态易于保存和恢复的资源

CPU、内存(RAM)

4、破坏“循环等待”条件

通过定义资源类型的线性顺序实现

实施方案:资源有序分配法(哲学家就餐问题)

解决死锁的方法

1、不考虑此问题(鸵鸟算法)

2、死锁预防:静态策略:设计合适的资源分配算法,不让死锁发生

3、死锁避免:动态策略:以不让死锁发生为目标,跟踪并评估资源分配过程,根据评估结果决策是否分配(银行家算法)

定义:在系统运行的过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统发生死锁或可能发生死锁,则不予分配,否则予以分配。

安全序列:一个进程序列{P1,..Pn}是安全的,如果对于每一个进程Pi1(1<= i <= n):

它以后还需要的资源量不超过系统当前剩余资源量与所有进程Pj(j<i)当前占有资源量之和

则称系统处于安全状态

4、让死锁发生:死锁的检测与解除

检测的时机:1、当进程资源请求得不到满足而等待时检测死锁。2、定时检测。3、系统资源利用率下降时检测死锁。

死锁的解除:(前两个消耗资源大)

1、撤销所有死锁进程

2、进程回退(Roll back)再启动

3、按照某种原则逐一撤销死锁进程,直到...

4、按照某种原则逐一抢占资源(资源被抢占的进程必须回退到之前的对应状态),直到...

一种简单的死锁检测算法

设置一张资源分配表、设置一张进程等待表,记录进程与要申请资源之间的关系,若出现环路则产生死锁。