现代操作系统第四版学习笔记

第二章 进程和线程

2.1 进程(Process)

进程模型

  • 单CPU伪并行,区分于多处理器系统

一个进程就是一个正在执行程序的实例,有程序、输入、输出以及状态

进程的创建

  • 启动操作系统时:守护进程概念
  • 系统调用,进程创建新辅助进程
  • 用户创建
  • 批处理作业的初始化
  • 每个进程有自己的地址空间
  • 进程创建之后,父进程和子进程有各自不同的地址空间

进程的终止

进程的层次结构

进程的状态

  • 一个进程在逻辑上不能运行时,会被阻塞,典型的例子就是等待可以使用的输入,进入阻塞态
  • 三个状态:1运行态、2就绪态(暂时没有cpu分配)、3阻塞态
  • 调度程序:1和2之间的转换
  • 外部事件发生时:3->2->1

2.2 线程(Thread)

并行线程在同一个地址空间运行。线程可在用户态实现,也可在内核态实现。

  • 传统操作系统中,每个进程有一个地址空间和一个控制线程,也经常存在同一地址空间并行运行多个控制线程的情形。
  • 线程比进程更轻量级,更容易创建和撤销

多线程并行 vs 单线程中断操作

多线程可以共享公共内存,使用多个进程做不到

  • 阻塞系统调用(线程、进程)

线程模型

线程必须在某个进程中执行,进程用于把资源集中在一起,线程则是在CPU上被执行调度的实体

  • 在同一个进程中并行运行多个线程,是对同一台计算机上并行运行多个进程的模拟。

多线程共享同一个地址空间和其他资源,多个进程共享物理内存、磁盘和其他资源

  • 每个线程有自己的堆栈,存放相应过程的局部变量和过程调用完成之后的返回地址
  • 线程带来的复杂性:父子进程和多线程之间的关系

线程的实现方式

  • 内核级线程:1:1
  • 用户级线程:N:1
  • 混合型线程:M:N
  • 一对一模型:每个用户级线程都设置一个内核线程与之连接,并发能力较强,但每创建一个用户线程,都需要创建一个内核线程。
  • 多对一模型:多个用户级线程分配一个内核线程。线程管理的开销较小,但是当一个线程在访问内核时发生阻塞,则整个进程会被阻塞。
  • 多对多模型:多个用户线程连接到多个内核线程上,内核控制线程的数目可以根据应用和系统的不同而变化,可以比用户线程少,也可以与之相同。

内核级进程

优:多处理器系统中,内核能够调度同一进程中的多个线程并行执行,并发性大。
缺:内核线程数量有限

用户级进程

优:线程切换速度非常快,创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多
线程的调度不需要内核直接参与,对内核不可见,控制简单。

用户级线程和内核级线程的区别

  • 内核支持线程是 OS 内核可感知的,而用户级线程是 OS 内核不可感知的。
  • 用户级线程的创建、撤消和调度不需要内核的支持,是在语言这一级处理的;而内核级线程的创建、撤消和调度都需内核提供支持,而且与进程的创建、撤消和调度大体是相同的。
  • 用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。
  • 在只有用户级线程的系统内,CPU 调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU 调度则以线程为单位,由 OS 的线程调度程序负责线程的调度。
  • 用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

进程与线程之间的关系

  • 一个程序至少有一个进程,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。
  • 线程的划分尺度小于进程,使得多线程程序的并发性高
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
  • 处理机分给线程,即真正在处理机上运行的是线程。
  • 线程是指进程内的一个执行单元,也是进程内的可调度实体。

进程与线程之间的区别

  • 调度:线程作为CPU调度和分配的基本单位,进程作为资源分配的基本单位。在同一进程中,线程的切换不会引起进程的切换;在由一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换。
  • 并发性:在引入线程的操作系统中,不仅进程之间可以并发执行同一个进程的多个线程之间也可以并发执行。因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量。
  • 拥有资源:进程是拥有资源的一个独立单位,它可以拥有自己的资源;而线程不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但可以访问隶属于同进程拥有的全部资源。
    子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。
  • 系统开销:由于在创建或撤消进程时,系统都要为之分配或回收资源,在进程切换时,设计整个进程当前的CPU环境的保存以及新调度到进程的CPU环境的设置,而线程切换只需保存和设置少量寄存器内容,开销很小,而且进程内多个线程共享进程地址空间、多线程之间的同步与通信非常容易实现,甚至无需操作系统干预。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。进程切换的开销也远大于线程切换的开销。

2.3 进程间通信IPC

