从0回顾操作系统---系列三

简介: 死锁与活锁1、什么是死锁?死锁产生的条件?什么是死锁:● 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。● 通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。死锁产生的四个必要条件:(有一个条件不成立,则不会产生死锁)● 互斥条件:一个资源一次只能被一个进程使用;● 请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放;● 不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺;● 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关

死锁与活锁

1、什么是死锁?死锁产生的条件?

什么是死锁

  • 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。
  • 通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。

死锁产生的四个必要条件(有一个条件不成立,则不会产生死锁)

  • 互斥条件:一个资源一次只能被一个进程使用;
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放;
  • 不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺;
  • 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系。

2、如何解决线程死锁?

只要破坏产生死锁的四个条件中的其中一个就可以了

  • 破坏互斥条件 :这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)
  • 破坏请求与保持条件:  一次性申请所有的资源。
  • 破坏不剥夺条件:  占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
  • 破坏循环等待条件:  靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。

3、如何检测死锁?

可以通过检测有向图中是否存在环来检测,从一个节点出发进行 dfs,对访问过的节点进行标记,如果访问到了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。

4、如何解除死锁?

解除死锁的主要方法有:

1. 资源剥夺法:

  • 挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。
  • 但是应防止被挂起的进程长时间得不到资源而饥饿。

2. 撤销进程法(或称终止进程法):

  • 强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。
  • 这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。

3. 进程回退法:

  • 让一个或多个死锁进程回退到足以避免死锁的地步。
  • 要求系统要记录进程的历史信息,设置还原点。

5、举一个死锁的例子?

假设我们有两个线程,分别是线程A和线程B,假设线程A现在持有了锁A,线程B持有了锁B,然后线程A尝试去获取锁B,当然它获取不到,因为线程B还没有释放锁B。然后线程B又来尝试获取锁A,同样线程B也获取不到锁A,因为锁A已经被线程A持有了。这样一来,线程A和线程B就发生了死锁,因为它们都相互持有对方想要的资源,却又不释放自己手中的资源,形成相互等待,而且会一直等待下去。

6、什么是活锁活锁和死锁的区别?

概念:

  • 活锁指的是,两个线程都是处于活跃状态(Runnable),但是呢两个线程分别相互推脱任务,导致线程繁忙,最终程序无法继续向前运行。

活锁和死锁的区别

  • 处于活锁的实体是在不断的改变状态,这就是所谓的“ 活” , 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

解决活锁

  • 为解决活锁可以引入一些随机性,例如如果检测到冲突,那么就暂停随机的一定时间进行重试,这会大大减少碰撞的可能性。

7、什么是饥饿?死锁和饥饿的共同点与区别?

饥饿

  • 由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿。

共同点:

  • 都是进程无法顺利向前推进的现象 (故意设计的死循环除外)

区别:

  • 死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。
  • 可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的I/o设备),也可能是就绪态(长期得不到处理机)
相关文章
|
4月前
|
Java 关系型数据库 Linux
在Linux中,操作系统的主要组成部分有哪些?
在Linux中,操作系统的主要组成部分有哪些?
|
5月前
|
Linux 调度
部署03---Linux操作系统的诞生,Linux操作系统由系统的内核和系统的操作系统所组成
部署03---Linux操作系统的诞生,Linux操作系统由系统的内核和系统的操作系统所组成
|
7月前
|
存储 算法 C语言
从0开始回顾操作系统---系列四
内存管理 1、什么是内存管理 操作系统对内存的划分和动态分配就是内存管理,主要可以分为: ● 内存空间的扩充(实现虚拟性) ● 内存空间的分配与回收 ● 地址转换:操作系统负责实现逻辑地址到物理地址的转换 ● 存贮保护:保证各进程在自己的内存空间内运行,不会越界访问 2、内存管理机制和内存管理方式有哪些? 1. 分块管理 ● 是连续管理的一种,把内存分为几个大小相等且固定的块,每个进程占用其中一个,如果进程很小的话,会浪费大量的空间。已经淘汰。 2. 分页管理 ● 把内存分为若干个很小的页面,相对比分块的划分力度更大一些。提高内存利用率。减少碎片,页式管理通过页表对应逻辑地址和物理地址。
|
7月前
|
调度 数据安全/隐私保护 数据格式
从0开始回顾操作系统---系列一
概述 1、什么是操作系统 ● 操作系统简称OS,负责管理协调计算机硬件与软件资源工作的系统软件。 ● 屏蔽了硬件层的复杂性,为上层应用软件与用户提供易用的服务。 2、操作系统主要有哪些功能? 操作系统最主要的功能: ● 处理器(CPU)管理:CPU的管理和分配,主要指的是进程管理。 ● 内存管理:内存的分配和管理,主要利用了虚拟内存的方式。 ● 外存管理:外存(磁盘等)的分配和管理,将外存以文件的形式提供出去。 ● I/O管理:对输入/输出设备的统一管理。 除此之外,还有保证自身正常运行的健壮性管理,防止非法操作和入侵的安全性管理。 3、什么是系统调用?有哪几类? 根据进程访问资源的特点,
|
7月前
|
存储 Java
从0开始回顾操作系统---系列六
IO多路复用 1、讲一讲IO多路复用? IO多路复用模型指的是:使用单个进程/线程同时处理多个网络连接IO,他的原理就是select、poll、epoll 不断轮询所负责的所有 socket,当某个socket有数据到达了,就通知用户进程。该模型的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。 2、select、poll 和 epoll 之间的区别 1. select:时间复杂度 O(n) ● select 仅仅知道有 I/O 事件发生,但并不知道是哪几个流,所以只能无差别轮询所有流,找出能读出数据或者写入数据的流,并对其进行操作。所以 select 具有 O(n) 的无差
|
7月前
|
消息中间件 缓存 算法
从0开始回顾操作系统---系列二
进程管理 1、进程和线程的区别? 进程:一个正在运行中的程序就是一个进程,进程包括程序段、数据段、PCB三部分。 ● 程序段就是程序的代码; ● 数据段就是程序运行时产生的数据(比如全局变量、局部变量等); ● PCB中包含操作系统对其进行管理的各种信息(如进程标识符PID,进程当前状态,进程优先级) 线程:线程是属于进程的,是一个基本的 CPU 执行单元,是程序执行流的最小单元。 主要区别如下: ● 调度:进程是资源分配的基本单位,线程是程序执行的基本单位。 ● 开销:线程上下文切换开销小,进程线程间切换开销大。 ● 切换: 同一进程间线程切换不会引起进程切换,不同进程间线程切换会引
|
7月前
|
算法 安全 程序员
从0开始回顾操作系统---系列五
文件管理 1、虚拟文件系统? ● 文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统(Virtual File System,VFS)。 ● VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。 2、硬链接和软链接有什么区别? ● 硬链接就是在目录下创建一个条目,记录着文件名与 inode 编号,这个 inode 就是源文件的 inode。删除任意一个条目,文件还是存在,只要引用数量不为 0。但是硬链接有限制,它不能跨越文件系统,也不
|
7月前
|
Linux Android开发 iOS开发
操作系统的作用与常见操作系统介绍
操作系统的作用与常见操作系统介绍
|
Linux Shell C语言
|
Linux 编译器 C语言
【Linux:程序地址空间--原来操作系统也喜欢画大饼】
【Linux:程序地址空间--原来操作系统也喜欢画大饼】
95 0
下一篇
DataWorks