1.1.1 操作系统的概念,功能
概念
操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。

系统资源管理者

从资源管理的角度,操作系统的功能划分如下:

向上提供方便易用的服务
封装思想:
操作系统把一些丑陋的硬件功能封装成简单易用的系统服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需要对操作系统发出命令即可。

图形化用户接口

联机命令接口

脱机命令接口

程序接口

为什么图示中用户和操作系统有一部分是直接相接的?
用户有两个方式使用操作系统,可以通过GUI直接使用操作系统(在图示上表示为直接相连),也可以通过接口间接使用操作系统(图示上表示为间接接触)。
狭义的用户接口不包含GUI

作为最接近硬件的层次

功能

① 逻辑地址:
一个应用程序经编译后,通常会形成若干个目标程序,这些目标程序 再经过链接而形成可装入程序。这些程序的地址都是从某一起始地址开始的,程序中的其它地址都是相对于起始地址计算的;由这些地址所形成的地址范围称 “地址空间”,其中的地址称为“逻辑地址”。
② 物理地址:
由内存中的一系列单元所限定的地址范围称为“内存空间”,其中的地址称为“物理地址”。
③ 地址映射:
在多道程序环境下,逻辑地址和物理地址不可能一致。必须通过地址映射功能,将逻辑地址转换为内存空间中与之对应的物理地址。地址映射应在硬件支持下完成。
总结

1.1.2 操作系统的四个特征
特征1------并发
并发:
指两个或者多个事件在同一时间间隔发生。这些事件宏观上看是同时发生的,但微观上看是交替发生的。
易混淆概念:并行
指两个或多个事件在同一时刻同时发生


四核CPU不考虑并发的话,宏观上来看最多只有四个程序同时执行。要从宏观上来看同时执行四个以上的程序,就还是需要并发。

特征2------共享
特例:
在宏观和微观上在一个时间段同时对资源进行访问的例子:
游戏和音乐同时播放(游戏和音乐这个两个进程同时在访问扬声器,不是交替的)

并发和共享的关系(互为存在条件)

特征3------虚拟
虚拟是指把一个物理实体映射为一个或多个逻辑对应物,物理实体是实际存在的,而逻辑对应物是用户感受到的(虚构的)。
空分复用

时分复用

并发与虚拟的关系(没有并发,就谈不上虚拟)

特征4------异步
异步是指,在多道程序环境下,允许程序并发执行,但由于资源有限,程序的执行不是一次性执行完的,而是走走停停,各个程序以不同的、不可预知的速度向前推进。

并发与异步的关系

总结

1.2 操作系统的发展与分类

手工操作阶段
缺点1:用户独占全机(同一个时间,只能有一个人在使用)
缺点2:人机矛盾导致的资源利用率低(当时计算机的造价昂贵,但是在这个过程中使用的时间却很短很短)

批处理阶段------单道批处理系统(非交互的)
改进的方面:
1.磁带最开始接收多个用户的纸袋内容,不再是一个用户独占全机了
2.使用磁带进行读写,快于纸袋机,提升了输入的速度
3.并且有监督程序(早期操作系统)可以控制作业的输入输出,一道作业执行完以后,不用用户再去输入就可以执行下一道
优点:
缓解了一定程度的人机速度矛盾,资源利用率有所提升
缺点:
内存中仅有一道程序运行,只有该程序运行结束之后才能调入下一道程序。CPU有大量的时间是在空闲等待I/O完成。资源利用率低。
引入脱机输入/输出技术(用外围机+磁带完成),并由监督程序负责控制作业的输入、输出

磁带的读写速度比纸袋机快很多
这个监督程序就是操作系统的雏形

批处理阶段------多道批处理系统(非交互的)
改进方面:
解决CPU因等待I/O导致利用率低的问题
CPU在计算第一个作业的时候,输入设备是处于空闲状态的,可以在CPU计算前一道作业的同时使用输入设备进行下一道作业的输入。
缺点:没有人机交互功能,用户提交自己的作业之后就只能等待计算机的处理完成,中间不能控制自己作业的执行,不能调试也无法添加参数。