进程间通过IPC交换信息,如信号量、管程和消息,确保不会有两个进程同时处在临界区。

  • 共享内存、消息传递

1. 三个问题:

  • 进程间怎么传递信息
  • 确保两个或多个进程在关键活动中不会交叉 (同样适用于线程)
  • 进程间的顺序 (同样适用于线程)

协作的进程可能共享彼此都能读写的存储区,可能在内存中也可能是个共享文件

2. 竞争条件:多个进程同时读写共享区数据,导致结果由精确的时序决定

  • 需要阻止多个进程同时读写共享区的数据 -> 互斥

3. 临界区:对共享内存进行访问的程序片段

任何两个进程不能同时处于临界区

4. 忙等待的互斥

  • 几种实现互斥的方案:
    • 屏蔽中断:一个进程进入临界区后屏蔽其他进程
    • 临界区锁变量
    • 轮换

一个进程进入临界区前进行检查,不允许则进程原地等待(忙等待),直到允许为止

5. 睡眠与唤醒

  • 生产者消费者问题:
    消费者读取数据区count值为0 —> 调度程序暂停消费者,启动生产者 —> 生产者往缓冲区加入一个数据项,count=1 —> 唤醒消费者,但是消费者可能还未睡眠(调度程序) —> count=0,消费者睡眠,缓冲区满后生产者睡眠 —> 两个进程睡眠

####6. 信号量、互斥量和管程

7. 消息传递

send(destination, &message);
receive(source, &message);

  • 消息传递 vs 内存共享

    • 由操作系统自动缓存,使用n条信息,类似于共享内存区的n个slot
    • 生产者取走一个空消息,送回一条填充了内容的消息,消费者再取走。
  • 信箱:对信息进行缓存的数据结构,send和receive的地址参数就是信箱地址,而不是进程地址。

8. 屏障

  • 用于进程组,而不是双进程的消费者-生产者情景

2.4 调度

1. 何时调度

  • 创建新进程后,先父还是先子。
  • 一个进程退出时,进程集中选择
  • 中断发生时

2. 调度算法分类

三种环境:

  • 批处理(非抢占式算法)
  • 交互式
  • 实时

3. 批处理服务的调度

  • 非抢占式的先到先服务,单链表队列
  • 最短作业优先
  • 最短剩余时间优先

4. 交互式系统的调度

  • 时间片轮转调度 (默认进程同等重要)
  • 优先级调度
  • 最短进程优先
  • 保证调度、彩票调度(不平等保护)

5. 实时系统的调度

6. 线程调度

2.5 经典的IPC问题

  • 就餐问题(有限资源的竞争问题): 死锁(进程同时启动占满cpu导致一个也运行不了) 或者 饥饿(同时启动又同时终止)
    —>需解决问题并获得最大并行度
  • 读-写问题: 读写不能同时进行,典型为数据库。如果正在读,则写进程被挂起,如果存在read流,则写进程可能永远没有机会。

进程间的通信方式

  • 信号(signal)通信机制:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。只能发送单个信号而不能传送数据。
  • 管道(pipeline)通信机制
    • 匿名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,需要双向通信时需要建立起两个管道;而且只能在具有亲缘关系的进程间(父子进程关系)通信。
    • 命名管道(FIFO):有名管道也是半双工的通信方式,克服了管道没有名字的限制,它允许无亲缘关系进程间的通信。
  • 消息传递(message passing)通信机制:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 信号量(semaphore)通信机制:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 共享内存(shared memory)通信机制:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
  • 套接字(socket)通信机制: 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

第三章 内存管理

3.1 无存储器抽象

  • 直接把物理地址暴露给进程,带来的问题:一是程序容易故意或者偶然的破坏系统,二是难以同时运行多个程序。

3.2 一种存储器抽象:地址空间

  • 使多个程序同时处于内存中并且不相互影响,需保护和重定位
  • 地址空间物理内存 之间存在映射,可以理解为抽象的物理内存

地址空间是一个进程用于内存寻址的一套地址集合,每个进程都有自己的地址空间,且每个进程的地址空间都是独立的(除特殊情况进程需共享)

每个进程的地址空间是独立的,比如一个进程地址28与另一个进程28是不一样的,可理解为相对地址而不是绝对地址。

  • 基址寄存器和界限寄存器: 分别存储程序起始地址 和 程序长度
    • 优点:这样就给每个进程提供了简单的私有地址空间
    • 缺点:每次访问内存都要进行加法和比较运算

