操作系统学习记录

进程

一个程序的执行过程. 执行前需要将该程序放到内存中

进程 :

  • 程序 : 就是一个指令序列
  • 在不支持多道程序的计算机时期, 内存中只会有当前运行程序的数据, 括程序段和数据段, 程序的代码放在程序段内, 程序运行过程处理的数据放在数据段内(如变量);
  • 引入多道程序技术之后, 内存中同时存放多道程序的代码和运算数据, 并且各个位置都不相同. 操作系统要怎么才能找到各程序的存放位置? 这时引入了PCB(进程控制块), 用来描述进程的各种信息(如进程代码存放位置), 操作系统会为每个运行的程序配置一个PCB
  1. 定义 : 进程是进程实体的运行过程, 是系统进行资源分配和调度的一个独立单位. 进程实体是静态的, 进程是动态的, 但一般不做区分

  2. (进程实体的)组成 :

    1. 程序段 (程序代码)

    2. 数据段 (程序运行中的数据, 运算结果等)

    3. PCB :进程的管理者(操作系统)所需的数据, 不保存程序本身的代码

      一般我们所谓的创建进程, 实质上是创建进程实体中的PCB; 而撤销进程, 实质上就是撤销进程实体中的PCB; PCB是进程存在的唯一标志

      1. 进程描述信息

        • 进程标识符PID (类似身份证号)
        • 用户标识符UID (显示进程属于哪个用户)
      2. 进程控制和管理信息

        • 进程当前状态
        • 进程优先级
      3. 资源分配清单

        • 程序段指针
        • 数据段指针
        • 键盘
        • 鼠标
      4. 处理机相关信息

        • 各种寄存器值

        当进程切换时, 可能当前程序计算到一半, 中间结果的值可能是存放在寄存器中的, 为了让下一次接着进行计算,需要保存寄存器的值

  3. 组织方式(多个进程之间的)

    1. 链接方式 : 按照进程状态将PCB分为多个队列, 操作系统持有指向各个队列的指针
      • 执行指针 : 指向当前处于运行态(执行态)的进程
      • 就绪队列指针 : 指向当前处于就绪态的进程, 队列通常会把优先级高的进程放在队头
      • 阻塞队列指针 : 指向当前处于阻塞态的进程
    2. 索引方式 : 根据进程状态的不同,建立几张索引表, 操作系统持有指向各个索引表的指针
      • 执行指针
      • 就绪表指针
      • 阻塞表指针
  4. 特征

    • 动态性 : 进程最基本的特征, 进程是程序的一次执行过程
    • 并发性 : 内存中有多个进程实体, 各进程可并发执行
    • 独立性 : 进程是能独立运行, 独立获得资源, 独立接受调度的基本单位
    • 异步性 : 导致结果的不可预知
    • 结构性 : 每个进程都会配置一个PCB. 结构上看, 进程是由程序段, 数据段, PCB组成
  5. 进程的状态

    1. 创建态
    2. 就绪态 : 阻塞态到就绪态不是进程自身能够控制的,是一种被动行为, 没有CPU执行权
    3. 运行态 : CPU和其他所需资源
    4. 阻塞态 : 运行态转阻塞态是进程的一种自身行为,进程用"系统调度"的方式申请某种系统资源, 或者请求等待某个事件发生, 没有CPU执行权和其它所需资源的控制权
    5. 终止态 : 运行任务结束或者遇到不可修复的错误

