操作系统

操作系统概述

操作系统是计算机系统中的一个系统软件管理和控制计算机系统中的硬件和软件资源,合理的组织计算机的工作流程,以便有效利用这些资源为用户提供一个功能强、使用方便的工作环境,从而在计算机与用户之间起到接口的作用。

  • 处理机管理

    进程控制:创建和撤销进程以及控制进程的状态转换。

    进程同步:协调、互斥访问临界资源,协调执行进度,

    进程通信:进程间的信息交换

    进程调度:按一定算法从进程就绪队列中选出一个进程,把处理机分配给它,使之运行。

  • 操作系统的主要任务√

    管理处理机:进程控制、进程同步、进程通信、进程调度

    管理存储器:内存分配、内存保护、地址映射、内存扩充

    管理输入/输出设备:缓冲管理、设备分配、设备处理、虚拟设备管理

    管理数据文件:文件存储空间管理、目录管理、文件读写管理、文件保护 、文件系统的安全性、文件接口

    提供接口服务:命令接口、程序接口、图形接口

  • 操作系统的结构:内核kernel与外壳shell

    内核是实现操作系统基本功能的程序模块的集合,在机器的系统态(核心态 )下运行。

    外壳是指运行在内核之上的、完成OS外层功能的程序,运行在机器的用户态下,是一种开放式结构。

  • 操作系统内核的功能√ :资源管理、支撑功能

  • 计算机系统的两种运行状态:核心态、用户态

    当操作系统内核的程序模块运行时,机器处于核心态,其他程序运行时处于用户态。

    核心态:操作系统内核的运行状态,处理机具有较高的特权,可以访问所有的寄存器和存储区。

    用户态:具有较低的执行状态,处理机只能执行规定的指令,访问指定的寄存器和存储区。

  • 用户态切换到内核态的3种方式

  1. 系统调用
  2. 异常
  3. 外围设备的中断
  • 操作系统的特征√

    任务共行性:宏观上,系统中由多个任务同时运行;微观上,单处理机系统中的任务并发,即多个任务在单个处理机上交替运行;或多处理机系统中的任务并行,即多个任务在多个处理机上同时运行。

    资源共享性:宏观,多个任务可以同时使用系统资源;微观,多个任务可以交替互斥地使用系统中的某个资源

    虚拟性:将一个物理上的实体变为若干个逻辑上的对应物。eg:把一台物理CPU变成多台逻辑上独立的CPU。

    不确定性:程序不可再现;多道程序环境下,进程以异步方式执行。多个作业的执行顺序和每个作业的执行时间是不确定的。

  • 操作系统的基本类型√

  1. 按照硬件平台系统结构不同分类
  2. 根据操作系统在用户界面的使用环境和功能特征的不同分类
  • 一些基本概念√

    单道批处理系统:为了实现对作业的连续处理 ,需要先把一批作业以脱机方式输入到磁盘上,并在系统中配上监督程序,在它的控制下,使得这批作业能一个接一个连续工作。

    多道批处理系统:用户所提交的作业先放在外存上,并排成一个队列,由作业调度程序按照一定的算法 ,从队列中选择若干个作业调入内存,使其共享CPU和系统中的资源。在某一程序因为IO操作而暂停的CPU空档时间运行另一程序,使用多道程序交替运行,始终保持CPU忙碌的状态。

    多道程序设计技术:允许一个计算机系统的主存储器同时容纳多个用户程序,这些程序在计算机系统中可以并发执行。

    系统调用:用户程序和硬件设备之间的桥梁,用户程序通过系统调用来使用硬件设备。

    用户接口User Interface:系统和用户之间进行交互和信息交换的媒介,实现信息的内部形式与人类可以接受形式之间的转换。

进程管理

进程是指,程序的一次执行,包括可执行的程序、程序所需的数据和相关状态信息。进程是拥有资源的最小实体,在传统OS中,进程同时也是系统调度的最小单位。 在现代OS中,线程是系统调度的最小单位。