3.3 两种处理内存超载的技术:交换技术 和 虚拟内存

  • 交换技术(物理内存上): 把一个进程完整调入内存,运行一段时间,然后存回磁盘。空闲进程主要存储在磁盘上。
  • 虚拟内存(使用地址空间): 每个程序有自己的地址空间,这个空间被分成多个,每一块称为页面(分页技术)。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。程序引用到一部分物理内存中的地址空间时,硬件立刻执行映射。引用到不在物理内存的地址空间(虚拟地址空间) 时,系统将缺失的部分装入物理内存并重新执行对应的指令。
  • 分页与页表:

分页有关的操作发生在四个时间段:进程创建时、进程执行时、缺页中断时、进程终止时。
地址空间的页面对应于物理空间的页框

3.4 页面置换算法(虚拟内存)

  • 当程序访问不在内存中的页面时,引起缺页中断,进行页面的置换。
  • 最优页面置换算法: 发生缺页中断时,先置换标记最大的页面。标记是指该页面在多少条指令之后才会被访问。不可实现,用作比较基准。
  • 最近未使用页面置换算法(NRU): LRU粗糙的近似。
  • FIFO算法(置换存在时间久的,可能抛弃重要页面) 和 第二次机会算法(存在时间久且没被使用)
  • 最近最少使用页面置换算法(LRU): 置换未使用时间最长的页面,只能通过特定的硬件实现,可用软件模拟。
  • 最好的两种算法:老化算法 和 工作集时钟算法,分别基于LRU和工作集。

3.5 分页系统的设计问题

问题:发生缺页中断并进行页面置换时,置换同一个进程的页面还是所有进程中的页面?

局部分配策略 和 全局分配策略

负载控制

  • 减少内存竞争的一个好方法是 将一部分进程交换到磁盘,即使使用虚拟内存技术分页,也需要交换技术,进行二级调度。

地址空间中分离 指令空间数据空间

共享页面

  • 多用户同时运行同一个程序,使用共享页面避免了内存中有一个页面的两个副本,效率更高。多进程可以使用同一个指令空间和不同的数据空间。

共享库(特例) 和 内存映射文件(通用)

3.6 分段

使程序指令和数据可以被划分为逻辑上相互独立的地址空间且有助于共享和保护 —> 指令空间和数据空间

第四章 文件系统

长期存储信息

  • 三个基本要求:

    • 能够存储大量信息
    • 使用信息的进程终止时,信息仍然存在
    • 能使多个进程并发访问
  • 路径名:Windows“\”, Unix“/”
    ./ 当前目录
    …/ 往上目录

文件的实现

  • 连续分配
  • 链表分配:文件分配表FAT

目录的实现(树)

查找:顺序查找、散列表查找

虚拟文件系统VFS

小结

  • 从外部看,文件系统是一组文件和目录,以及对文件和目录的操作。

第六章 死锁

死锁的定义: 一个进程集合中每个进程都在等待只能由该进程集合中其他进程进行才能引发的事件,则该进程集合就是死锁的。

资源间的竞争造成死锁

可抢占资源 与 不可抢占资源

资源死锁

死锁进程集合中的每个进程都在等待其他死锁进程所占有的资源

  • 资源死锁的条件:
    • 资源要么已经分配给了一个进程,要么是可用的。(互斥条件)
    • 已得到某个资源的进程可以再请求新的资源。(占有和等待条件)
    • 分配给一个进程的资源不能被强制性抢占,只能通过占有它的进程显示释放。(不可抢占条件)
    • 死锁发生时,一定有两个或者两个以上的进程组成的环路。(环路等待条件)

每个死锁的条件都能找到对应的可选解决死锁策略

死锁的建模:资源进程 有向图/矩阵

四种处理死锁的办法

  • 鸵鸟算法: 忽略问题
  • 死锁检测和恢复:
    • 检测:检测有向图是否存在一个或以上的环路
    • 恢复:抢占恢复、回滚恢复、杀死进程
  • 死锁避免: 基于安全状态的资源轨迹图、银行家算法
    从本质上来说是不可能的,因为需要获取未知的请求
  • 死锁预防: 至少破坏四个条件之一即可。

其他问题

  • 通信死锁:解决方案 —> 超时
  • 活锁: 当进程意识到获取不到下一个需要的资源时选择释放,等待后再尝试 —> 导致饥饿问题

第七章 虚拟化和云

把各个服务器放在独立的计算机之上,实现隔离和容错。(沙盒)

的功能是提供一个用户可以直接访问并任意使用的虚拟机,将计算资源集中到少数地方实现规模效益。IaaS / PaaS / SaaS

第八章 多处理机系统

  • 共享存储器多处理机
  • 多计算机
  • 分布式系统
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页