分时操作系统
改进方面:
采用时间片轮转,解决了人机交互问题,允许多个用户同时使用一台计算机,可通过终端与计算机进行交互
缺点:不能优先处理一些紧急的任务
轮流为每个用户执行一段时间,所以最后宏观上来看,所有用户的输出应该是同时完成的

单道批处理、多道批处理、分时系统总结

实时操作系统
改进方面:可以优先处理一些紧急的任务,紧急的任务不需要排队
软实时:
- 导弹不实时会偏离轨迹
- 自动驾驶不实时会发生交通事故
硬实时:
- 12306的车票更新是实时的,但是可以稍微晚一点,不会造成大的影响。

其他几种操作系统
分布式操作系统和网络操作系统的主要区别是共享性
总结

1.3.1 操作系统的运行机制

程序是如何运行的
注:
- 这里指的指令是二进制的机器指令
- Linux,Windows的cmd,MasOS的小黑框中使用的命令也称为"指令",其实这是"交互式命令接口"

内核程序&应用程序

特权指令&非特权指令
特权指令:
只能在系统态执行的机器指令,一般是影响系统全局的一些指令,如启动I/O指令、关中断指令
非特权指令:
应用程序只能使用非特权指令,如加法指令、减法指令等
CPU的内核态&用户态

CPU能判断出指令类型,但是它怎么区分此时正在运行的是内核程序还是应用程序?

内核态&用户态的切换

总结

1.3.2 中断和异常
中断的定义
- 中断是改变处理器执行指令顺序的一种事件。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。计算机在执行程序的过程中,当出现中断时,计算机停止现行程序的运行, 转向对这些中断事件的处理,处理结束后再返回到现行程序的间断处。
- 引入中断机制能有效提高CPU的利用率,CPU可以与其它设备并行工作,能有效提高CPU的利用率, 改善系统性能。
中断的作用
- 中断是让操作系统夺回CPU使用权的唯一途径
- 中断会使CPU由用户态变为核心态,使操作系统程序夺回CPU的控制权
- 没有中断,操作系统内核无法夺回CPU的使用权,就无法切换到下一个应用程序,就无法做到并发(一旦应用程序上CPU运行,CPU就会一直运行这个应用程序)

中断的类型

内(部)中断(同步中断或异常)
与当前执行的指令有关,中断信号来自于CPU内部
CPU在执行程序过程中由内部电信号产生。通常在一条指令执行完毕后才会发出中断,而不是在指令执行期间,是不可屏蔽的。
主要包括三种:
① 出错(Fault):保存的EIP【CPU下次要执行的指令的地址】指向触发异常的那条指令;当从异常返回时,出错会重新执行那条指令,如缺页异常。
② 陷入(Trap):使执行流程从用户态陷入内核态,用户程序可以调用内核函数和使用硬件。保存的EIP指向触发异常的那条指令的下一条指令。当从异常返回时, 陷入就不会重新执行。
③ 可编程中断:程序主动执行中断指令,和Trap类似,预先设计,Trap和可编程中断统称为软中断(software interrupt)
例子:
- 试图在用户态下执行特权指令
- 执行除法指令时发现除数为零
- 有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令(陷入指令,Trap),该指令会引发一个内部中断信号(执行陷入指令,意味着应用程序主动把CPU控制权还给操作系统内核,系统调用就是通过陷入指令完成的)
- 缺页故障
外(部)中断(异步中断)
- 与当前执行的指令无关,中断信号来源于CPU外部
- 异步中断是CPU被动接收到的,由外设发出的电信号引起,其发生时间不可预测。 CPU对其的响应也完全是被动的。
主要分为:
① 外部可屏蔽中断
- I/O设备发出的所有中断请求(IRQ)都是可屏蔽中断。
- 在Intel体系结构的CPU中, 当EFlags寄存器的IF标志被清0时,每个可屏蔽中断都由CPU暂时忽略。
② 外部不可屏蔽中断
- 如电源掉电。
例子:
时钟中断:由时钟部件发来的中断信号(时钟部件每隔一个时间片,会给CPU发送一个时钟中断信号)
I/O中断:由输入/输出设备发来的中断信号