线程是指,程序的一次相对独立的运行过程。

  • 进程的概念√

    定义:可并发执行的程序,在一个数据集合上的运行过程。是操作系统进行资源分配和调度的一个独立单位

    每一个进程都独立申请资源(不管是不是子进程和父进程的关系)

    调度时是以线程为单位进行调度的

    操作系统引入进程的目的是,描述和实现多个程序的并发执行,改善资源利用率及提高系统的吞吐量。

  • 程序与进程的关系√:

    一个程序可以对应一个进程或多个进程

    一个进程可以对应一个程序或一段程序

  • 进程的特征:

    动态性(产生、存在、消亡)

    并发行(可以多个进程交替)

    独立性(独立单位)

    异步性(进程推进的顺序不是之前可以决定的,每次不是完全相同的)

  • 程序顺序执行

    顺序性、封闭性、可再现性

  • 程序并发执行

    间断性、非封闭性、不可再现性

    由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(并发简单来说多个任务同时执行)。

  • 进程的结构√

    组成(进程映像):程序、数据集合、进程控制块PCB(Process Control Block)

    PCB是进程存在的唯一标志,包含进程的描述信息和控制信息,创建进程时创建PCB,进程结束时系统撤销其PCB

  • 进程间的通信的几种方式

    • 管道pipe及命名管道named pipe:管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
    • 信号signal:信号是一种比较复杂的通信方式,用于通知接受进程某个事件已经发生。
    • 消息队列:消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新信息,对消息队列有读权限的进程则可以从消息队列中读取信息
    • 共享内存:最有用的进程间通信方式,使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠同步操作,如互斥锁和信号量等
    • 信号量:主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段
    • 套接字:这是一种更为一般的进程间通信机制,可用于网络中不同机器之间的进程间通信
  • 进程的生命周期√

    在早期只有进程的操作系统中,进程有创建、就绪、运行、阻塞(如等待I/O)、终止五种状态。

    就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源

    运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数

    阻塞状态:进程等待某种条件,在条件满足之前无法执行

​ 进程“未执行”有两种状态:就绪(时间片到期了)和阻塞(等待用户输入或者读取其他信息 即等待I/O)

​ 如果一个父进程被终止,其子孙进程都必须终止。

  • 挂起:暂时被淘汰出内存的进程,机器的资源是有限的,在资源不足的情况下,操作系统对在内存中的程序进行合理的安排

    阻塞->阻塞/挂起:如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻塞的进程让出空间。

    阻塞/挂起->就绪/挂起:等待的事件发生。

    就绪/挂起->就绪:如果内存中没有就绪态进程,或者处于就绪/挂起的进程比处于就绪态的任何进程优先级都要高。

    就绪->就绪/挂起:通常,操作系统更倾向于挂起阻塞态进程而不是就绪态进程,但如果唯一方法是挂起一个就绪态进程,那么也有可能发生这种转换。另外,如果操作系统确信高优先级的阻塞态进程很快就会就绪,那么它可能选择挂起一个低优先级的就绪态进程,而不是一个高优先级的阻塞态进程。

  • 进程交换技术√ :挂起状态 (交换技术是否一定引起进程挂起?)

    交换技术,即把一个进程完整调入内存,使该进程运行一段时间,然后把它存回磁盘。空闲进程主要存储在磁盘上,不运行时就不会占用内存。

  • 进程创建的步骤

  1. 为进程分配一个唯一标识号ID
  2. 为进程分配空间
  3. 初始化PCB
  4. 建立链接
  5. 建立或扩展其他数据结构
  • 进程的两种执行模式√
  1. 系统模式、控制模式或内核模式
    • 具有较高的特权
    • 运行系统特定的指令,运行操作系统程序,操作硬件
  2. 用户模式(用户态)
    • 具有较低的特权
    • 运行用户程序
  • 进程的模式切换√

    进程内部引用的一种操作。用户程序转入系统调用或相反时,进行模式切换

    进程切换一定引发模式切换

    •用户模式到内核模式由中断/异常/系统调用中断用户进程执行而触发

    •内核模式到用户模式由OS执行中断返回指令将控制权交还用户进程而触发

  • 调度√

    指在一个队列中按照某种方法(算法),选择一个合适的个体的过程。

    关键是需要某种方法或算法。

    目标:√

    1. 公平性,防止进程长期不能获得调度而饥饿
    2. 处理机利用率,尽量提高
    3. 提高系统吞吐量
    4. 尽量减少进程的响应时间

    原则:√

    1. 满足用户需求:响应时间、周转时间、截止时间
    2. 满足系统需求:系统吞吐量、处理机利用率、各类资源平衡使用、公平性及优先级
  • 进程调度方式√

    非剥夺方式(执行完毕,因I/O放弃)、剥夺方式(新进程到来,高优先权,时间片用完)

  • 调度分类√

    长程、中程(有挂起状态的系统才有)、短程(aka进程调度)

