操作系统

ROM存储器是一次写入。

Flash存储器可以进行多次写入。

在电脑系统里电源启动会先执行ROM里面的程序,也就是常见的bios程序,他用来选择进入哪个具体系统。(BOIS是一个固化在ROM芯片中的程序)

graph LR;
  计算机运行模式-->内核态
  计算机运行模式-->用户态

操作系统运行在内核态上,内核态也称管态和核心态。

操作系用拥有硬件的访问权,可以执行机器能够运行的任何指令。

软件的其余部分运行在用户态。用户接口程序(Shell 或者 GUI) 处于用户态。

graph LR;
  操作系统对外的接口-->面向外部应用程序-->外壳Shell
  操作系统对外的接口-->面向内部-->内核kernel
  外壳Shell-->Linux
  外壳Shell-->Windows
  外壳Shell-->Android
  内核kernel

操作系统管理硬件资源:cpu 内存 磁盘 网卡 声卡 显卡

graph LR;
  cpu管理-->cpu调用  
  cpu管理-->进程线程管理
  内存管理-->物理内存
  内存管理-->虚拟内存
  • cpu管理:cpu调用 进程线程管理

  • 内存管理:物理内存管理,虚拟内存管理(为上层应用提供尽量大的内存空间)

  • 文件管理:

底层相关:中断处理,io,设备驱动

操作系统实现在一段时间同时运行多个程序的实现原理:

  • 多道程序设计:提高了计算机系统的使用效率。缺点:交互性不好。他的过程不需要人的参与,自动执行了。比如你想debug代码,但是程序的执行由系统自动执行了,那么我们就没办法在想要停止的位置终止我们的程序。
  • 分时系统:千分之一秒产生一个分时,也就是说一个程序只执行千分之一秒,人感受不到他的切换。分时调用,可以让我们有更好的交互。那他为什么可以打断程序的执行呢?时钟定期可以产生中断,帮助操作系统实现分时调用。

操作系统有自己的堆栈。

计算机体系结构/内存分层体系

  • 计算机体系结构
    • Cpu
    • 内存
    • 外设
  • 内存分层模型
  • 在操作系统的内存管理范例

地址空间/地址生成

地址空间:逻辑地址和物理地址。

逻辑地址到物理地址的映射关系是通过我们的操作系统来完成的。

程序逻辑地址空间。每个程序可以访问的地址空间。每个程序的运行就需要一段连续的内存空间。

因为需要连续的内存空间,所以很容易产生内存碎片。这时候需要使用更好的算法将内存空间进行更好的管理。

连续内存分配

  • 内存碎片化问题
    • 外部碎片
      • 在分配单元间的未使用内存
    • 内部碎片
      • 在分配单元中的未使用内存
  • 分区的动态分配
    • 第一适配
    • 第二适配
  • 压缩式碎片整理
  • 交换式碎片整理

最关心的是:内存碎片化问题。

一个程序需要运行的时候,操作系统要将程序从硬盘加载到内存中去。这个时候,需要为程序分配一个连续的内存空间用来存放这个程序。应用程序在运行的时候,需要为这个程序去提供一个连续的内存空间。

所以操作系统需要管理这些内存空间。他需要知道哪些内存空间是占用的,哪些是空闲下来的。

内存分配的几种方式:

  • 首次适配

    • 为了分配n字节,使用第一个可用的空闲块。如果现在5 10 200 那么我们需要4字节的内存空间,那么就选择5。
      • 优势:简单,易于产生更大的空闲块。缺点:容易产生外部碎片
  • 最优适配

    • 寻找整个空闲块里面,寻找那个最适合满足要求的空闲块。大白话就是找到那个更适合的。
      • 好处:避免把打的空闲块进行拆分。缺点: 容易产生外部碎片,充分配慢,容易产生很多的微小碎片
  • 最差匹配分配

    • 找到差距最大的空闲块进行分配
      • 好处:假如分配是中等尺寸效果最好。坏处:重分配,外部碎片,易于破坏空闲块以至于大分区无法被分配。
  • 压缩式碎片整理

    • 重置程序以合并某些内存块。要求所有程序是动态可重置的。
      • 何时重置,何时分销?在程序运行的时候进行挪动内存空间显然是不行的。
    img-0
  • 交换式碎片整理

    • 运行程序需要更多的内存
    • 抢占等待的程序&回收他们的内存
      • p1p2p4已经把内存占满了,然后p4现在在等待事件产生,那么操作系统就把p4的内存块移到了硬盘里面,那么p4占的内存空间就被空出来了。正在执行的p3就分配到了他需要的内存空间。

物理内存的管理第二部分

如何更好的管理非连续内存?

为什么需要非连续内存分配?基于连续内存分配带来的问题。

基于连续内存分配的缺点

  • 分配给一个程序的物理内存是连续的
  • 内存利用率低
  • 有外部碎片,内部碎片的问题

为了改善这些问题,提出了非连续内存。

非连续分配的优点:

  • 一个程序的物理地址空间是非连续的
  • 更好的内存利用和管理
  • 允许共享代码和数据
  • 支持动态加载和动态链接

缺点:

  • 如何建立虚拟地址和物理地址之间的转换
    • 软件方案
    • 硬件方案
      • 分段机制
      • 分页机制
img-0

进程管理

  • 什么是进程
  • 进程状态
  • 线程
  • 进程间通信
  • 进程互斥与同步
  • 死锁