引起中断的原因
① 人为设置中断:在程序中人为设置中断
② 程序性事故:计算中出现除数为0(故障)
③ 硬件故障:插件接触不良、电源掉电等
④ I/O设备:I/O设备被启动以后,一旦其准备就绪,便向CPU发出中断请求
⑤ 外部事件:如用户通过键盘来中断现行程序
中断响应
① 响应外部中断的条件:开中断
② 响应外部中断的时机:CPU每执行完一条指令
③ 内部中断:产生中断时响应(立即停止当前指令的执行,保存当前的程序状态,然后跳转到中断处理程序的入口地址,开始处理中断)
中断机制的基本原理
找到中断服务子例程:
不同的中断信号,需要不同的中断处理程序来处理。当CPU检测到中断信号后。会根据中断信号的类型去查询"中断向量表",以此来找到相应的中断处理程序在内存中的存放位置。
- 中断向量:对不同中断源到来的信号编号,编号是一个无符号整数,称之为中断向量。(0-255)
- 不可屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。


中断的上半部、下半部
外部中断会打断内核中进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽可能地短小精悍。但是,大多数真实的系统中的中断要进行较大量的耗时处理。
Linux的解决方案:
- Linux将中断处理程序分解为两个半部:顶半部 (top half)和底半部(bottom half)。
- 顶半部完成尽可能少的比较紧急的功能,它往往只是简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。
- 底半部处理程序挂到该设备的底半部执行队列中去。这样,顶半部执行的速度就会很快,可以服务更多的中断请求。
- 底半部完成中断事件的绝大多数任务。底半部则相对来说并不是非常紧急的,而且可以被新的中断打断。

总结

1.3.3 时钟管理
时钟的重要性
时钟的重要性
- 定时测量、编译程序、防止进程垄断CPU或其他资源、与时钟相关的软件需要时钟支持
计算机系统中的时钟
计算机系统中的时钟
① 实时RTC时钟:也叫CMOS时钟,是一块时钟芯片,靠电池供电,为计算机提供计时标准,是最原始、最底层的数据。
② OS时钟:产生于PC主板上的定时/计数芯片,在开机时有效。

操作系统的时钟机制
操作系统的时钟机制:
(1)需要完成的定时测量功能:
- 保存当前的日期和时间;
- 维持定时器
(2)如何实现?
- 操作系统依靠时钟硬件(可编程间隔定时器)
- 时钟软件(时钟驱动程序)
OS时钟硬件(可编程间隔定时器PIT,Programmable Interval Timer)
➢功能:按指定时间间隔产生时钟中断,测量逝去的时间,并触发与时间有关的操作
➢组成:OS时钟由三个元件组成:晶振、计数器、保持寄存器