进程调度算法(分时系统和一部分实时系统)√

  • 先来先服务(FCFS)first-come-first-served

按照进程到达的先后顺序排队,每次调度队首的进程,非剥夺调度方式。

BUT 对于后进入队列而运行时间较短的进程,或I/O型的而言,需要长时间等待。

对短进程不公平,长进程在前面会增加平均周转时间。

一般将FCFS与其他调度算法混合使用,eg:按优先级划分队列,队列内部按照FCFS算法

FCFS同时适合长程、中程、短程

  • 短进程(作业)优先 SJF, shortest process next

通过计算,谁预期执行时间短就调度谁。非剥夺调度算法。

与FCFS对比,提高了吞吐量,改善了性能

BUT 能难准确预测执行时间

会导致长进程饥饿,对长进程不公平

非剥夺方式,未考虑进程的紧迫程度,不适合于分时系统和事务处理系统

  • 时间片轮转调度法 RR,Round-robin

分时联机系统中,n个进程循环的获得时间片而执行。

对短的、计算型的进程有利

BUT 用户数多的话,速度会变慢。

时间片的大小也会影响进程的响应时间

进程切换也会有系统开销

不适合于批处理系统的进程调度,不利于I/O的进程

  • 基于优先级的调度算法

静态优先级 & 动态优先级

采用动态优先级的两周调度算法:剩余时间最短者优先和相应比高(排队等待时间长)者优先

​ 剩余时间最短者优先:对短进程有利,不好计算剩余时间,但是平均周转时间<短进程优先算法

​ 相应比高者优先:R = (w+s)/s = w/s +1 w等待时间 s预计执行时间

​ 难预计时间,计算相应比加大系统开销

  • 反馈调度法

根据进程执行历史调整调度方式 的方法,结合了优先级和时间片轮转的思想

处理机先处理优先级高的队列,一个时间片没处理完的进程,掉到下一个优先级的队列中

有利于交互型短进程或短批处理作业

BUT 使长进程的周转时间急剧增加

如果不断有新进程到来(新进程都会在高优先级队列),可能出现长进程饥饿现象

为此,可以为各队列设置不同时间片,优先级越低时间片越长

实时系统

能及时响应外部事件的请求,在规定的时间内完成对该事件的处理。

分类√ :分为实时控制系统和实时信息处理系统

实时任务:周期性、非周期性

典型的实时信息处理系统:飞机订票系统

实时性要求不太高的实时系统可用的实时调度算法:√

  1. 基于时间片轮转调度算法
  2. 基于优先级的调度算法
  3. 最早截止时间优先调度算法
  4. 速度单调调度算法(Rate Monotonic Scheduling):最短周期的任务具有最高优先级。

线程

  • 引入线程的原因√

引入线程,为了减少程序并发执行时系统所付出的额外开销,使操作系统具有更好的并发性。为了将进程的资源申请和调度属性分开,产生了线程的概念。

线程是进程中的一个实体,是独立调度和分派的基本单位。

线程可与同属一个进程的其他线程共享进程的全部资源。

线程具有三种基本状态√ :就绪,执行和阻塞。

对线程的操作:

  1. 派生Spawn,当系统创建一个进程时,同时为该进程派生一个线程,同一进程的线程可以再派生其他线程。
  2. 阻塞Block,当线程需要等待某事件时,将被阻塞,释放处理机执行其他线程。
  3. 接触阻塞Unblock,阻塞事件发生。
  4. 结束Finish,线程执行完毕,释放其私有资源。

线程与进程√

  1. 调度:线程是独立调度的基本单位,进程是资源拥有的基本单位(资源分配)。

    ​ 同一进程中的线程间切换不会引起进程切换,但是切换到另一进程中的线程会引起进程切换。

  2. 并发:进程间可以并发执行,同一进程的线程间可以并发执行。

    ​ 进程实现了操作系统的并发性,线程实现了进程内部的并发,保证程序的实时性。

  3. 拥有资源:进程有权申请系统的各类资源,线程不能申请但是可以共享进程的资源。

  4. 系统开销:

    • 操作系统管理进程的开销显著大于管理线程的开销
    • 进程切换的开销远大于线程切换的开销
    • 同一进程间的线程具有相同的地址空间,他们之间的同步和通信比较容易
    • 有些类型的线程切换、同步和通信无需操作系统内核干预
  5. 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃后,整个进程都会死掉。

  6. 对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

    要求效率高,频繁切换时,对资源的保护管理要求不是很高时,使用多线程。

  • 线程的类型√

