笔记目录:
- 操作系统结构
- 进程管理
- 线程
- CPU调度
- 死锁
- 内存管理
操作系统结构
- 为了保证稳定和安全,应用程序和操作系统内核之间通过系统调用接口实现通信,应用程序不能直接操纵内核的信息。
Screen Shot 2018-04-06 at 12.24.32.png
中断服务程序一定是操作系统编写的。
一般很少用到的系统程序,如系统分区,磁盘碎片整理,磁盘快照。系统级的功能有系统级的程序来完成,这部分程序普通的用户不常用,一般由系统管理员用。
功能和需求以及硬件和工作的环境 决定操作系统的结构。
操作系统的简单结构
聚内核(无结构内核)
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
硬件之上直接是虚拟机,虚拟机上面再分各种内核。
进程管理
计算机系统在启动后,会进入两种模式,一个叫用户模式,一个叫内核模式。用户程序在用户模式下运行,不能随意读写任意内存。
系统引导
计算机通了电之后都经历了哪些事情?
- (加电自检)当我们按下开机键之后,首先BIOS会加电自检(Power On Self Test -post)。BIOS执行内存地址为FFFF:0000H处的跳转指令,跳转到固化在ROM中的自检程序,对系统硬件(显卡,CPU及硬盘、内存、光驱信息,主板信息)进行检查。
- (磁盘引导)自检完成后,ROM BIOS会按照系统CMOS设置中的启动顺序搜索装有操作系统的磁盘驱动器。(ps:从磁盘加载操作系统的原因有二:一是操作系统升级简单容易,二是使用户拥有选择操作系统的自由。)BIOS将相应启动设备的第一个扇区(MBR扇区(存储着磁盘分区等信息,大小固定为512字节))读入内存地址为
0000:7C00H
。
- (执行MBR程序)检查0000:7DFEH-0000:7DFFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示"NO ROM BASIC"然后死机。
- 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处, 然后继续执行。
- 根据MBR中的引导代码启动引导程序。
- 此时的机器才是真正意义上的计算机。
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中主要存放:
- 自诊断程序:通过读取CMOSRAM中的内容识别硬件配置,并对其进行自检和初始化;
- CMOS设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中;
- 系统自举装载程序:在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行以装入DOS系统;
- 主要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
进程合作的优点:
-
信息共享
Screen Shot 2018-04-10 at 14.04.21.png
计算速度加快
Screen Shot 2018-04-10 at 14.04.58.png
-
进程间的通信方式:消息传递和共享内存
消息传递效率更高。因为共享内存的方式会进行大量的系统调用。
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
死锁的四个条件:
- 互斥
- 保持和等待
- 不可剥夺
- 循环等待(我要你的,你要他的,他要我的)
Screen Shot 2018-05-18 at 15.56.25.png
解决死锁:
- 预防死锁
- 避免死锁
- 死锁的检测和恢复
- 鸵鸟算法(死锁装作没看见)(让软件开发者自己去解决)
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