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

操作系统复习

一 .​​操作系统中的进程与线程​

​1. 进程(Process)​
  • ​定义​​:进程是操作系统资源分配的基本单位,是程序的一次执行实例。每个进程拥有独立的地址空间、代码、数据和系统资源(如文件、内存、CPU 时间等)。
  • ​特点​​:
    • ​独立性​​:进程之间相互隔离,一个进程崩溃不会直接影响其他进程。
    • ​资源开销大​​:创建、切换和销毁进程需要较高的系统开销。
    • ​通信复杂​​:进程间通信(IPC)需要借助操作系统提供的机制(如管道、消息队列、共享内存等)。
​2. 线程(Thread)​
  • ​定义​​:线程是 CPU 调度的基本单位,是进程内的一个执行流。一个进程可以包含多个线程,它们共享进程的地址空间和资源。
  • ​特点​​:
    • ​轻量级​​:线程的创建、切换和销毁比进程更快,资源开销更小。
    • ​共享资源​​:同一进程内的线程共享内存、文件等资源,通信更高效。
    • ​并发执行​​:多线程可以实现并行计算,提高程序执行效率。
​3. 进程 vs. 线程​
​特性​​进程​​线程​
​资源占用​独立地址空间,开销大共享进程资源,开销小
​创建/切换速度​
​通信方式​IPC(管道、共享内存等)直接共享内存,更高效
​独立性​崩溃不影响其他进程一个线程崩溃可能导致整个进程崩溃
​适用场景​需要高隔离性的任务(如浏览器)需要高并发的任务(如Web服务器)
​4. 多线程 vs. 多进程​
  • ​多进程​​:

    • ​优点​​:稳定性高,一个进程崩溃不会影响其他进程。
    • ​缺点​​:资源占用大,通信复杂。
    • ​适用场景​​:需要高安全性和隔离性的应用(如 Chrome 浏览器采用多进程架构)。
  • ​多线程​​:

    • ​优点​​:通信高效,资源占用小,适合并发计算。
    • ​缺点​​:线程间共享数据可能导致竞争条件(Race Condition),需要同步机制(如锁、信号量)。
    • ​适用场景​​:需要高并发的任务(如 Web 服务器、游戏引擎)。
​5. 线程同步机制​

由于线程共享内存,可能导致数据竞争(Data Race),因此需要同步机制:

  • ​互斥锁(Mutex)​​:确保同一时间只有一个线程访问共享资源。
  • ​信号量(Semaphore)​​:控制多个线程对资源的访问数量。
  • ​条件变量(Condition Variable)​​:让线程等待某个条件满足后再执行。
  • ​读写锁(Read-Write Lock)​​:允许多个线程同时读,但写操作独占资源。
​6. 进程间通信(IPC)方式​

由于进程间内存隔离,通信需要特殊机制:

  • ​管道(Pipe)​​:单向通信,适用于父子进程。
  • ​消息队列(Message Queue)​​:进程间发送结构化消息。
  • ​共享内存(Shared Memory)​​:高效,但需要同步机制。
  • ​套接字(Socket)​​:可用于不同机器间的进程通信。
​7. 总结​
  • ​进程​​:适合需要高隔离性和安全性的任务(如浏览器、数据库)。
  • ​线程​​:适合需要高并发和资源共享的任务(如服务器、游戏引擎)。
  • ​选择​​:
    • 如果任务需要高并发且共享数据 → ​​多线程​​。
    • 如果任务需要高稳定性 → ​​多进程​​。

二 . 死锁(Deadlock)复习笔记


​1. 死锁的定义​

在操作系统中,​​死锁​​指多个进程因竞争资源而陷入互相等待的状态,导致所有进程都无法继续执行。例如:进程A持有资源R1并请求R2,而进程B持有R2并请求R1,两者均无法释放资源,形成僵局。


​2. 死锁的必要条件(四个,缺一不可)​
  • ​互斥条件(Mutual Exclusion)​​:资源一次只能被一个进程占用。
  • ​占有并等待(Hold and Wait)​​:进程持有至少一个资源,同时等待获取其他被占用的资源。
  • ​非抢占(No Preemption)​​:已分配给进程的资源不能被强制剥夺,必须由进程主动释放。
  • ​循环等待(Circular Wait)​​:存在一个进程等待环路,如P1→P2→P3→…→Pn→P1。

​3. 死锁的处理策略​
​(1) 预防(Prevention)​

破坏四个必要条件之一:

  • ​破坏互斥​​:允许资源共享(如只读文件),但某些资源无法共享(如打印机)。
  • ​破坏占有并等待​​:要求进程一次性申请所有资源(可能导致资源浪费)。
  • ​破坏非抢占​​:允许强制抢占资源(需保存状态,实现复杂)。
  • ​破坏循环等待​​:按固定顺序(如资源编号)申请资源(如银行家算法)。