用户级线程 & 内核级线程

用户级线程的操作由支持线程的应用程序完成,不依赖于操作系统核心,内核不知道用户级线程的存在。

用户级线程切换无须内核干预,没有模式切换,减少了模式切换的开销,速度快。

内核级线程的管理(创建、撤销和切换)全由系统内核完成,依赖于内核,应用程序无权进行线程切换等操作。

用户级线程执行系统调用指令时将导致其所属进程被中断,而内核级线程执行系统调用指令时,只导致该线程被中断。

用户级线程的程序实体是运行在用户态下的程序,而内核级线程的程序实体是可以运行在任何状态下的程序。

  • 线程切换

进行线程切换时,需要同时保存整个进程的上下文以及线程的上下文信息。

当线程阻塞时,内核可以调度另一个就绪的线程执行(同一进程或不同进程),线程切换时需要进行模式切换。

  • 进程的互斥与同步解决方案

互斥就是多个进程之间由于竞争临界资源而相互制约。

同步指多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。

进程同步的主要任务,是对多个相关进程在执行次序上进行协调,以使并发执行的进程之间能有效的共享资源和相互合作,从而使程序的执行具有可再现性。

  1. 软件方法

  2. 硬件方法

  3. 信号量方法semaphores√

    将实现信号灯作用的变量称为信号量,分为互斥信号量和资源信号量

    记录型信号量的wait(进程加到链表)和signal(唤醒阻塞链表)

    要用wait先申请资源,再申请使用权

  4. 管程

    管程本身被作为一种临界区

    管程中只能有一个活跃进程(互斥),管程中要设置一对同步操作原语(同步)

  5. 消息传递

  • 什么是临界区 临界资源

    临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问。

    临界资源:一次仅允许一个进程使用的资源,即不能同时被共享的资源。

  • 临界区使用原则(也称为互斥条件)√

​ 空闲让进

​ 忙则等待(保证对临界区的互斥访问)

​ 有限等待(有限代表有限的时间,避免死等)

​ 让权等待(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等)

  • 消息传递的三种同步方式

阻塞发送,阻塞接收 (阻塞接收:如果没收到期望的消息,阻塞等待直到消息到来)

不阻塞发送,阻塞接收(不阻塞发送容易导致消息无限发送)

不阻塞发送,不阻塞接收(不阻塞接收容易丢失消息)

经典进程互斥与同步问题√

  • 生产者/消费者问题(基于共享存储区方式通信,不要求数据移动,一般用于本地通信)

生产者和消费者进程共享一个大小固定的缓冲区,被生产者和消费者循环使用

生产者和消费者必须互斥进入缓冲区

生产者不能向满缓冲区写数据,消费者不能向空缓冲区取数据,即生产者与消费者必须同步

👇利用信号量解决:

//synchronized, wait, notify实现
//资源
public class Resource{
  int num = 0; //当前资源的数量
  int size = 10; //缓冲区的上限
  
  //消费资源
  public synchronized void remove(){
    while(num == 0){
      try{
        System.out.println("消费者进入等待");
        this.wait();//线程等待,并释放锁
      }catch(InterruptedException e){
        e.printStackTrace();
      }
    }
    //如果有资源可以消费
    num--;
    System.out,println("消费者线程为:"+Thread.currentThread().getName()+"---资源数量:"+num);
    this.notify();//唤醒其他正在等待的线程
  }
  
  //生产资源
  public synchronized void put(){
    while(num == size){
      try{
        System.out.println("生产者进入等待");
        this.wait();
      }catch(InterruptedException e){
        e.printStackTrace();
      }
    }
    num++;
    System.out,println("生产者线程为:"+Thread.currentThread().getName()+"---资源数量:"+num);
    this.notify();//唤醒其他正在等待的线程
  }
  
}


//消费者
public class Consumer implements Runnable{
  private Resource resource;
  public Consumer(Resource resource){
    this.resource = source;
  }
  @Override
  public void run(){
    while(true){
      resource.remove();
    }
  }
}

