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

操作系统篇--八股文学习第十二天| 什么是死锁,如何避免死锁?,介绍一下几种典型的锁,讲一讲你理解的虚拟内存

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

答: 

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

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

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

避免死锁:通过破坏死锁的四个必要条件之一来预防死锁。比如破坏循环等待条件,让所有进程按照相同的顺序请求资源。 检测死锁:通过检测系统中的资源分配情况来判断是否存在死锁。例如,可以使用资源分配图或银行家算法进行检测。 解除死锁:一旦检测到死锁存在,可以采取一些措施来解除死锁。例如,可以通过抢占资源、终止某些进程或进行资源回收等方式来解除死锁。

介绍一下几种典型的锁

答: 

  • 互斥锁:互斥锁是一种最常见的锁类型,用于实现互斥访问共享资源。在任何时刻,只有一个线程可以持有互斥锁,其他线程必须等待直到锁被释放。这确保了同一时间只有一个线程能够访问被保护的资源。
  • 自旋锁:自旋锁是一种基于忙等待的锁,即线程在尝试获取锁时会不断轮询,直到锁被释放。

其他的锁都是基于这两个锁的

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

讲一讲你理解的虚拟内存

答: 

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

需要虚拟内存的原因:

  • 内存扩展: 虚拟内存使得每个程序都可以使用比实际可用内存更多的内存,从而允许运行更大的程序或处理更多的数据。
  • 内存隔离:虚拟内存还提供了进程之间的内存隔离。每个进程都有自己的虚拟地址空间,因此一个进程无法直接访问另一个进程的内存。
  • 物理内存管理:虚拟内存允许操作系统动态地将数据和程序的部分加载到物理内存中,以满足当前正在运行的进程的需求。当物理内存不足时,操作系统可以将不常用的数据或程序暂时移到硬盘上,从而释放内存,以便其他进程使用。
  • 页面交换:当物理内存不足时,操作系统可以将一部分数据从物理内存写入到硬盘的虚拟内存中,这个过程被称为页面交换。当需要时,数据可以再次从虚拟内存中加载到物理内存中。这样可以保证系统可以继续运行,尽管物理内存有限。
  • 内存映射文件:虚拟内存还可以用于将文件映射到内存中,这使得文件的读取和写入可以像访问内存一样高效。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Typescript配置文件(tsconfig.json)详解系列五:allowArbitraryExtensions
  • PointNet点云语义分割
  • 使用Apache http client发送json数据(demo)
  • 02:【stm32】工程模板的创建
  • 考研英语二--小作文如何写
  • 苹果iPhone 16 Pro系列有望支持Wi-Fi 7,再也不说苹果信号不好了
  • Python | Leetcode Python题解之第315题计算右侧小于当前元素的个数
  • 08.02_111期_Linux_NAT技术
  • Binder、 AIDL 、IPC 大展神威
  • linux进程控制——进程等待——wait、waitpid
  • uniapp自定义网格布局用于选择金额、输入框焦点事件以及点击逻辑实战
  • 【面试题】C++:面向对象的三大特性?
  • Cocos Creator文档学习记录
  • Java二十三种设计模式-外观模式(9/23)
  • 示例:在ML.NET中应用Model Builder模型生成器构建图片分类模型
  • JavaScript-如何实现克隆(clone)函数
  • [NodeJS] 关于Buffer
  • 【译】理解JavaScript:new 关键字
  • 07.Android之多媒体问题
  • bootstrap创建登录注册页面
  • co模块的前端实现
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • javascript 总结(常用工具类的封装)
  • JS笔记四:作用域、变量(函数)提升
  • select2 取值 遍历 设置默认值
  • underscore源码剖析之整体架构
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • ------- 计算机网络基础
  • 今年的LC3大会没了?
  • 聊聊flink的TableFactory
  • 你真的知道 == 和 equals 的区别吗?
  • 七牛云假注销小指南
  • 前端之React实战:创建跨平台的项目架构
  • 前言-如何学习区块链
  • 深入 Nginx 之配置篇
  • 使用 @font-face
  • 异常机制详解
  • 正则学习笔记
  • ​io --- 处理流的核心工具​
  • # C++之functional库用法整理
  • # wps必须要登录激活才能使用吗?
  • #if #elif #endif
  • #stm32驱动外设模块总结w5500模块
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (35)远程识别(又称无人机识别)(二)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (接口自动化)Python3操作MySQL数据库
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (四)JPA - JQPL 实现增删改查
  • (五)关系数据库标准语言SQL
  • (原創) 未来三学期想要修的课 (日記)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)memcache、redis缓存
  • (转)Sublime Text3配置Lua运行环境