进程描述

  • 进程定义
    • 代表整个程序运行过程的描述
    • 为什么要有进程?因为在之前只能跑一个程序,现在需要跑多个程序,那么一个程序的实例在系统里面的表诉就是一个个进程。
    • 进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
  • 进程的组成
    • 程序的代码需要放到内存中。
    • 程序处理的数据。数据需要放到内存中
    • 程序计数器中的值,指示下一条将运行的指令。
    • 一组通用的寄存器的当前的值,堆,栈
    • 一组系统资源(如打开文件)
    • 总之:进程包含了正在运行的一个程序的所有状态信息。
    • 进程与程序的联系:
      • 程序是产生进程的基础。
      • 程序的每次运行构成不同的进程。
      • 进程是程序功能的体现。
      • 通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包含多个程序。
    • 进程与程序的区别
      • 进程是动态的,程序是静态的。程序是有序代码的集合。进程是程序的执行,进程有核心态/用户态
  • 进程的特点
    • 动态性:可创建,结束;
    • 并发性:进程可以被独立调度并占用处理机运行。并发并行。多个cpu才能实现并行。;
    • 独立性:不同进程的工作不相互影响;
      • 怎么保障的呢?前面讲了内存管理,通过页表实现不同的不同的程序访问不同的地址空间,他不可能越过对应的地址空间。
    • 制约性:因访问共享数据/资源数据或进程间同步而产生制约。;
  • 进程控制块
    • 操作系统管理控制进程运行所用的信息集合,操作系统用PCB来描述进程的基本情况以及运行变化的过程,pcb是进程存在的唯一标识。
    • 使用进程控制块
      • 进程的创建:为该进程创建一个pcb
      • 进程的终止:回收pcb
      • 进程的组织管理:通过对pcb的组织管理来实现。

进程控制块PCB具体含有什么信息,如何组织,进程的状态转换?

  • 进程的标识信息
    • 如本进程的标识,本进程的产生者标识(父进程标识);用户标识
  • 处理机状态信息保存区:保存进程的运行现场信息
    • 用户可见寄存器:用户程序可以使用的数据,地址等寄存器
    • 控制和状态寄存器:如程序计数器(PC),程序状态字(PSW)
    • 栈指针:过程调用/系统调用/中断处理和返回时需要用到它。
  • 进程控制信息
    • 调度和状态信息:用于操作系统调度进程并占用处理机使用
    • 进程间通信信息:为支持进程间的与通信相关的各种标识,信号,信件等。这些信息存在接收对方的进程控制块中。
    • 存储管理信息:包含有指向本进程映像存储空间的数据结构。
    • 进程所用资源:说明由进程打开,使用的系统资源,如打开文件等。
    • 有关数据结构链接信息:进程可以连接到一个进程队列中,或连接到相关的其他进程的pcb
  • pcb的组织方式
    • 链表:同一状态的进程其pcb成一链表,多个状态对应多个不同链表。各个状态的进程形成不同的链表:就绪链表,阻塞链表。
    • 索引表:同一状态的进程归入一个index表,由index指向pcb,多个状态对应多个不同的index表。

进程状态

  • 进程的生命周期

    • 进程创建

      • 引起进程创建的三个主要事件:
        • 系统初始化;
        • 用户请求创建一个新进程;
        • 正在运行的进程执行了创建进程的系统调用;
    • 进程运行

      • 内核选择一个就绪的进程,让他占用处理机并执行。
        • 为何选择,如何选择?
    • 进程等待

      • 请求并等待系统服务,无法马上完成。
      • 启动某种操作,无法马上完成。
      • 需要的数据没有到达。
      • 进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生。
    • 进程唤醒

      • 被阻塞进程需要的资源可被满足
      • 被阻塞进程等待的事件到达
      • 将该进程的pcb插入到就绪队列
      • 进程只能被别的进程或操作系统唤醒。
    • 进程结束

      img-0
  • 进程的三种基本状态

  • 运行状态
  • 就绪状态
  • 等待状态
  stateDiagram-v2
  new --> ready: 进入就绪队列
  ready-->running: 被调度
  running-->ready: 时间片完
  running-->blocked: 等待事件
  blocked-->ready: 事件发生
  running-->exit: 结束

线程管理

为什么使用线程,什么是线程,线程的实现,多线程编程接口实现。

  • 什么是线程:

    • 进程当中的一条执行流程

      • 从资源组合的角度:进程把一组相关的资源整合起来,构成了一个资源平台,包括地址空间(代码段,数据段),打开文件等各种资源。
      • 从运行角度:代码在这个资源平台上的一条执行流程。
      img-0
    • 线程的缺点:一个线程崩溃,会导致其所属的进程的所有线程奔溃。

      • 这就出现了一个问题:什么时候使用线程 什么时候使用进程?
        • 在需要安全性的时候使用进程。防止一个线程的奔溃导致进程崩溃了。
    • 线程所需要的资源:需要有独立的寄存器,堆栈。但是共享代码段,数据段。

    img-0

线程与进程的区别

  • 进程是资源分配的单位,线程是cpu调度的单位
  • 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈。
  • 线程同样具有就绪,阻塞和执行三种基本状态,同样具有状态之间的转换关系。
  • 线程能减少并发执行的时间和空间开销。
    • 线程的创建时间比进程短
    • 线程的终止时间比进程短
    • 同一进程内的线程切换时间比进程短。
    • 由于同一进程的各线程共享和文件资源,可直接执行不通过内核通信。