//生产者
public class Producer implements Runnable{
  private Resource resource;
  public Producer(Resource resource){
    this.resource = resource;
  }
  @Override
  public void run(){
    while(true){
      resource.put();
    }
  }
}

//测试代码
public class TestConsumerAndProducer{
  public static void main(String[] args){
    Resource resource = new Resource();
    //生产线程
    Producer p1 = new Producer(resource);
    //消费线程
    Consumer C1 = new Consumer(resource);
    
    new Thread(p1).start();
    
    new Thread(C1).start();
  }
}
//lock, condition, await, signal实现多生产者-多消费者
class ProducerConsumer{
  public static void main(String[] args){
    Resources r = new Resources();
    Productor pro = new Productor(r);
    Consumer con = new Consumer(r);
    
    Thread t1 = new Thread(pro);
    Thread t2 = new Thread(pro);//多个生产者
    Thread t3 = new Thread(con);
    Thread t4 = new Thread(con);//多个消费者
    
    t1.start();
    t2.start();
    t3.start();
    t4.start();
  }
}
//资源
class Resources{
  private String name;
  private int count = 1;
  private boolean flag = false;
  private Lock lock = new ReentrantLock();
  //ReentrantLock是独占锁且可重入的
  private Condition contidion_pro = lock.newCondition();//使用lock建立生产者的condition对象
  private Condition contidion_con = lock.newCondition();
  
  public void set(String name) throws InterruptedException{
    lock.lock();
    try{
      while(flag){
        condition_pro.await();
      }
      this.name = name + "--" + count++ ; 
      System.out,println("生产者线程为:"+Thread.currentThread().getName()+"---"+this.name);
      flag = true;
      //2)使用condition唤醒所有进程
      condition.signalAll(); //如果使用condition.signal()会出现相互等待状况,都失去资格
    }finally {
       lock.unlock();
    }

} 

注:

  1. 进程应先申请资源信号量,再申请互斥信号量
  2. 对任何信号量的wait与signal操作必须配对
  3. 对同一信号量的wait和signal可以不在同一进程中
  4. wait与signal不能颠倒顺序

👇利用消息传递解决:

消费者先发送capacity条“空”消息到缓冲区,生产者取走一条空消息并填充内容送回缓冲区,消费者取走有内容的消息读取并返回一条空消息给缓冲区。

  • 读者/写者问题

可以同时读,不能同时写,写的时候不能读

“读者优先”,有读者一直来可以一直进,直到读者没有了再让写者进

“写者优先”,写者只需等待先于它到来的读者,不用等待其后来的读者。降低了并发程度,系统性能较差

  • 哲学家进餐问题

五个人五只筷子

如果5个人同时开始进程,都将因为拿不到第二只筷子而无限期等待下去,引发死锁。

改进:

  1. 至多只允许四位哲学家同时拿左筷子,最终保证至少一位哲学家能进餐,即设置一个初值为4的信号量,不会出现饿死和死锁
  2. 规定奇数号哲学家先拿左筷子,偶数号哲学家先拿右筷子。最终,1号哲学家不需要与别人竞争

死锁

死锁deadlock√ :

在两个或多个并发进程中,如果每个进程持有某种资源而又等待别的进程释放他或他们现在保持着的资源,在未改变这种状态之前都不能向前推进。(两个或多个进程被无限期地阻塞、相互等待的一种状态)

引起死锁的主要原因√ :

  1. 进程对资源的总需求量超过系统能提供的最大资源量(资源分为可重用资源&可消耗资源)
  2. 进程推进顺序非法

产生死锁的条件√ :以下四个均为必要条件,其中一个不满足就不会发生死锁

  1. 互斥:一个资源每次只能被一个进程使用,若其他进程申请该资源,必须等到该资源被释放为止
  2. 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  3. 非剥夺:进程已获得的资源在未使用完之前,不能强行剥夺
  4. 循环等待:若干进程之间形成一种首尾相接的环形等待资源关系

解决死锁的方法:

  1. 预防死锁,进程申请资源必须遵循某些预先制定的限制条件,该方法会降低系统资源的利用率
  2. 避免死锁,申请资源时首先判断(预测),可能导致死锁的申请会被阻塞等待
  3. 检测并解决死锁,系统检测到死锁时,解决死锁(进程终止和资源抢占)

进程的安全序列:

​ 针对当前分配状态来说,系统至少能够按照某种次序为每个进程分配资源(直至最大需求),并且使他们一次成功的执行完毕,这种进程序列就是安全序列。如果存在一个安全序列,则系统此时就是安全的。

​ 按照这个安全序列执行进程,就不会产生死锁。

银行家算法(避免死锁)√

以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法嘛·,系统必须设置若干数据结构。