用户接口:

  1. 命令接口(允许用户直接使用)

    1. 联机命令接口=交互式命令接口
    2. 脱机命令接口=批处理命令接口 C盘中的*.bat文件
  2. 程序接口(允许用户通过程序间接使用, 由一组系统调用组成)

    也称 : 系统调用=广义指令 例如, user32.dll

    • 系统调用可以认为是特殊的函数

    • 用户进程向操作系统申请资源的使用, 操作系统提供系统调用的功能, 用户进程只能通过系统调用向操作系统发起请求, 由操作系统来协调管理

    • 系统调用分类 : (都是只能在核心态下完成)

      • 设备管理

      • 文件管理

      • 进程控制

        进程控制就是要实现进程状态转换, 为了保证这个过程的安全, 使用原语

        原语的特点就是执行期间不允许中断, 采用关中断和开中断指令, 原语的特权非常大

      • 进程通信

        1. 共享存储 : 分配一个共享空间, 对共享空间的访问时互斥的
          1. 基于数据结构的共享
            比如共享空间只能放一个长度为10的数组, 这种共享方式速度慢, 限制多, 是一种低级通信方式
          2. 基于存储区的共享
            在内存中画出一块共享储存区, 数据的形式, 存放位置都由进程控制,而不是操作系统. 相比之下, 这种共享方式速度更快, 是一种高级通信方式
        2. 消息传递
          1. 直接通信方式
          2. 间接通信方式
        3. 管道通信
          在内存中开辟一个大小固定的缓冲区, 半双工通信
          双向同时通信需要设置两个管道
          管道没有写满不允许读, 没有读空就不允许写
          读进程最多只能有一个
      • 内存管理

    • 系统调用与库函数
      高级语言执行封装了系统调用的库函数时, 先在用户态执行陷入指令(内中断), 执行完成之后切换到核心态, 在核心态执行系统调用相应的服务程序, 完成后再切换回用户态

  3. GUI: 图形用户界面

四个特征:

  1. 并发:

    ​ 并发 : 同一时刻只执行一个程序, 但相互交替
    ​ 并行 : 同一时刻执行多个程序

  2. 共享

    1. 互斥共享方式 : QQ和微信一个时刻只能一个进行视频聊天
    2. 同时共享方式 : QQ和微信可以同时发送文件(共享地访问硬盘资源)
  3. 虚拟

  4. 异步

  5. OS的发展与分类

    1. 手工操作阶段
    2. 批处理阶段
      1. 单道批处理系统 : 引入脱机输入输出技术
      2. 多道批处理系统 (操作系统开始出现): 等待时间长, 不能够进行人机交互
    3. 分时操作系统 : 解决了人机交互问题, 但不能处理紧急任务,所有任务等地位
    4. 实时操作系统 :
      1. 硬实时操作系统: 必须在绝对严格的规定时间内
      2. 软实时操作系统 : 允许有一定的延迟, 例如12306
  6. OS的运行机制与体系结构

    • 指令和代码的区别 : 指令就是CPU能够识别的命令010101100
    • 特权指令和非特权指令
    • CPU的两种状态: 用户态(目态)和核心态(管态)
    • 两种程序: 内核程序和应用程序
    1. 运行机制

    2. 操作系统内核

      1. 大内核:高性能, 但内核代码庞大,难以维护 (小公司, 谁有空谁办, 比较灵活效率高)
      2. 微内核:内核功能少,结构清晰,方便维护 (大公司, 各司其职)
      • 时钟管理:实现计时功能

      • 中断处理: 负责实现中断机制

        中断机制的诞生: 为了解决利用率低的问题, 实现多道程序并发执行

        ​ 本质: 发生中断就意味着需要操作系统介入,开展管理工作

        用户态的状态下执行程序1, 计时部件发出中断信号, CPU切换到核心态,对中断进行处理, 执行权限交给操作系统, 操作系统经过一系列的管理操作后将CPU的执行权限交给用户进程, 切换回用户态

        ​ 中断是用户态切换到核心态的唯一途径; 核心态到用户态则很容易

        ​ 中断分为内中断(异常)和外中断(任务的完成), 区别在于信号的来源是否是CPU内部

        外中断发生时,需要保护被中断的CPU进程,相当于存盘方便读取进度

        ​ 陷入指令是唯一一个只可以在用户态下执行而不可以在核心态下执行的指令

      • 原语(原子性: 一旦开始, 不可中断)

      • 对系统资源进行管理

        • 进程管理
        • 存储器管理
        • 设备管理
    3. 操作系统的体系结构

调度算法

