Notes: Process in Operation System and Dead Lock 操作系统中的进程和死锁问题

进程是CPU一系列动作的抽象。下面这个例子很好地说明了程序和进程的关系[1]:


一个好厨艺的父亲正在为他的女儿制作生日蛋糕。做蛋糕的食谱,就是程序,父亲就是CPU,而做蛋糕的原料(面粉、鸡蛋等)就是输入数据。进程就是父亲阅读食谱、取来原料以及烘制蛋糕等一系列动作的总和。


进程有三种状态:运行、就绪以及阻塞。三种状态的转换关系如图[1]:




进程从运行到阻塞的转换发生在等待输入数据时,例如linux的管道命令,如果前一个处理数据的命令还没有输出,则管道的后一个命令的进程就进入了阻塞状态。造成进程的阻塞状态还有另一个原因,就是进程申请不到所有其需要的资源(包括只申请到了部分资源的时候)。


阻塞状态的进程一旦等到了数据,就转到就绪状态。如果运气好的话,刚好轮到它运行,则重新回到运行状态。


进程中有一类进程是一直在后台潜伏着,时常属于阻塞状态,一旦收到输入,则变为就绪-->运行状态。这种进程称之为守护进程(daemon process)。


进程的终止有四种情况:

1/ 正常运行结束,返回结果;

2/ 运行发生错误,返回错误的信号;

3/ 发生系统错误,如资源不足等,被迫终止;

4/ 系统人为的发送kill信号去终止该进程;


注意,无论是linux还是windows,kill信号只会影响到对应PID的进程,而不会连累其它的子进程。但是,在UNIX当中,存在进程组的概念,父进程和其创建的子进程属于同一个进程组,当用户向计算机发送信号时,该信号会给与其相关的进程组的所有成员发送,每一个成员都可以捕获该信号。但Windows默认每个进程的地位都是相同的。


---------------------------------------------------------------------------------------------- 


通常,在linux终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。

语  法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

补充说明:kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。 
参  数:
-l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。 
-s <信息名称或编号>  指定要送出的信息。 
[程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。


root用户将影响用户的进程,非root用户只能影响自己的进程。

------------------------------------------------------------------------------------------------


由于进程可能存在着等待另一个进程的输入的关系,且阻塞(休眠)时没有放弃已经获得的资源的时候,有可能会引发死锁的问题(dead lock)。


在说死锁问题前,要讲述一下可抢占资源和不可抢占资源的区别:可抢占的意思是当另一个进程从当前占用它的进程中把它抢过来使用时,并不会有严重的后果。像存储器就是可抢占资源。但不可抢占资源,如打印机,如果一个进程在另一个进程正在进行打印作业的时候,抢占了打印机,则打印出来的文档就会错乱。


死锁的定义是,当前进程集合中每一个进程都在等待只能由其它进程体用的资源,且没有一个进程主动放弃手中的资源,那么这个进程集合就是死锁的。


Coffman总结了发生死锁的必要条件:

1/ 资源要不已分配,要不就是可用;

2/ 进程可以先占用可用的资源,再继续申请目前已分配的资源;

3/ 所有的资源不可抢占,只能等占有的进程主动释放,所有的进程只有当完成作业时,才主动释放进程;


Holt使用了有向图对进程、资源间的关系进程了建模:


方框代表资源,圆形代表进程,由资源指向进程,代表该资源已经被该进程所占有,由进程指向资源,代表该进程正在申请该资源且该进程属于阻塞等待的状态。




在建模的有向图中出现了环路的情况,就是该进程集合中出现了死锁的情况【1】。


处理死锁的问题有四种方法:

1、 最简答的鸵鸟算法 -- 把头埋进沙子里,忽略这个问题;

2、检测死锁是否发生,如果发生了便想方法恢复;


检测方法:① 对每一种资源只有一种实例的情况,画出Holt的有向图,检查是否存在环路;② 对每一种资源都有多个实例的情况,画出资源存在的向量E;资源可申请的向量A和已分配资源向量P,三者关系是:E = A + P,然后画出进程资源分配矩阵C 和 当前请求矩阵R,矩阵每一个行代表一个进程,每一列代表一类资源。然后入下面的例子进行检测【1】:


首先寻找是否有进程能被满足,对比请求矩阵和A向量就可得到结果。如果有,则得出下一步的可用资源向量和请求矩阵以及分配矩阵。再看看能不能满足另一个进程。如果最终所有的进程都能够满足,则不存在死锁集合。(注意,死锁可能只存在于当前进程集合的子集合,当有一个进程被满足后,剩下两个进程发生死锁的情况)。


恢复的方法有:① 抢占恢复,但对于不可抢占资源是不可行的; ② 回滚恢复,不断创建检查点;③ 杀死进程恢复,存在很高的风险。


3、动态避免死锁,系统在分配资源前检测是否每次分配后系统都处于安全状态,是则进行分配,否则不分配。这种检测是否安全继而决定是否分配资源的算法称之为银行家算法(banker‘s algorithm)


安全状态指的是目前存在一种把现有的可分配资源的分配顺序,使当前进程集的所有进程依次完成作业并释放资源,则称当前状态是安全的。


一种资源对应一个实例的时候,用简答的表格图就可以判断当前状态是否安全:




当一种资源对应多个实例时,使用矩阵+向量的模式:








4/ 破坏死锁的必要条件从而预防死锁的放生。


Reference:

[1] Andrew S. Tanenbaum <Operation System>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值