操作系统 - 哈尔滨工业大学 孙志刚 笔记

笔记目录:

  1. 操作系统结构
  2. 进程管理
  3. 线程
  4. CPU调度
  5. 死锁
  6. 内存管理

操作系统结构

  1. 为了保证稳定和安全,应用程序和操作系统内核之间通过系统调用接口实现通信,应用程序不能直接操纵内核的信息。
Screen Shot 2018-04-06 at 12.24.32.png
  1. 中断服务程序一定是操作系统编写的。

  2. 一般很少用到的系统程序,如系统分区,磁盘碎片整理,磁盘快照。系统级的功能有系统级的程序来完成,这部分程序普通的用户不常用,一般由系统管理员用。

  3. 功能和需求以及硬件和工作的环境 决定操作系统的结构。

操作系统的简单结构

聚内核(无结构内核)
UNIX的系统构造-内核部分无结构

Screen Shot 2018-04-06 at 13.57.47.png

微内核
MINIX3的结构

Screen Shot 2018-04-06 at 14.08.05.png

LINUX的诞生:
Torvalds在阅读了他当时操作系统老师写的MINIX操作系统后,完成了LINUX系统,但是他的老师觉得他写的LINUX一团糟,因为他认为LINUX仍然没有摆脱UNIX的设计范畴,仍然使用大内核。后来他的老师提出了微内核的概念,并在MINIX3系统中实现。

内核做尽量少的事情,把更多的任务放到用户空间(如磁盘操作等)。(效率问题是微内核的死穴)

Solaris System

运用了面向对象的思想,将磁盘操作,文件读写等功能仍然放在内核部分,但划分了不同的模块。

Screen Shot 2018-04-06 at 14.25.39.png

混合结构-MacOS
MacOS系统有两个内核,一个BSD内核(聚内核),一个Mach内核(微内核)。

虚拟机结构

Screen Shot 2018-04-06 at 14.32.47.png

未来虚拟机的结构:


Screen Shot 2018-04-06 at 14.34.15.png

硬件之上直接是虚拟机,虚拟机上面再分各种内核。

进程管理

计算机系统在启动后,会进入两种模式,一个叫用户模式,一个叫内核模式。用户程序在用户模式下运行,不能随意读写任意内存。

系统引导
计算机通了电之后都经历了哪些事情?

  1. (加电自检)当我们按下开机键之后,首先BIOS会加电自检(Power On Self Test -post)。BIOS执行内存地址为FFFF:0000H处的跳转指令,跳转到固化在ROM中的自检程序,对系统硬件(显卡,CPU及硬盘、内存、光驱信息,主板信息)进行检查。
  2. (磁盘引导)自检完成后,ROM BIOS会按照系统CMOS设置中的启动顺序搜索装有操作系统的磁盘驱动器。(ps:从磁盘加载操作系统的原因有二:一是操作系统升级简单容易,二是使用户拥有选择操作系统的自由。)BIOS将相应启动设备的第一个扇区(MBR扇区(存储着磁盘分区等信息,大小固定为512字节))读入内存地址为0000:7C00H
  3. (执行MBR程序)检查0000:7DFEH-0000:7DFFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示"NO ROM BASIC"然后死机。
  4. 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处, 然后继续执行。
  5. 根据MBR中的引导代码启动引导程序。
  6. 此时的机器才是真正意义上的计算机。
Screen Shot 2018-04-07 at 14.34.16.png

当操作系统内核被加载,开始运行内核时,就不是boot的内容了。

加载操作系统的程序叫bootstrap

在计算机的ROM(计算机主板ROM芯片)里会有一段引导的初始程序。计算机在加电后最先运行的程序就是存放在ROM中的引导程序。

百度百科:

BIOS(Basic Input Output System)。是个人电脑启动时加载的第一个软件。它是一组固化到计算机内主板上的一个ROM芯片上的程序。它保存着计算机最重要的基本输入输出程序,开机后自检程序和系统自启动程序,它可以从CMOS中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代作业系统会忽略BIOS提供的抽象层并直接控制硬件组件。

BIOS中主要存放:

  1. 自诊断程序:通过读取CMOSRAM中的内容识别硬件配置,并对其进行自检和初始化;
  2. CMOS设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中;
  3. 系统自举装载程序:在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行以装入DOS系统;
  4. 主要I/O设备的驱动程序和中断服务:由于BIOS直接和系统硬件资源打交道,因此总是针对某一类型的硬件系统,而各种硬件系统又各有不同,所以存在各种不同种类的BIOS,随着硬件技术的发展,同一种BIOS也先后出现了不同的版本,新版本的BIOS比起老版本来说,功能更强。