批处理系统p15

  1. 先来先服务FCFS : First Come First Serve

    1.公平
    2.按照到达的先后顺序进行服务(等待时间越久,越优先得到服务)
    3.用于作业调度时,考虑哪个作业先到达后备序列;用于进程调度时,考虑的是哪个进程先到达就绪队列
    4.非抢占式的算法
    5.对长作业有利,对短作业不利(短作业:需要的服务时间短的作业)
    6.不会导致饥饿(饥饿:某些作业或进程长时间等不到服务)
    饥饿的理解 : 想象一下每个人都插你的队,来一个插一个,永远排不到你
    排队买奶茶,假如你前面那个人要买20杯,店家还是先给他弄完20杯再给你弄,你的体验是相当糟糕的,相当于你被19个人插队
    
  2. 短作业优先SJF : Shortest Job First

    1.每次选择当前已到达的且运行时间最短的作业/进程
    2.默认是非抢占式
    3.在所有进程都几乎同时到达的情况下,采用SJF调度算法的平均等待时间,平均周转时间最小
    4.在不加前提下,抢占式的多作业优先算法的平均等待时间和平均周转时间最少
    5.不公平;并且作业(或进程)的服务时间是由用户提供的,不一定真实
    6.会导致饥饿;如果一直有短作业进入,那长作业会饿死.就相当于上面那买20杯奶茶的人可能得从它开始排队的时候等到所有人买完奶茶,才会轮到他
    
  3. 高响应比优先HRRN

    1.要综合考虑作业(或进程)的等待时间和要求服务的时间
    2.在每次调度时先计算各个作业(或进程)的响应比,选择响应比最高的作业(或进程)为其服务
    			响应比 = (等待时间 + 要求服务时间)/要求服务时间 
    		疑问:为什么不直接用等待时间/要求服务时间呢?平白无故加个1
    3.非抢占式
    4.不会导致饥饿
    

交互式系统

  1. 时间片轮转RR: Round-Robin

    1.只用于进程调度
    2.按照先到先得给每个进程分配一个时间片(),进程没有在时间片结束前执行完,则剥夺处理机,将其重新放到就绪队列队尾重新排队
    3.抢占式的算法,由时钟装置发出时钟中断来通知CPU时间片已到
    4.时间片不能太大,否则退化成先来先服务算法;也不能太小,进程切换频繁
    5.不会导致饥饿
    
  2. 优先级调度算法

    1.调度时选择优先级最高的
    2.既可以用于作业调度,也可以用于进程调度,甚至还会用于IO调度
    3.抢占式和非抢占式: 
    	非抢占式 : 只需在进程主动放弃处理机时进行调度即可
    	抢占式 : 需要在每次就绪队列发生变化时,检查是否会发生抢占行为
    
  3. 多级反馈队列调度算法

    抢占
    

调度算法的评价指标

  1. CPU利用率

    [利用率 = 忙碌的时间/总时间 ]

  2. 系统吞吐量

    [系统吞吐量 = 总共完成了多少道作业/总共花了多少时间 ]

  3. 周转时间

    [周转时间 = 作业完成时间 - 作业提交时间 = 作业实际运行时间 + 作业等待时间 + IO操作时间; ]

    [平均周转时间 = 各作业周转时间之和/作业数; ]

    [带权周转时间 = 作业周转时间/作业实际运行时间; ]

    [平均带权周转时间 = 各作业带权周转时间之和/作业数; ]

  4. 等待时间

    进程(或作业)等待被服务的时间之和
    平均等待时间 = 各个进程(或作业)等待时间的平均值
    
  5. 响应时间

    从用户提交请求到首次产生响应所用的时间
    

