专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

操作系统的知识点整理

进程管理

进程与线程分别是什么?

  • 进程是系统进行资源分配和调度的一个独立单位,它可以拥有自己的地址空间;引入进程是为了使多个程序可以并发地执行,以提高系统的资源利用率和吞吐量。
  • 线程是进程的一个实体,是CPU调度的基本单位,它是比进程更小的能独立运行的一个单位;引入线程是为了减少程序在并发过程中的开销,使OS的并发效率更高。

两者有什么区别?

  • 进程是资源分配的最小单位,线程是调度的最小单位;
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
  • 进程本身保有资源,而线程只含有一些维持活动所必不可少的资源,本身不拥有系统资源。

为什么线程调度的开销比进程小?

  • 由于进程是一个资源的拥有者,因此在创建或撤销进程的过程中,系统都要为之创建或回收进程控制块、分配或回收内存;同时,在进程切换时,系统需要保留当前进程的CPU环境,再设置新选中的进程的CPU环境;所以对进程的调度是相对复杂的,需要花费大量的处理机时间。
  • 而线程虽然具有许多传统进程所具有的特征,但本身不保有资源;并且,由于同一个进程中的资源是所有线程共享的,所以线程可以通过这些数据来进行更加方便快捷的通信,从而降低一些系统开销。因此相比于进程,线程能拥有更快的调度速度,又称为“轻型进程”。

进程有哪几种状态?

  • 就绪状态 :进程已经获得除处理机以外的全部所需资源,只要获得处理机便可立即执行,则称此时的状态为就绪状态
  • 运行状态 :当进程已经获得处理机,且其程序正在处理机上运行,则称进程此时的状态为运行状态
  • 阻塞状态 :正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起阻塞状态的事件可以有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信号等等