CMOS(Complementary Metal Oxide Semiconductor)互补金属氧化物半导体。CMOS是主板上一块可读写的RAM芯片,用于保存当前系统的硬件配置信息和用户设定的某些参数。CMOS RAM由主板上的钮扣电池供电,即使系统断电信息也不会丢失。对CMOS中各项参数的设定和更新可通过开机时特定的按键实现(一般是Del键)。进入BIOS设置程序可对CMOS进行设置。一般CMOS设置习惯上也被叫做BIOS设置。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。

参考: 磁盘引导程序原理及简介

进程的定义
简单来说,运行起来的程序叫进程。

进程在内存中:


Screen Shot 2018-04-08 at 22.54.15.png

进程的几个状态:

Screen Shot 2018-04-08 at 23.09.56.png
Screen Shot 2018-04-08 at 23.13.05.png

进程各个状态转换图:

Screen Shot 2018-04-08 at 23.17.30.png
  • 处于running态的进程拥有CPU
  • 当处于running态的进程需要等待I/O操作或者等待某个点击事件后才能进行下一步操作,则此时会进入waiting态,让出CPU。
  • 当处于waiting态的进程获得点击事件或者I/O资源时,则会进入 ready态。
  • 处于ready态的进程获得CPU后,便会运行起来,进入running态。

PCB
操作系统通过PCB来控制进程的状态。

进程的切换:

Screen Shot 2018-04-09 at 13.28.37.png

系统切换进程有两种方式:中断和系统调用
中断的作用就是CPU暂时停止当前程序的执行转而执行处理新情况。
比如,当一个进程运行了比较长的时间,操作系统会发出一个中断信号(如通过晶振发出),这时CPU会暂停当前进程的执行,来到操作系统中的代码块,此时操作系统占有CPU,操作系统利用CPU将当前进程的状态置为ready,切换到其他进程的执行。

操作系统进入到等待态是应用程序主动通过一些操作进入到等待态:
running态的到waiting态的进程状态切换,则是通过当前进程通过主动发起系统调用,将CPU的使用权转给操作系统,再由操作系统改变进程的状态。

PCB表的组织形式:


Screen Shot 2018-04-09 at 13.31.42.png

??下面这一块不太懂


Screen Shot 2018-04-09 at 14.11.45.png
Screen Shot 2018-04-09 at 14.12.07.png
Screen Shot 2018-04-09 at 14.12.27.png
Screen Shot 2018-04-09 at 14.12.56.png
Screen Shot 2018-04-09 at 14.11.17.png
Screen Shot 2018-04-09 at 14.13.26.png
Screen Shot 2018-04-09 at 14.17.37.png
Screen Shot 2018-04-09 at 14.22.27.png
Screen Shot 2018-04-09 at 14.24.32.png
Screen Shot 2018-04-09 at 14.24.37.png
Screen Shot 2018-04-09 at 14.26.41.png

进程间的协作:独立与合作

Screen Shot 2018-04-10 at 14.02.53.png

进程合作的优点:

  1. 信息共享


    Screen Shot 2018-04-10 at 14.04.21.png
  2. 计算速度加快

Screen Shot 2018-04-10 at 14.04.58.png
  1. 进程间的通信方式:消息传递和共享内存
    消息传递效率更高。因为共享内存的方式会进行大量的系统调用。


    Screen Shot 2018-04-10 at 14.07.18.png
Screen Shot 2018-04-10 at 14.07.45.png
Screen Shot 2018-04-10 at 14.08.30.png
Screen Shot 2018-04-10 at 14.11.59.png
Screen Shot 2018-04-10 at 14.26.34.png

阻塞方式指的是,在该进程没得到自己所需资源时,就会被阻塞,被置为waiting态。

Screen Shot 2018-04-10 at 14.28.48.png

接收方不拿走这个消息就会被丢弃


Screen Shot 2018-04-10 at 14.28.58.png

会被缓存一会,收的慢的情况下也会丢失


Screen Shot 2018-04-10 at 14.29.02.png

没有限制


Screen Shot 2018-04-10 at 14.29.08.png
Screen Shot 2018-04-10 at 14.30.07.png
Screen Shot 2018-04-10 at 14.33.33.png

线程

Screen Shot 2018-04-11 at 12.44.32.png