​(2) 避免(Avoidance)​
  • ​银行家算法(Banker's Algorithm)​​:
    • 检查资源分配后系统是否处于​​安全状态​​(存在至少一个安全序列)。
    • 需要预先知道进程的​​最大资源需求​​。
    • 示例:当前可用资源为(3,3,2),若进程P1请求(1,0,2),需检查分配后是否仍能找到一个安全序列(如P1→P3→P4→P2→P0)。
​(3) 检测与恢复(Detection & Recovery)​
  • ​检测​​:通过资源分配图(Resource Allocation Graph, RAG)或矩阵算法检测死锁。
    • 若图中存在​​环路​​且资源不可抢占,则死锁发生。
  • ​恢复​​:
    • ​进程终止​​:强制终止所有或部分死锁进程(如终止代价最小的进程)。
    • ​资源抢占​​:回滚进程并释放资源(需解决饥饿问题)。
​(4) 忽略(Ostrich Algorithm)​
  • 假设死锁极少发生,如Unix/Linux通常不处理死锁,交由开发者避免。

​4. 关键概念对比​
​预防(Prevention)​​避免(Avoidance)​
静态策略,限制资源申请方式动态策略,运行时检查安全性
可能降低系统吞吐量需预知最大需求,开销较大

​5. 典型例题​

​问题​​:系统有3类资源(A/B/C),数量为(10,5,7)。当前分配情况如下:

  • 进程P0:已占用(0,1,0),最大需求(7,5,3);
  • 进程P1:已占用(2,0,0),最大需求(3,2,2);
  • 进程P2:已占用(3,0,2),最大需求(9,0,2);
  • 进程P3:已占用(2,1,1),最大需求(2,2,2);
  • 进程P4:已占用(0,0,2),最大需求(4,3,3)。

​问​​:当前是否安全?若P1请求(1,0,2),能否分配?

​解答​​:

  1. ​计算可用资源​​:
    总资源 = (10,5,7)
    已分配 = (0+2+3+2+0, 1+0+0+1+0, 0+0+2+1+2) = (7,2,5)
    可用 = (10-7, 5-2, 7-5) = ​​(3,3,2)​

  2. ​检查安全序列​​:

    • 计算各进程​​Need = Max - Allocated​​:
      P0:(7,4,3), P1:(1,2,2), P2:(6,0,0), P3:(0,1,1), P4:(4,3,1)
    • 当前可用(3,3,2)可满足P3的Need(0,1,1),执行后释放资源:
      可用 = (3+2,3+1,2+1) = (5,4,3)
    • 接着可满足P1/P4,最终找到安全序列如 ​​P3→P1→P4→P0→P2​​,系统安全。
  3. ​P1请求(1,0,2)​​:

    • 检查请求 ≤ Need((1,2,2))且 ≤ 可用((3,3,2)),允许尝试分配。
    • 分配后:
      P1占用 = (2+1,0+0,0+2) = (3,0,2)
      可用 = (3-1,3-0,2-2) = (2,3,0)
    • 重新检查安全性:可用(2,3,0)可满足P3→P1→...,仍存在安全序列,​​允许分配​​。

​6. 常见考点​
  • 判断死锁条件(给出资源分配图或进程描述)。
  • 银行家算法的步骤(计算Need、Available,找安全序列)。
  • 死锁处理策略的优缺点比较(如预防 vs 避免)。

http://www.xdnf.cn/news/10520.html

相关文章:

  • 方法重写与方法重载详解
  • CSS之动画(奔跑的熊、两面反转盒子、3D导航栏、旋转木马)
  • 谷歌CEO皮查伊眼中的“下一代平台“与未来图景
  • 基于FPGA的VGA显示文字和动态数字基础例程,进而动态显示数据,类似温湿度等
  • Pyomo中线性规划接口的使用
  • 为什么ping显示connect:network is unreachable,如何排查网络不通问题?
  • LearnOpenGL-笔记-其十三
  • py爬虫的话,selenium是不是能完全取代requests?
  • NodeJS全栈WEB3面试题——P2智能合约与 Solidity
  • 单调栈(打卡)
  • 【C++/Linux】TinyWebServer前置知识之IP协议详解
  • 【iOS】YYModel源码解析
  • 告别printf!嵌入式系统高效日志记录方案
  • 如何评估 RAG 的分块Chunking策略
  • 【沉浸式求职学习day52】【初识Mybaits】
  • 风控研发大数据学习路线
  • Java生态中的NLP框架
  • 【C语言】C语言经典小游戏:贪吃蛇(上)
  • Vortex GPGPU的github流程跑通与功能模块波形探索(四)
  • 解决:install via Git URL失败的问题
  • 【LLM vs Agent】从语言模型到智能体,人工智能迈出的关键一步
  • Java中对象哈希值的解析
  • 力扣HOT100之多维动态规划:64. 最小路径和
  • Langchian - 自定义提示词模板 提取结构化的数据
  • bismark OT CTOT OB CTOB 以及mapping后的bam文件中的XG,XR列的含义
  • 用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包
  • 【知识点】第3章:基本数据类型
  • Linux之进程间通信
  • 600+纯CSS加载动画一键获取指南
  • NLP学习路线图(十九):GloVe