进程与线程之管程、死锁和饥饿

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40167046/article/details/100582647

一、管程

1.采用封装的思想

2.解决信号量机制或者PV操作编程麻烦的、易出错等问题

3.可看做一个软件模块,将共享的变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发

4.管程的组成(封装):共享数据结构、对数据结构初始化的语句、一组用来访问数据的过程即是函数

    例如:enter过程、leave过程、条件型变量c、wait(c) 、signal(c)

5.基本特征:各外部进程/线程只能通过管程提供特定“入口”(接口)才能访问共享数据每次仅允许一个进程/线程在管程内执行某个内部过程

补充:各进程必须互斥访问管程由编译器实现的;可在管程中设置条件变量及等待wait/唤醒signal操作以解决同步问题

二、死锁和饥饿

1.死锁现象:某计算机系统中只有一台打印机和一台输出设备,进程P1正在占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。

2.死锁(各进程):并发环境下,互相等待,各进程都阻塞,无法继续向前推进

   饥饿(某进程):某进程无法继续向前推进

3.产生死锁必须同时满足4个条件:

                互斥条件;不剥夺条件(只能主动释放,不能由其他进程强行夺走);请求和保持条件;循环等待条件 

举例:如果你手上拿着一个苹果不吃,别人也无法抢走,这就是不可剥夺条件;如果你左手拿一个苹果,允许右手再去拿一个,这就是请求和保持条件。

4.产生死锁的时机:对不可剥夺资源的不合理分配

5.死锁的处理----不允许死锁发生----静态策略:预防(破坏4个必要条件)

破坏互斥条件:SPOOLing(假脱机)技术,允许设备共享使用;

破坏不剥夺条件:常用于状态易于保存和回复的资源,如CPU的寄存器及内存资源;

破坏请求和保护条件:采用预先静态分配,进程在运行前一次申请完它所需的全部资源,可能会导致系统资源浪费和饥饿现象;

破坏循环等待条件:采用顺序资源分配法,并对系统中的资源进行编号,必须按编号顺序申请。

6.死锁的处理----不允许死锁发生----动态策略:避免

银行家算法:n种进程,m种资源

检查此次申请是否超过之前声明的最大需求数------>检查此时系统剩余的可用资源是否还能满足这次请求(满足为安全,不满足为不安全)----> 试探分配,更改各数据结构---->用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法

检查当前的剩余可用资源是否能满足某个进程的最大需求(满足为安全,不满足为不安全)---->如果满足,把该进程加入安全序列,并把该进程持有资源回收----->所有进程全部能加入安全序列即是安全状态,否则系统处于不安全状态

7.死锁的处理----允许死锁发生----死锁的检测和解除

检测

补充:数据结构(有向图):两结点:资源和进程;两边 (请求:进程--->资源,分配:资源----->进程)

死锁定理: 资源分配图中找出一条有向边与即不阻塞又不是孤点的进程Pi相连,且该邮箱变对应资源申请数小于等于系统空闲资源数,并简化,当且仅当资源分配图不可完全简化时会发生死锁。

解除

资源剥夺法(挂起某些死锁进程并抢夺它的资源)、终止进程法(强制撤销,剥夺资源)、进程回退法(让进程回退到足以避免死锁的地步)

猜你喜欢

转载自blog.csdn.net/qq_40167046/article/details/100582647