线程的下面这些资源是独享的,每个线程会有自己:

  • 线程ID
  • 程序计数器 (存放下一条指令的地址)
  • 寄存器集
  • 栈 (记录程序的执行路径)


    Screen Shot 2018-04-11 at 12.44.51.png

其他的进程的大部分资源会被线程们共享。


Screen Shot 2018-04-11 at 12.48.09.png

单线程与多线程:单线程只有一条执行路线。多线程有各自的执行路线。


Screen Shot 2018-04-11 at 12.49.23.png

为什么要创建多线程,而不是选择创建多进程。(比如把耗时的操作,fork一个进程放到里面):

多线程的好处是资源共享(协作起来更方便),经济实惠。进程与进程之间是完全分隔的,不共享(也可以共享,但比较麻烦),进程的创建,销毁,切换开销都大于线程。

Screen Shot 2018-04-11 at 16.26.41.png

线程分为用户级线程和内核级线程:


Screen Shot 2018-04-11 at 16.40.37.png

用户级线程指的是,一个程序在自己内部模拟出多个线程,比如,保存当前正在执行的线程的数据现场,切换到另一个现场,继续执行,这样模拟出了多线程。

用户级线程的优点:

Screen Shot 2018-04-11 at 16.46.47.png

用户级线程的优点:


Screen Shot 2018-04-11 at 16.57.02.png

而且用户级线程还有一个缺点,就是当模拟出多个线程中的一个发生系统级的阻塞时,该程序的所有(模拟出的)线程都将被阻塞。因为在系统看来,它就是一个线程。

Screen Shot 2018-04-12 at 13.27.44.png
Screen Shot 2018-04-12 at 13.28.19.png
Screen Shot 2018-04-12 at 13.46.44.png
Screen Shot 2018-04-12 at 13.50.56.png

结束线程:

  • 直接强制杀死。(会造成一些难以预料的错误,比如该保存的资料没保存)
  • 告诉线程该退出了。设置个退出条件,达到条件自己主动退出。

总结

各个进程之间是完全独立的
线程模型不稳定,任何一个线程出问题,导致整个进程的崩溃
从安全角度看,线程的安全性比进程的安全性差

进程与线程的区别:

  • 进程绝对隔离,线程完全共享
  • 进程效率低,线程效率高

CPU调度

调度的目的是最大限度的利用CPU。

Screen Shot 2018-04-16 at 15.31.41.png
Screen Shot 2018-04-16 at 15.32.16.png
Screen Shot 2018-04-16 at 15.34.19.png

CPU和I/O交替进行:


Screen Shot 2018-04-16 at 15.34.33.png

有些进程利用CPU比较多,有些利用I/O比较多:


Screen Shot 2018-04-16 at 15.35.24.png

CPU调度发生的情形:


Screen Shot 2018-04-16 at 15.38.20.png
Screen Shot 2018-04-16 at 15.38.33.png
Screen Shot 2018-04-16 at 15.38.40.png
Screen Shot 2018-04-16 at 15.38.58.png

CPU调度分为抢占式和非抢占式:


Screen Shot 2018-04-16 at 15.39.33.png

分配CPU(恢复上次运行状态等处理,效率靠硬件来决定):

恢复上次运行状态


Screen Shot 2018-04-16 at 15.48.52.png

从系统态切换到用户态


Screen Shot 2018-04-16 at 15.49.06.png

切换完成后跳转到正确的地址开始执行:


Screen Shot 2018-04-16 at 15.49.21.png

调度进程和分配资源所花费的时间:

Screen Shot 2018-04-16 at 15.50.34.png

调度准则:1.最大化利用CPU


Screen Shot 2018-04-16 at 15.57.44.png

调度准则:2.大的吞吐量(单位时间运行的进程数量)


Screen Shot 2018-04-16 at 15.58.33.png

调度准则:3.尽可能小的周转时间(从创建到结束一共经过多久wall time(周转时间))


Screen Shot 2018-04-16 at 15.59.00.png

调度准则:4.尽可能小的等待时间(在就绪队列等待时间)

Screen Shot 2018-04-16 at 16.00.03.png

调度准则:5.尽可能小的响应时间 (接收一个事件到处理该事件经过的时间)


Screen Shot 2018-04-16 at 16.00.27.png

先来先服务:


Screen Shot 2018-04-17 at 14.04.47.png

最短作业优先:


Screen Shot 2018-04-17 at 14.05.48.png
Screen Shot 2018-04-17 at 14.06.32.png

两种调度模式:

  • 非抢占式和抢占式


    Screen Shot 2018-04-17 at 14.06.32.png

