当前位置: 首页 > article >正文

DAY11:什么是死锁,如何避免死锁 | 几种典型的锁 | 虚拟内存的概念和用处

目录

什么是死锁,如何避免死锁

死锁的概念:

避免死锁的方法: 

几种典型的锁

互斥锁:

自旋锁:

虚拟内存 

需要虚拟内存的原因:  


什么是死锁,如何避免死锁

死锁的概念:

死锁是系统中两个或多个进程在执行过程中,因争夺资源而造成的一种僵局。当每个进程都持有一定的资源并等待其他进程释放它们所需的资源时,如果这些资源都被其他进程占有且不释放,就导致了死锁。

死锁只有同时满足以下四个条件才会发生:

  • 互斥条件:一个进程占用了某个资源时,其他进程无法同时占用该资源。
  • 请求保持条件:一个进程因为请求资源而阻塞的时候,不会释放自己的资源。
  • 不可剥夺条件:资源不能被强制性地从一个进程中剥夺,只能由持有者自愿释放。
  • 循环等待条件:多个进程之间形成一个循环等待资源的链,每个进程都在等待下一个进程所占有的资源。

避免死锁的方法: 

可以通过破坏死锁的四个必要条件之一来预防死锁:

1. 破坏循环等待条件,让所有进程按照相同的顺序请求资源。

2. 检测死锁:通过检测系统中的资源分配情况来判断是否存在死锁。例如,可以使用资源分配图或银行家算法进行检测。

3. 解除死锁:一旦检测到死锁存在,可以采取一些措施来解除死锁。例如,可以通过抢占资源、终止某些进程或进行资源回收等方式来解除死锁。


几种典型的锁

互斥锁:

互斥锁是一种最常见的锁类型,用于实现互斥访问共享资源。在任何时刻,只有一个线程可以持有互斥锁,其他线程必须等待直到锁被释放。这确保了同一时间只有一个线程能够访问被保护的资源。

自旋锁:

自旋锁是一种基于忙等待的锁,即线程在尝试获取锁时会不断轮询,直到锁被释放。

其他的锁都是基于这两个锁的,分别有:读写锁,悲观锁,乐观锁。

  • 读写锁:允许多个线程同时读共享资源,只允许一个线程进行写操作。分为读(共享)和写(排他)两种状态。
  • 悲观锁:认为多线程同时修改共享资源的概率比较高,所以访问共享资源时候要上锁。
  • 乐观锁:先不管,修改了共享资源再说,如果出现同时修改的情况,再放弃本次操作。

虚拟内存 

虚拟内存是指在每一个进程创建加载的过程中,会分配一个连续虚拟地址空间,它不是真实存在的,而是通过映射与实际物理地址空间对应,这样就可以使每个进程看起来都有自己独立的连续地址空间,并允许程序访问比物理内存RAM更大的地址空间, 每个程序都可以认为它拥有足够的内存来运行。

需要虚拟内存的原因: 

1. 内存扩展:虚拟内存使得每个程序都可以使用比实际可用内存更多的内存,从而允许运行更大的程序或处理更多的数据。

2. 内存隔离:虚拟内存还提供了进程之间的内存隔离,每个进程都有自己的虚拟地址空间,因此一个进程无法直接访问另一个进程的内存。

3. 物理内存管理:虚拟内存允许操作系统动态地将数据和程序的部分加载到物理内存中,以满足当前正在运行的进程的需求。当物理内存不足时,操作系统可以将不常用的数据或程序暂时转移到硬盘上,从而释放内存,以便其他进程使用。

4. 页面交换:当物理内存不足时,操作系统可以将一部分数据从物理内存写入到硬盘的虚拟内存中,这个过程被称为页面交换。当需要时,数据可以再次从虚拟内存中加载到物理内存中。这样可以保证系统可以继续运行,尽管物理内存有限。

5. 内存映射文件:虚拟内存还可以用于将文件映射到内存中,这使得文件的读取和写入可以像访问内存一样高效。


http://www.kler.cn/a/286898.html

相关文章:

  • 数据库事务详解
  • vue3搭建实战项目笔记
  • 小米Vela操作系统开源:AIoT时代的全新引擎
  • 为什么redis会开小差?Redis 频繁异常的深度剖析与解决方案
  • 在centos上编译安装opensips【初级-默认安装】
  • React 表单处理与网络请求封装详解[特殊字符][特殊字符]
  • [进阶]面向对象之static关键字
  • JVM:浅谈JVM调优策略
  • 在VScode中使用Git将本地已有文件夹提交到Github仓库以便于使用版本控制进行项目开发
  • javaSSMmysql宠物领养系统的设计与实现26292-计算机毕业设计项目选题推荐(附源码)
  • 3.6 Browser -- useFullscreen
  • 深度解析C++中函数重载与引用
  • 编译原理简介
  • 【例003】利用MATLAB绘制有趣平面图形
  • python脚本如何用sleep
  • 深度学习模型量化方法
  • 深入探索 HarmonyOS 的 CustomDialog 组件:高级特性与使用场景
  • TCP和UDP的主要区别以及应用场景
  • 【数据结构】二叉树的链式结构,二叉树的遍历,求节点个数以及高度
  • UE5 Widget文件编译Bug
  • 介绍一下SOME/IP 的Session handing功能
  • vscode 远程SSH连接并配置C/C++开发环境
  • 基于web的校园社区平台
  • axios发送post请求实例
  • Node 缓存、安全与鉴权
  • 【网络安全】WordPress Uncontrolled Resource Consumption