时钟中断处理程序主要功能
① 维护日期、时间
② 递减时间片并检查是否为零,防止进程运行超时
③ 对CPU的使用情况记帐
④ 递减报警计数器
Linux(2.3) 将两次时钟中断间隔定义为10ms(每秒产生100次时钟中断)
➢时钟中断的频率取决于硬件体系结构。较慢的机器的节拍大约10ms(每秒产生 100次时钟中断),而较快的机器节拍为大约1ms。
➢Linux用全局变量jiffies表示自系统启动以来的时钟中断次数。
1.3.4 系统调用
系统调用的定义和作用
CPU的两种运行状态
- 内核态执行内核空间是指含有一切系统核心代码的地址空间,当CPU执行系统核心代码时,称进程处于内核态执行,CPU状态(模式)为内核态。
- 用户态执行用户空间是指用户进程所处的地址空间,当CPU执行用户空间的代码时,称该进程在用户态执行,CPU状态(模式)为用户态。
回顾:
- 操作系统为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务
- 主要包括命令接口和程序接口
- 用户是通过命令接口或者程序接口向计算机发出请求的(狭义的用户接口不包括图形化用户接口)
- 程序接口由一组系统调用组成
系统调用:
- 系统调用是操作系统提供给应用程序(程序员/编程人员)使用的接口(提供给编程人员的唯一接口),可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务
- 系统调用是一组预先定义好的模块,提供一条管道让应用程序或一般用户能由此得到核心程序的服务。它是核心程序与用户程序之间的接口,在类UNIX系统中,系统调用多使用C语言所提供的函数库接口。
- 系统调用是由操作系统提供的内部调用,它只能通过用户程序间接使用

系统调用与一般库函数的区别
① 操作系统向编程语言提供系统调用,编程语言向应用程序提供库函数(函数)
② 普通应用程序可以直接进行系统调用,也可以使用库函数,有的库函数涉及到系统调用,有的不涉及,如“取绝对值”的函数——abs()
③ 系统调用实现例程运行在系统态(核心态)而一般函数运行在用户态。
④ 执行过程是不同的。当系统调用执行时,当前进程被中断,由系统找相应的系统调用实现例程,并在系统态下执行,执行结果返回进程。
⑤ 系统调用要进行“中断处理”比一般函数调用多了一些系统开销。

为什么系统调用是必须的?
系统调用向操作系统内核发出请求,内核会对各个请求进行协调处理(系统调用通过陷入指令来完成(陷入是一种内中断)-->向内核发出请求,把CPU控制器还给内核)

什么功能要用到系统调用?
应用程序通过系统调用请求操作系统的服务。而系统中的各自共享资源都由操作系统内核统一掌管。因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用的类型:
① 进程控制类系统调用
- 创建、撤消进程
- 获得、改变进程属性
② 文件操纵系统调用:创建、删除、打开、关闭、读、写文件
③ 设备管理系统调用:请求、释放设备
④ 通信用系统调用:打开、关闭连接、交换信息
⑤ 信息维护:返回系统当前日期、时间、版本号、空闲内存、磁盘空间大小等

操作系统提供系统调用的优点
① 使编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来
② 提高了系统的安全性。
扩展------Linux的系统调用
在Linux中,一共提供380 个system call。常见的如 open, read, write, close, wait, exec, fork, exit, kill、strace, ftrace, truss等。

系统调用的过程
传递系统调用参数→执行陷入指令(用户态)→执行相应的系统调用服务程序(核心态)→返回用户程序
注意:
- 陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,从而CPU进入核心态
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行


总结

1.4.1 操作系统体系结构
操作系统的内核
操作系统内核是计算机硬件的第一次扩充,内核执行OS与硬件关系密 切,执行频率高的模块,常驻内存。
不同的OS内核包括的功能不同,多数OS内核包括下述功能:
➢支撑功能
- 中断处理、时钟管理、系统调用
➢资源管理功能
- 进程管理、存储器管理、设备管理


大内核包括对数据结构的操作,微内核只包括对硬件的操作
注意:
- 操作系统内核需要运行在内核态
- 操作系统的非内核功能运行在用户态

操作系统的体系结构
微内核涉及到更多的CPU状态转换,频繁的CPU状态转换(变态)会降低系统的性能
注意:
- 变态的过程是有成本的,要消耗不少时间,频繁地变态会降低系统性能

总结

1.4.2 操作系统的体系结构(新版)