进程互斥

  1. 一段时间内只允许一个进程使用的资源称为临界资源

    1. 进入区
      负责检查是否可进入临界区,若可进入,则应设置正在访问临界资源的标志(上锁), 以阻止其它进程同时进入临界区
    2. 临界区
      访问临界资源的那段代码
    3. 退出区
      负责解除正在访问临界资源的标志(解锁)
    4. 剩余区
      做其他处理

    注意 :

    临界区时进程中访问临界资源的代码段;

    进入区和退出区是负责实现互斥的代码段

    临界区也可称为"临界段"

  2. 原则
    类比排队上厕所

    1. 空则让进
      厕所没人,那就先到先得
    2. 忙则等待
      厕所里面已经有人了,那后面来的人就得等等
    3. 有限等待
      等的人很多, 但每一个人等的时间都不能过长; 不能说你是本地人, 你就可以插我的队, 一个两个还好, 但每个本地人都这么干, 那这厕所也就不用上了
    4. 让权等待
      假如你在厕所门口排着队, 这时有人想要进来洗个手, 这时应该给别人让个位置
      当运行态的进程需要使用临界资源, 但临界资源又恰好被其它进程占用, 这时运行态的进程需要释放处理机(CPU执行权), 交给其它进程使用
  3. 软件实现方法 p18

    自己分析的关键在于分析哪些代码是进入区执行的, 让进入区代码进行交替执行会不会产生进程安全问题; 异步性的机制导致我们需要对进入区代码进行多种执行顺序的组合

    1. 单标志法 : 违背了空则让进的原则

    2. 双标志先检查法 : 异步性的属性会违背忙则等待的原则

    3. 双标志后检查法 : 先上锁再检查, 违背了"空闲让进"和"邮箱等待"的原则, 会产生"饥饿"现象

    4. Peterson算法 : 只是没有遵循让权等待的原则; 类比上厕所说客套话

      每个人都是先声明自己的意愿, 再客套一下, 每个人都要客套并且只客套一次

      所以后客套的人遭殃

  4. 硬件实现方法

    1. 中断屏蔽方法 : 不适用于多处理机, 并且中断指令权限大, 只能运行在内核进程, 如果让用户进程随意使用的话会很危险
    2. TestAndSet指令(TS指令或TSL指令) : 硬件实现, 执行的过程不允许被中断, 只能一气呵成
    3. Swap指令(Exchange指令或XCHG指令) : 硬件实现, 与TSL指令没有太大区别

进程同步

线程

  1. 一个进程的同时执行多个任务, QQ既可以发文件, 同时还可以聊天
  2. 内核级线程是资源分配的基本单位,线程是处理机调度的基本单位
  3. 同一进程的不同线程共享进程的资源
  4. 由于共享内存地址空间,同一进程的线程间通信甚至无需系统干预
  5. 同一进程的线程切换, 不会引起进程切换
  6. 不同进程中的线程切换, 会引起进程切换
  7. 切换同进程内的线程, 系统开销很小; 切换进程, 系统开销较大

多对一模型 : 并发度不高, ,没有利用到多核的优势

一对一模型 : 并发度高, 但一个进程占用太多内核级线程, 开销太大

多对多模型 : 相当于综合两者, 属于二者的一个折中方案

进程调度 :

  1. 高级调度 : 从无到有, 创建态
  2. 中级调度 : 从外存到内存
  3. 低级调度 : 从内存到CPU, 从就绪对列中选择一个进程为其分配处理机, 就绪态-->运行态

不能进行进程调度与切换的情况

  1. 在处理中断的过程中. 中断处理过程复杂, 与硬件密切相关, 很难做到在中断处理过程中进行进程切换
  2. 进程在操作系统内核程序临界区中
  3. 在原子操作过程中(原语). 原子操作不可中断, 要一气呵成

有的系统中, 只允许进程主动放弃处理机, 有的系统中, 进程可以主动放弃处理机也会强行被剥夺处理机

方式:

  1. 抢占式
  2. 非抢占式

进程的等待时间和作业的等待时间

作业的等待时间不仅包括在内存中建立进程的等待时间, 还包括在外存中等待被内存调用的时间

内存 : 过山车前的等待; 外存 : 进入游乐园的等待; 一开始都在外存中排队买票, 即使进入了内存, 还是需要在内存中排队等待被赋予CPU的执行权

内存

  1. 内存是存放数据的硬件. 程序执行前需要先放入到内存中才能被CPU处理
  2. 逻辑地址 : 相对地址
  3. 物理地址 : 绝对地址

内存管理

  1. 内存空间的分配与回收
  2. 虚拟技术, 需要提供某种技术从逻辑上对内存空间进行扩充
  3. 提供地址转换功能,负责程序的逻辑地址和物理地址的转换
  4. 内存保护 , 进程只能访问自己的那个进程的内存空间

覆盖与交换

  1. 覆盖技术 :
    解决 "程序大小超过物理内存总和" 的问题

    增加了用户编程的负担, 退出了历史的舞台

  2. 交换技术 :

原文地址:https://www.cnblogs.com/yimeisuren/p/12640089.html