  • 数据结构
  1. 可利用资源向量Available,含有m个元素的数组,每一个元素代表一类可利用的资源数目,数值随该类资源的分配和回收动态改变。Available[j] = K,代表Rj类资源K个。

  2. 最大需求矩阵Max,n*m的矩阵,系统中n个进程中的每个进程对m资源的最大需求。Max[i,j] = K,进程i需要Rj类资源的最大数目为K。

  3. 分配矩阵Allocation,n*m的矩阵,当前已分给每一进程的资源数,Allocation[i,j] = K,进程i已分得Rj类资源的数目为K。

  4. 需求矩阵Need,n*m的矩阵,每个进程尚需的各类资源数,Need[i,j] = K,进程i还需要Rj类资源K个才能完成任务。

    Need[i,j] = Max[i,j] - Allocation[i,j]

  • 银行家算法详述

设Request是进程Pi的请求向量,REQUESTi[j] = K,表示进程Pi需要K个Rj类资源,当Pi发出资源请求后,系统按步骤进行检查:

  1. 如果REQUESTi[j] <= Need[i,j],转向步骤2,否则报错

  2. 如果REQUESTi[j] <= Avaliable[j],转向步骤3,否则表示尚无足够资源,Pi须等待

  3. 系统试探着将资源分配给进程Pi,并修改数据结构的数值

    Available[j] = Available[j] - REQUESTi[j]

    Allocation[i,j] = Allocation[i,j] + REQUESTi[j]

    Need[i,j] = Need[i,j] - REQUESTi[j]

  4. 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成此次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

  • 安全性算法
  1. 设置两个向量:

    • 工作向量work,表示系统可提供给进程继续运行所需的各类资源数目,含有m个元素,在执行安全算法开始时,work = Available
    • Finish,表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i] = false,当有足够资源分配给进程时,再令Finish[i] = true
  2. 从进程集合中找到一个满足下述条件的进程

    • Finish[i] = false
    • Need[i.j] <= Work[j]
    • 若找到,执行步骤3,否则执行步骤4
  3. 进程Pi获得资源,顺利执行直至完成,并释放出分配给他的资源:

    • Work[i,j] = work[i,j] + Allocation[i,j]
    • Finish[i] = true
    • 重复步骤2
  4. 如果所有进程的Finish[i] = true都满足,表示系统处于安全状态,否则处于不安全状态。

  • 解除死锁

    最小原理

存储管理

  • 存储管理的任务√

基本任务:管理内存空间的分配和回收

任务:存储分配、地址映射、存储保护、存储共享(使内存利用率更高)、存储扩充

(1) 分配基本内存空间

(2) 增加新的内存空间——动态申请或释放内存空间

(3) 回收内存空间

  • 存储分配步骤

根据系统的内存分配算法,在空闲的内存分区中寻找到一块满足进程需要的内存空间,将其分配给进程。

然后,更新进程的资源分配清单、内存分配情况清单等数据结构

  • 存储保护

防止地址越界(进程访问不属于自己的地址空间),防止操作越权(进程对共享存储区的操作违反了系统规定的权限)

存储保护只能进程执行过程中动态的进行

  • 内存划分与分配技术√

静态划分、动态划分、内存分页

  • 动态划分与分配算法√

动态划分:根据进程的实际需要,动态的划分内存空间,并分配给进程。

首次适应法、下次适应法、最佳适应法、最差适应法

  • 快表

为了提高地址变换速度,为进程页表设置一个专用的高速缓冲存储器,称为快表、TLB(Translation Lookaside Buffer),或联想存储器(Associative Memory)