最短剩余时间优先:


Screen Shot 2018-04-17 at 14.22.51.png

优先级调度(一种实现策略)

优先级调度可能会导致优先级低的进程被饿死。

Round Robin(时间片轮转)

Screen Shot 2018-04-17 at 15.04.58.png

如果时间片太大,就变成了先来先服务
如果时间片太小,各个进程就会被频繁切换,进程切换时比较耗时间的(保存当前进程的现场,调度算法决定下次调用哪个进程)

将时间片轮转和优先级结合进行调度:

Screen Shot 2018-04-18 at 16.00.23.png

多级队列(将队列分为不同的优先级)

Screen Shot 2018-04-18 at 16.13.56.png

系统进程应该处于最高的优先级队列中(I/O绑定的进程:用CPU的时间比较短,大部分在时间用来I/O)

Screen Shot 2018-04-18 at 16.16.22.png

在队列之间进行调度:


Screen Shot 2018-04-18 at 16.21.55.png

固定队列的优先级(有可能发生饥饿):


Screen Shot 2018-04-18 at 16.22.10.png

为了降低饥饿发生的概率,在具有优先级的队列之间采用时间片:

Screen Shot 2018-04-18 at 16.22.21.png

现在操作系统中大多采用多级反馈队列调度算法:

Screen Shot 2018-04-18 at 16.22.43.png
Screen Shot 2018-04-18 at 16.24.23.png
Screen Shot 2018-04-18 at 16.25.11.png

优先级从上到下依次降低


Screen Shot 2018-04-18 at 16.27.10.png

进程第一次运行时,都被放在优先级最高的队列中(quantum=8(分配的时间片)的队列),根据该进程运行的状况将其移到响应的队列中。如:当进程第一次被运行时,先被放到上图quantum=8的队列中(优先级从上到下依次降低),当给该队列分配的8个时间片全被该进行消耗完的情况下,将该进程移到下一个优先级较低的队列中;在quantum=16的队列中时,给该队列分配的16个时间片又全被该进程消耗完,则将其移到下一个优先级较低的队列。

多核处理器:


Screen Shot 2018-04-19 at 14.10.38.png
Screen Shot 2018-04-19 at 14.13.43.png

多处理器面临的问题:

Screen Shot 2018-04-19 at 14.14.28.png

对称多处理器:

Screen Shot 2018-04-19 at 14.21.04.png
Screen Shot 2018-04-19 at 14.21.36.png

所有处理器共享同一个就绪队列(会存在一个问题,当进程从一个CPU被切到另一个CPU时,会导致Cache刷新,有性能损耗)


Screen Shot 2018-04-19 at 14.21.51.png
Screen Shot 2018-04-19 at 14.23.22.png

CPU的亲和性:(可将某个进程与某个特定的CPU绑定)

Screen Shot 2018-04-26 at 18.14.47.png
Screen Shot 2018-04-26 at 18.15.22.png
Screen Shot 2018-04-26 at 18.18.04.png
Screen Shot 2018-05-10 at 20.29.27.png
Screen Shot 2018-05-10 at 20.27.23.png
Screen Shot 2018-05-10 at 20.28.09.png
Screen Shot 2018-05-10 at 20.32.47.png

防止两个进程同时访问临界区的方法1:

Screen Shot 2018-05-10 at 21.03.10.png
Screen Shot 2018-05-10 at 21.12.18.png

关了中断后就不会进行进程切换,当一个进程进入临界区后关中断


Screen Shot 2018-05-10 at 21.12.50.png
Screen Shot 2018-05-10 at 21.14.36.png
Screen Shot 2018-05-10 at 21.15.13.png
Screen Shot 2018-05-10 at 21.16.01.png
Screen Shot 2018-05-10 at 21.18.04.png
Screen Shot 2018-05-14 at 12.07.13.png
Screen Shot 2018-05-14 at 12.12.05.png
Screen Shot 2018-05-14 at 12.13.15.png

死循环等待消耗CPU,造成性能损耗。这种方式也称为自旋锁。