分层结构
每层只能调用相邻的更低的一层提供的接口,不可跨层调用
优点:
1.便于调试和验证,自底向上逐层调试验证,如硬件层,厂家出场的时候就是验证好的
2.容易扩充和维护,各层之间调用接口清晰固定,如在两层之间新增一层是很方便的
缺点:
1.仅可调用相邻低层,难以合理定义各层的边界
两个层之间很难不用到另一个层,如果不是相邻的,再使用的时候就会产生矛盾(不能跨层调用)。

2.效率低,不可跨层调用,系统调用执行时间长
如下面:A不能直接给D传递信息,D也不能直接给A传递信息
必须要A先给B传,B再传给C,C再传给D


模块化

外核

1.5 操作系统引导



1.6 虚拟机
操作系统中一些经典的问题
生产者与消费者问题
在生产者-消费者问题中,生产者和消费者通过共享缓冲区进行数据的生产和消费。
这里的缓冲区是临界资源(能互斥访问的共享资源)
通常情况下,通过信号量来实现对缓冲区的同步和互斥控制。
在这个问题中,通常有两个信号量和一个互斥锁:
- 空位信号量 (empty):表示缓冲区中空闲位置的数量。
- 满位信号量 (full):表示缓冲区中已占用位置的数量。
- 互斥锁 (mutex):用于保护对缓冲区的互斥访问。
正确的操作顺序:
-
生产者的顺序:
wait(empty):等待缓冲区有空位。wait(mutex):等待缓冲区,进去的时候锁住缓冲区,确保互斥访问。- 放入产品到缓冲区。
signal(mutex):解锁缓冲区。signal(full):通知消费者缓冲区中有新产品。
-
消费者的顺序:
wait(full):等待缓冲区中有产品。wait(mutex):等待缓冲区,进去的时候锁住缓冲区,确保互斥访问。- 从缓冲区取出产品。
signal(mutex):解锁缓冲区。signal(empty):通知生产者缓冲区有空位。
两个wait的顺序不能颠倒
生产者顺序颠倒:
生产者先锁住缓冲区,再等待空位。在等待空位时,如果此时缓冲区是满的,生产者将卡在等待空位步骤(wait(empty))。由于缓冲区是上锁了的,消费者无法访问缓冲区,消费者卡在了等待缓冲区的步骤(wait(mutex)。这样消费者取不出产品,生产者又在等待空位,就产生了死锁。
消费者顺序颠倒:
消费者先锁住缓冲区,再等待产品。在等待产品时,如果此时缓冲区是空的,生产者将卡在等待产品步骤(wait(full))。由于缓冲区是上锁了的,生产者无法放入产品,生产者卡在了等待缓冲区的步骤(wait(mutex))。这样生产者无法生产产品,消费者又在等待产品,就产生了死锁。
四种情况
单生产者单消费者
单生产者-单消费者模型中只有一个生产者和一个消费者,生产者不停地往产品库中放入产品,消费者则从产品库中取走产品,产品库容积有限制,只能容纳一定数目的产品,如果生产者生产产品的速度过快,则需要等待消费者取走产品之后,产品库不为空才能继续往产品库中放置新的产品,相反,如果消费者取走产品的速度过快,则可能面临产品库中没有产品可使用的情况,此时需要等待生产者放入一个产品后,消费者才能继续工作。
单生产者多消费者
与单生产者和单消费者模型不同的是,单生产者-多消费者模型中可以允许多个消费者同时从产品库中取走产品。所以除了保护产品库在多个读写线程下互斥之外,还需要维护消费者取走产品的计数器。
多生产者单消费者
与单生产者和单消费者模型不同的是,多生产者-单消费者模型中可以允许多个生产者同时向产品库中放入产品。所以除了保护产品库在多个读写线程下互斥之外,还需要维护生产者放入产品的计数器。
多生产者多消费者
该模型可以说是前面两种模型的综合,程序需要维护两个计数器,分别是生产者已生产产品的数目和消费者已取走产品的数目。另外也需要保护产品库在多个生产者和多个消费者互斥地访问。
3163

被折叠的 条评论
为什么被折叠?