快表专门保存当前进程最近访问过的一组页表项。

  • 分段式存储管理和分页式存储管理(内存管理)
  1. 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。分页是由于系统管理的需要,而不是用户的需要。

    段是信息的逻辑单位,含有一组意义相对完整的信息。分段的目的是为了更好的满足用户的需要。

  2. 页的大小固定且有系统确定,把逻辑地址划分为页号和页内地址两部分,一个系统只能有一种大小的页面。

    段的长度不固定 ,决定与用户所编写的程序,通常根据信息的性质来划分。

  3. 分页的作业地址空间是一维的,即单一的线性空间,只需利用一个记忆符,即可表示一地址。

    分段的作业地址空间是二维的,在标识一个地址时,既需给出段名,又需给出段内地址。

  4. 段式管理:没有内碎片(段大小可变),段换入换出时会产生外碎片

    页式管理:没有外碎片(页大小固定),但会产生内碎片(一个页可能填充不满)

虚拟存储管理

  • 虚拟内存,该策略甚至能使程序在只有一部分被调入内存的情况下运行

  • 虚拟存储器:

    指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外在容量之后所决定,其运行速度接近于内存速度,每位的成本接近于外存。

  • 局部性原理√

    时间上的局部性:最近被访问的页在不久的将来还会被访问

    空间上的局部性:内存中被访问的页周围的页也很可能被访问

  • 一般过程

    进程运行之前,仅需要将一部分页面或段装入内存,便可启动运行,其余部分暂时保留在磁盘上。

    进程运行时,如果它所需要访问的页面或段已经装入内存,则可以继续执行。

    如果所需要访问的页面或段尚未装入内存,则发生缺页(段)中断,进程阻塞。

    此时,系统将启动请求调页(段)功能,将所需装入内存。

    如果当前内存已满,需要利用页(段)置换功能将内存中暂时不用的页(段)交换到磁盘上,腾出足够的内存空间。

    再将进程所需的页(段)装入内存,唤醒阻塞的进程,使之重新参与调度执行。

  • 虚拟存储的好处√

  1. 可以运行程序,包括超过内存实际容量的大程序。
  2. 可以在有限的物理内存中运行更多的程序,多道程序系统的度不再受到物理内存空间的限制。
  • 虚拟存储的典型问题——抖动(thrashing)√

    如果系统花费大量的时间把程序和数据频繁地装入和移出内存而不是执行用户指令,称系统出现了抖动。出现抖动现象时,系统显得非常繁忙,但是吞吐量很低,甚至产出为零。

    根本原因:选择的页面或段不恰当。

  • 怎么解决抖动

    如果是因为页面替换策略失误,就修改替换算法

    如果是因为运行的程序太多,造成程序无法同时将所有频繁访问的页面调入内存,就降低多道程序的数量

    否则,还有两个办法:终止该进程;增加物理内存容量

  • 虚拟存储分页系统

  • 页面置换算法(不适当的置换算法可能导致系统出现“抖动”)√

    最佳置换算法Optimal:选择那些将来永不使用的,或者是在最长时间内不再被访问的页面置换出去。(理想化的算法,性能最好,但实际上难以实现)

    最近最少使用算法LRU(Least Recently Used):根据页面装入内存以后的使用情况,选择最近最久未使用的页面淘汰,在每个页面设置一个访问字段,记录这个页面最后一次被访问以来所经历的时间T,T最大的淘汰。(开销大,不易实现)

​ 先进先出算法FIFO:淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。 (该算法与 进程实际的运行规律不相适应,进程中的某些程序或数据可能需要高频使用,该算法导致这种类型的页面被 反复换进换出,降低系统性能)

​ 时钟算法clock:AKA最近未用算法Not RecentlrUsed,该算法为每个页面设置一个访问位,将内存中的所有 页面都通过链接指针链成一个循环队列,并设置一个扫描指针。当某页装入内存时,或被访问时,其访问位 置为“1”。未进行页面置换时,扫描指针总是指向上一次被置换页面所在位置的下一个位置。

​ 在选择一页淘汰时,移动扫描指针,检查其访问位,如果是“0”,就选择该页换出,同时把扫描指针移到下一 个位置;若为1,则重新置为0,暂不换出该页。由于该算法只有一位访问位,只能用它表示该页是否已经使 用过。

  • 虚拟内存的应用与优点

    虚拟内存适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。

    优点:

    • 在内存中可以保留多个进程,系统并发度提高
    • 解除了用户与内存之间的紧密约束,进程可以比内存的全部空间还大