线程同步的方式有哪些?

  • 互斥量 :采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问;但是这样很容易造成死锁(
  • 信号量 :它允许同一时刻多个线程访问同一资源,但是需要控制统一时刻访问此资源的最大线程数量;当需要一个计数器来限制可以使用某共享资源的数目时,可以使用“信号量”对象。
  • 事件(信号):通过通知操作的方式来保持多线程同步,还可以方便地实现多线程优先级的比较操作,即事件机制允许一个线程在处理完一个任务后,主动唤醒另一个线程执行任务。

经典的进程同步问题有哪些?

  • 生产者-消费者问题
    • 问题描述 :一组生产者进程和一组消费者进程共享一块初始为空,大小确定的缓冲区,只有当缓冲区不为满的时候,生产者进程才可以将消息放入缓冲区,否则就要等待;只有当缓冲区不为空的时候,消费者进程才可以从中取出消息,否则就要等待;缓冲区一次只能被一个进程所访问。
    • 问题分析 :生产者和消费者进程对缓冲区的访问是互斥关系,而生产者与消费者本身又存在同步关系,即消息必须先被生产,然后才能被消费。因而可以为对缓冲区的访问设置一个互斥量,再设置两个信号量,一个记录空闲缓冲区单元,一个记录满缓冲区单元,从而实现生产者与消费者的同步。
  • 哲学家进餐问题
    • 问题描述 :一张圆桌上坐着五名哲学家,每两个哲学家之间摆一根筷子,哲学家只有同时拿起左右两根筷子才可以用餐,用餐完成后将筷子放回原处。
    • 问题分析 :为防止哲学家各取一根筷子而出现死锁,需要添加一定的限制条件。
    • 几种解决方案如下 :
      • 限制至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能释放出他用过的筷子,从而使更多的哲学家能够进餐
      • 限制仅当哲学家左右手两边的筷子都可用时,才允许拿起筷子进餐;即使用AND信号量机制解决问题
  • 读者-写者问题
    • 问题描述 :有读者和写者两个并发进程共享一个数据,多个读进程可以同时访问数据,但写进程的数据访问与其他进程都互斥
    • 问题分析 :读者与写者互斥,写者与写者互斥,读者与读者共享。所以需要一个互斥量实现读写进程与写写进程的互斥,此外还需要引入一个计数器对读线程进行计数,使得读读同步,读写互斥。
    • 几种解决方案如下 :
      • 读者优先 :但只要读者源源不断,写者就得不到资源,容易造成写者饥饿
      • 读写公平 :读者与写者公平竞争资源,但只要之前有已经排好队的读者,就算写者获取到了资源,也要等待所有读者线程结束
      • 写者优先 :虽然之前已经排好队的读者可以优先访问资源,但在这之后的读者则需要等待写者进程结束。只要写者源源不断,后面的读者就得不到资源,容易造成读者饥饿

进程间的通信方式有哪些?

  • 进程通信,是指进程间的信息交换。因此,对于用信号量进行的进程间的互斥和同步,由于其所交换的信息量少而被归结为低级通信。
  • 所谓进程间的高级通信是指 :用户可以利用操作系统所提供的一组通信命令传送大量数据,而操作系统隐藏了进程通信的实现细节,即通信过程对用户来说是透明的。
  • 高级通信机制可以归结为三大类 :
    • 管道通信 :管道通信是一种半双工的通信方式,数据只能在进程间单向流动;其中,发送消息的称为写进程,接收消息的称为读进程。管道主要分为普通管道和命名管道,它们的区别在于,普通管道只能在具有亲缘关系(如父子进程)的进程间流动,而命名管道允许无亲缘关系的进程进行通信。
    • 消息缓冲通信 :多个独立的进程之间可以通过消息缓冲机制来相互通信。这种通信的实现是以消息缓冲区为中间机制。通信双方的发送和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称为消息队列;消息队列一旦创建后即可由多线程共享。
    • 共享内存通信 :由于消息缓冲需要占用CPU进行消息复制,OS提供了一种允许进程间直接进行数据交换的通信方式,即共享内存。它可以不通过中间机制,直接将共享的内存页面映射到相互通信的进程格子的虚拟地址空间中去,从而使多个进程可以直接访问同一个物理内存页面,如同访问自己的私有空间一样。但由于内存实体存在于计算机系统中,只能由处于同一个计算机系统中的进程共享,不方便网络通信。

处理机调度与死锁

操作系统中的进程调度算法有哪些?

  • 先来先服务调度算法 :每次选择最先进入该队列的进程
  • 短作业优先调度算法 :每次选一个预计运行时间最短的进程
  • 高优先权优先调度算法 :
    • 非抢占式优先权算法 :一旦将处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直到执行完成或该进程主动放弃处理机;这种调度算法主要用于批处理系统中,也可用于某些对实时性要求不严格的实时系统中。
    • 抢占式优先权调度算法 :同样是将处理机分配给当前最高优先权的进程,但是,若执行期间出现了优先权更高的进程,则立即停止当前进程的执行,重新将处理机分配给新的优先权最高的进程。通常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。

什么是死锁?

在两个或多个并发进程中,如果每个进程持有某种资源而又等待着其他进程释放它们现在保有着的某种资源,且在改变这种状态之前都不能继续推进,则称这一组进程产生了死锁。简单来说就是多个进程的无限期阻塞与相互等待。

死锁产生的条件是什么?

主要有以下四个条件,只要其中一条不成立,则不会产生死锁 :

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

解决死锁的基本方法有哪些?

  • 预防死锁 :
    • 资源一次性分配 :(破坏请求和保持条件)
    • 可剥夺资源 :当某进程新的的资源未满足时,释放已经占有的资源(破坏不可剥夺条件)
    • 资源有序分配 :系统给每类资源富裕一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
  • 避免死锁 :
    • 银行家算法 :从当前状态出发,按照系统各类资源剩余量逐个检查各进程需要申请的资源量,找到一个各类资源申请量均不大于系统剩余资源量的进程P1,然后将资源分配给它,假定P1完成工作后将归还其占有的所有资源,更新系统剩余资源状态并移除进程列表中的P1,然后继续寻找下一个能满足条件的进程。如果找到一个序列能使所有客户(进程)都完成工作,则银行家(OS)是安全的。
  • 检测死锁 :
    • 为每个进程、每个资源指定唯一编号
    • 设定一张资源分配表,记录各进程与占用资源之间的关系
    • 设置一张进程等代表,记录各进程与要申请的资源之间的关系
    • 依次检测资源的占有及请求情况,如果出现环路则说明引发了死锁
  • 解除死锁 :
    • 剥削资源 :从其他进程剥削足够数量的资源给死锁进程,以解除死锁
    • 撤销进程 :最简单的撤销方式是使全部死锁进程都夭折掉;稍微温和一点的方式是按照某种顺序逐个撤销进程,知道有足够的资源可用,使死锁状态消除为止

存储器管理

动态连续分配有哪些算法?

动态分区分配又称为可变分区分配,是一种动态规划内存的分区方法。这种方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的 大小和数目时可变的。动态连续分配主要有以下算法 :

  • 首次适应算法 :空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小满足要求的第一个空闲分区
  • 最佳适应算法 :空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区
  • 最坏适应算法 :又称最大适应算法,空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。

分页和分段存储管理有什么区别?

  • 页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的“碎片”,提高内存利用率,从而满足系统的需要。段是信息的逻辑单位,它含有的是一组意义相对完整的信息,能够更好地满足用户的需要。
  • 页的大小固定且由系统确定,而段的长度却不固定,取决于用户所编写的程序。
  • 分页的作业地址空间是一维的,即单一的线性空间,程序员只需要用一个记忆符,即可表示一段地址;分段的作业地址空间是二维的,程序员在标识一个地址时,即需要给出段名,又需要给出段内地址。

什么是虚拟内存?

如果存在一个程序,所需内存空间超过了计算机可以提供的实际内存,那么由于该程序无法装入内存,也就无法运行。为了解决这个问题,即引申出了虚拟内存的概念。

  • 基于局部性原理,在程序装入时,可以只将程序的一部分装入内存,而将其它部分留在外存。在程序执行过程中,当访问的信息不再内存时,再由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统会将暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。
  • 这样,就好像是操作系统为用户提供了一个比实际容量大得多的存储器,称为虚拟存储器。

虚拟存储器有什么特点?

  • 多次性 :一个作业可以分多次被调入内存。多次性是虚拟存储所特有的属性。
  • 对换性 :指作业运行过程中存在换进换出的过程。
  • 虚拟性 :指其从逻辑上扩充了内存的容量。虚拟性是虚拟存储器最重要的特征,也是其最终目标;它是建立在多次性和对换性基础上的,而多次性和对换性又是建立在离散分配的基础上。

常用的页面置换算法有哪些?

  • 最佳置换算法 :只存在于理论中的算法,优先置换最长未来世界不会被访问的页面。
  • 先进先出算法 :优先置换最早被调入的页面。
  • 最近最久未使用算法 :对最佳置换算法的一种尝试,优先置换最近最久未使用的页面。算法赋予每个页面一个访问字段,用来记录上次页面被访问到现在所经历的时间t,每次置换时把t值最大的页面。置换出去。这是一种较好的算法,但需要较多的硬件支持,如寄存器和栈。
  • 时钟算法 :又称最近未使用算法,是最近最久未使用的近似算法;该算法会为页面设置一个访问位,并将页面链接为一个环形队列,页面被访问时流将访问位置为1。页面置换时,如果当前指针所指页面的访问位为0,则置换,否则,就将其置换为0,然后继续判断下一个,直到遇到一个访问位为0的页面为止。
  • 改进时钟算法 :在时钟算法的基础上添加一个修改位,替换时根据访问位和修改位进行综合判断。优先替换访问位和修改位都是0的页面,其实是访问位为0修改位为1的页面。

其他的想起来再整理(`・ω・´)

文章永久链接:https://tech.souyunku.com/43727

未经允许不得转载:搜云库技术团队 » 操作系统的知识点整理

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们