Screen Shot 2018-05-14 at 12.13.33.png
Screen Shot 2018-05-14 at 12.16.48.png
Screen Shot 2018-05-14 at 12.18.46.png
Screen Shot 2018-05-14 at 12.20.43.png
Screen Shot 2018-05-14 at 12.20.51.png
Screen Shot 2018-05-14 at 12.21.53.png
Screen Shot 2018-05-14 at 12.25.48.png
Screen Shot 2018-05-14 at 12.26.26.png
Screen Shot 2018-05-14 at 12.27.44.png
Screen Shot 2018-05-14 at 12.37.12.png
Screen Shot 2018-05-14 at 12.40.57.png
Screen Shot 2018-05-14 at 12.44.35.png
Screen Shot 2018-05-14 at 12.47.19.png
Screen Shot 2018-05-17 at 13.23.24.png
Screen Shot 2018-05-17 at 13.24.09.png
Screen Shot 2018-05-17 at 13.25.19.png
Screen Shot 2018-05-17 at 13.26.27.png
Screen Shot 2018-05-17 at 14.03.05.png
Screen Shot 2018-05-17 at 14.10.45.png
Screen Shot 2018-05-17 at 14.14.16.png
Screen Shot 2018-05-17 at 14.20.22.png

哲学家就餐问题的另外一种解决方案:

给每个就餐的哲学家按顺序编号,奇数号的哲学家第一次只能拿左边的筷子,偶数号哲学家第一次只能拿右边的筷子。这样便可以保证至少有一个哲学家可以拿到两只筷子。
Screen Shot 2018-05-17 at 14.34.23.png
Screen Shot 2018-05-17 at 14.37.13.png
Screen Shot 2018-05-18 at 10.31.17.png
Screen Shot 2018-05-18 at 12.40.44.png
Screen Shot 2018-05-18 at 12.42.17.png
Screen Shot 2018-05-18 at 15.47.50.png
Screen Shot 2018-05-18 at 15.49.21.png
Screen Shot 2018-05-18 at 15.49.46.png
Screen Shot 2018-05-18 at 15.51.39.png

不死锁:


Screen Shot 2018-05-18 at 15.52.17.png

死锁:


Screen Shot 2018-05-18 at 15.54.02.png

不死锁:


Screen Shot 2018-05-18 at 15.54.53.png
Screen Shot 2018-05-18 at 15.55.39.png

死锁的四个条件:

  1. 互斥
  2. 保持和等待
  3. 不可剥夺
  4. 循环等待(我要你的,你要他的,他要我的)
Screen Shot 2018-05-18 at 15.56.25.png

解决死锁:

  1. 预防死锁
  2. 避免死锁
  3. 死锁的检测和恢复
  4. 鸵鸟算法(死锁装作没看见)(让软件开发者自己去解决)
Screen Shot 2018-05-18 at 15.56.41.png
Screen Shot 2018-05-18 at 16.00.52.png
Screen Shot 2018-05-18 at 16.01.14.png
Screen Shot 2018-05-18 at 16.02.20.png
Screen Shot 2018-05-18 at 16.03.42.png
Screen Shot 2018-05-18 at 16.04.29.png
Screen Shot 2018-05-18 at 16.04.52.png
Screen Shot 2018-05-18 at 16.05.22.png
Screen Shot 2018-05-18 at 16.12.22.png
Screen Shot 2018-05-19 at 14.41.01.png
Screen Shot 2018-05-19 at 14.42.16.png
Screen Shot 2018-05-19 at 14.44.23.png
Screen Shot 2018-05-19 at 15.18.14.png
Screen Shot 2018-05-19 at 15.18.21.png
Screen Shot 2018-05-19 at 15.19.07.png
Screen Shot 2018-05-19 at 15.21.33.png
Screen Shot 2018-05-19 at 15.25.32.png
Screen Shot 2018-05-19 at 15.25.40.png
Screen Shot 2018-05-19 at 15.25.56.png
Screen Shot 2018-05-19 at 15.26.02.png
Screen Shot 2018-05-19 at 15.42.10.png
Screen Shot 2018-05-19 at 15.42.18.png
Screen Shot 2018-05-19 at 15.42.43.png
Screen Shot 2018-05-19 at 16.09.57.png
Screen Shot 2018-05-19 at 16.10.22.png
Screen Shot 2018-05-19 at 16.11.39.png
Screen Shot 2018-05-19 at 16.18.22.png
Screen Shot 2018-05-19 at 16.18.37.png
Screen Shot 2018-05-19 at 16.19.10.png
Screen Shot 2018-05-19 at 16.23.45.png
Screen Shot 2018-05-19 at 16.24.47.png
Screen Shot 2018-05-19 at 16.25.40.png
Screen Shot 2018-05-19 at 16.26.19.png
Screen Shot 2018-05-19 at 16.26.58.png

你可能感兴趣的:(操作系统 - 哈尔滨工业大学 孙志刚 笔记)