外部设备管理

  • 设备管理的主要功能√ :设备分配,设备映射,设备驱动,I/O缓冲区的管理

  • I/O控制方式√ :

    程序控制I/O方式

    中断控制I/O方式

    DMA方式

    通道I/O方式

  • 设备分配算法:

  1. 先来先服务:根据进程对某设备提出请求的先后次序,将这些进程排成一个设备请求队列。设备分配程序总是把设备分配给队首的进程。
  2. 优先级高者优先服务:根据进程优先级的高低,将优先级高的进程排在设备等待队列的前面。对于优先级相同的进程,则按先来先服务的原则进行排队,设备分配程序总是把设备分配给排在队首的进程。
  • 磁盘调用算法√ :
  1. 先来先服务(FCFS)算法:按照输入/输出的先后次序为各个进程服务。公平、简单、但是效率低。

磁头移动的磁道数:79+97+95+87+16=374(之前在20)

磁头频繁移动,不但造成较大的时间开销,影响效率,容易使磁头臂疲劳,磁盘容易损坏。只适合负载很轻的系统。

  1. 最短寻道时间优先算法(Shortest Seek Time First):优先为距离磁头当前所在位置最近的磁道服务。

  2. 扫描算法Scan:也称电梯算法,开始时磁头处于最外磁道,并向内磁道方向移动,在移动过程中,如果经过的磁道有访问请求则为其服务。然后判断当前磁道以内的磁道是否还有访问请求,有的话继续移动,没有的话判断以外的磁道是否有访问请求,有的话磁头调转方向朝外移动。

    比较公平,效率很高。

    但是,若在某一段时间内某一磁道的访问请求不断,则磁头引臂将停留在该磁道上不动(磁臂粘着),磁盘被相应的进程垄断,其他磁道上的请求将在较长时间内得不到服务。

  3. N步扫描算法N-Scan:将磁盘请求队列分成若干个长度为N的子队列,磁盘调度程序按照FCFS算法依次处理这些子队列,处理每一个子队列的时候,按照SCAN算法。

    N值很大时,N步扫描算法的性能与SCAN算法的性能相当,N取1时,N步扫描算法退化为FCFS算法。

    在实际应用中,N步扫描算法被简化为:只为一次特定的扫描开始前已经等待的访问请求服务,以防止发生扫描算法中存在的不公平现象,尽管这种不公平的现象对磁头有利。

  4. 单方向的扫描算法C-SCAN:首先自里向外访问,当磁头移到最外的磁道并访问后,磁头返回到最里的欲访问磁道,即将最小磁道号紧接着最大磁道号构成循环,继续循环扫描。

  • 磁盘的平均访问时间

寻道时间+旋转延迟+传输时间

文件的存储方式影响着系统访问文件的效率(eg:连续存放还是随机存放),影响主要在于:访问文件总的寻道时间和总的旋转延迟。

文件管理

  • 文件系统

是指,操作系统中的各类文件、管理文件的软件,以及管理文件所涉及到的数据结构等信息的集合。

  • 文件系统的功能√ :

    有效的管理文件的存储空间

    管理文件目录

    完成文件的读/写操作

    实现文件共享与保护

    为用户提供交互式命令接口和程序调用接口

  • 文件系统 VS 数据库管理系统

  1. 数据库管理系统(负责数据定义及操作)依赖文件系统(只处理无结构、无格式的字节流)
  2. 数据库管理系统独立于文件系统
  • 文件的类型√

    • 按文件逻辑结构分类:

      无结构文件

      有结构文件:堆文件、顺序文件、索引顺序文件、索引文件、直接(哈希)文件

    • 按文件的物理组织结构分类:

      连续文件

      非连续文件:链接文件、索引文件

  • 用户对文件的访问权 = 用户访问权,目录访问权,文件属性的交集

  • 文件的安全性管理√

  1. 系统级安全管理:

    主要任务,防止未核准用户进入系统,以保证系统资源不得非法使用。

    必须确认用户的合法性,一个系统中允许同时注册的用户数目是有限的。

  2. 用户级管理:用户分类

    根据用户的性质、要求及访问的文件属性为用户分配“文件访问权限”。

    用户级安全管理包括对用户分类和为指定用户分配文件访问权两个方面。

  3. 目录级安全管理:

    与用户权限无关,是为保护系统中的各种目录而设计的。只有系统内核才具有写目录的权利。

    系统分别为用户和目录独立的指定访问权限。

  4. 文件级安全管理:

    通过系统管理员或文件主设置文件属性。

posted @ 2021-02-24 15:30  GladysChloe  阅读(110)  评论(0)    收藏  举报