目录
定义:
操作系统是对计算机资源(硬件、软件)管理、为用户提供服务(交互、运行环境)的软件、是种系统软件。
计算机用户与硬件之间一直运行的一个程序,狭义称为内核(kernel)程序
操作系统设计目标:用户目标:系统应该方便和容易使用、可靠、安全
开发目标:系统容易设计、实现、维护
策略:做什么 机制:怎么做
开发语言:早期:汇编 现在:高级(c、c++)java不行(要有虚拟机)
- 目标:方便用户解决问题、使用计算机,通过管理软件有效使用计算机硬件资源
计算机系统的结构:
- 层次结构 :用户—>应用程序- >操作系统->硬件
组织:
单个或多个中央处理器通过总线与内存和设备控制器相连
启动(Booting)
:先确认每个设备是否正常->开启引导程序Bootstrap(主板)、设备初始化、操作 系统载入内存、运行进程,(第一个进程init())中断
:一个事件的触发是由软中断、硬中断实现
软中断是执行中断指令产生的,而硬中断是由外设引发的。
硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
硬中断是可屏蔽的,软中断不可屏蔽。
有专门的文件标识符
系统一旦发生中断,CPU会运行中断服务程序,且每个中断都有自己的中断服务程序
系统通过中断向量表(Interrupt Vector Table)来管理中断请求与中断服务程序之间的关系
-
Ctrl+Alt+Delete快捷启动是什么中断?
标准输入:键盘
标准输出:显示器 -
I/O结构
:设备控制器有本地缓冲器,CPU负责内存与本地缓冲器之间的数据传递,设备控制器控制本地缓冲器和外设之间的。通过中断通知I/O设备操作完成
所以为了提高cpu利用率,采用DMA直接访问内存方式,以块为单位完成传送触发中断 -
I/O操作: 同步:只有I/O结束后,用户程序才能运行
异步:I/O期间,用户程序也能运行 -
存储结构
: 寄存器、存储设备(1.磁盘 2.闪存 3.固态硬盘)等
计算机系统的体系结构:
- 单处理器系统:只有1个通用处理器来处理用户进程的指令,其他专用处理器只接受系统指令。
- 多处理器系统:多个处理器共享一个内存,操作系统可以运行在一个或多个CPU上
每个处理器都有自己的寄存器 -》并行计算能力
- 集群系统:互相连接的计算机组成的并行分布式系统
操作系统的结构:
简单结构:MS-DOS THE进行了层次划分
(1) 批处理系统 :由人为方式调度程序运行
(2) 多道程序系统 :调度程序已经放在操作系统了(提高CPU使用率)
(3)分时系统,又称多任务系统
:给每个任务赋予一个时间片 (让每个任务公平使用CPU)
现在既是多道程序又是多任务系统
多道程序设计的基本特征:无序性、多道性、间断性
分时系统追求:快速响应用户 公平使用cpu
操作:双重模式
操作
操作系统有双重运行模式:用户模式、内核模式
- 用户态:执行用户程序
- 管态(核心态):操作系统执行 用模式位区分
出现中断或陷阱 硬件切换到管态
特权指令:有可能引发错误的指令,在管态正常使用,用户态时:使用系统调用,软中断进入管态
操作系统的服务:
提供用户接口、程序执行、I/O操作、文件系统操作、通信、出错检测(资源分配、账务、保护)
运行程序与操作系统传参:寄存器、内存的一张表、程序把参数 压入栈
命令行界面:CIL 有的在内核实现、有的通过系统程序实现、shell——获取并执行用户指令
图形用户界面:GUI
系统调用
程序通过API
(方便、兼容性)访问,而不是直接使用系统调用(也会调用)
三种常用API:1.Windows的Win32 API 2. POSIX(Unix、linux、mac os) 3. java虚拟机的java API
每个系统调用都有一个固定番号,操作系统通过一张系统调用番号表
来管理系统调用接口(其实是查地址,但地址动态)
运行程序与操作系统传参:寄存器
、内存的一张表、程序把参数 压入栈
(call by value 按值传递)、
块
(call by reference 快点、引用传递(传地址))
系统程序不属于内核,但属于操作系统的一部分
应用程序:提供服务给用户 系统程序:提供服务给其他软件
虚拟机
通过软件模拟的具有完整硬件功能的、运行在一个完全隔离环境的完整计算机系统
其他计算机系统:
分布式、其他专用:实时(带有时间节点)、嵌入式、多媒体、手持系统
其它计算环境:
C/S、点对点、基于web计算
操作系统的管理:
OS的基本特性是并发
和共享
进程(process)管理:
顺序执行的特征:顺序性、封闭性(独占系统的资源)、可再现性(初始条件相同、结果相同)
进程是运行着的程序,一个进程被载入内存,这个程序就变成进程
同一程序经过多次创建,运行在不同的数据集上,形成了不同的进程
操作系统会执行程序
、进程
、任务
或作业
(任务的1个实例)
程序与进程的概念区别
:程序是被动实体,而进程是活动实体,程序是永久的,都可一对多
一个进程
:代码段、栈(临时数据)、堆(动态数据)、数据段(全局变量)
- 进程控制块PCB:专门的数据结构,记录进程外部特征,描述进程的运动变化过程。包含许多与特定进程相关的信息
- 进程的特征:结构特征(进程实体=程序段+相关数据段+PCB)、动态性、并发性、独立性、异步性
task_struct
进程之间是树形结构
调度:
进程调度队列 :就绪(在内存就绪并等待运行)、I/O设备队列
1.长程调度(作业调度程序):从作业的缓冲池中选择进程,并装入就绪队列中等待执行(I/O调度) 慢点
2.短程调度(CPU调度):从准备执行队列中选择一个进程,并为之分配cpu 快点
3.中程调度:将进程从内存中取出,缓解内存紧张 分时系统
- 上下文切换:将CPU切换到另一个进程需要保存当前进程的状态,并恢复另一个进程状态
- 进程的属性:
1.拥有
资源`的独立单位(一直是) 分配时间片
进程创建:
进程之间是树形结构
OS根据PID来识别进程
级联终止:一个进程终止,它的所有子进程也将终止
僵尸进程:进程结束,但它的父进程没有等待它
进程间的通信模型(IPC)
1.消息传递:
receive、send :直接通信、间接通信(信箱)、同步和异步、缓冲(零容量、有限容量、无限容量)
用信箱实现进程间互通消息的通信机制要有两个通信原语:发送原语和接收原语
交换的消息都在缓冲中,零容量(阻塞)、有限容量、无限容量
2.共享内存:
共享内存区域:无线缓冲、有限缓冲
生产者-消费者问题
套接字:通信的端点,由IP地址和端口号组成
远程过程调用(RPC)::存根 传普通数据结构
远程方法调用(RMI):传对象
管道:文件 匿名管道(半双工的、数据单向)、命名管道(可靠的)
线程
cpu调度
的最小单位(拥有很少的资源)可独立调度和分派
的基本单位`
状态 :就绪、阻塞、执行 可并发执行
可与属于同一个进程的线程共享代码段、数据段、操作系统资源
创建线程:只需复制栈和寄存器的内容
用户线程:用户级线程库进行管理,不受内核管理,且内核不能感知。按进程分配时间
内核线程(真正的资源调度单位):由内核创建、切换由内核完成 按线程分配时间
线程模型:
多(用户线程)对一(内核线程)
一对一:希望内核线程少
多对多
两级模型(混合模型)允许用户线程绑定一个特定的内核线程
线程库:
为程序员提供的、创建和管理线程的API
线程的一些命令
线程取消
目标线程:线程完成任务之前终止线程的任务,需要取消的线程
取消方式:
异步取消:
延迟取消:
- 信号:用来通知进程某个特定事件的发生,是OS提供
内核
和进程
之间的通信机制
线程池
在进程开始时创建一定数量的进程,并放入到进程池中等待工作
- 调度程序激活:一种解决用户线程库和内核间通信的方法
CPU调度
非抢占式调度:一旦分配后,不会被其他进程使用
抢占式调度:会被其他进程使用
调度准则:
CPU使用率
吞吐量(一个时间单位里完成的进程数量)
等待时间(在就绪队列等待的时间)
响应时间(提交请求到第一次响应)
周转时间(从进程提交到进程完成)
上下文切换时间
调度算法
选择下一个CPU区间(剩余CPU区间),而不是进程整个区间长度,分为非抢占调度
和抢占调度
1.先到先得 FCFS:非抢占 最简单的调度 有利于长作业、CPU作业 可用于作业、进程调度 根据到达次序
- 护航效果:所有其他小进程都等待一个大进程
2.最短作业优先 SJF(最优的,给出最短的平均等待时间):关联到每个进程下次运行的CPU脉冲长度,调度最短的进程
分非抢占
、抢占
(最短剩余时间优先调度) 可能会出现饥饿现象(长的一直等下去)
3.优先级算法 PS:非抢占
、 抢占
用数字表示优先级,数值越小、优先级越高
一个进程的优先级与它的下一个CPU区间的长度成反比
静态优先权在创建就确立,且在整个生命期保持不变 可能会出现饥饿
、无限阻塞
解决办法:老化,随着等待时间的长度,增加进程的优先级
所以使用动态优先级:进程的的等待时间、已使用处理机的时间、资源使用情况
4.时间片轮转 RR:分时系统中:为了使多个终端能够得到系统及时响应
可抢占
系统每隔一个时间片发出一个时钟中断,调度另一个进程执行
周转时间依赖于时间片的大小
根据经验:时间片 应大于80%的CPU区间
5.多级队列调度 MQS:将就绪队列分为多个独立的队列
队列内:自己的调度算法
队列间:固定优先级抢占调度、队列间给定时间片调度
6.多级反馈队列调度
进程可以在多个队列之间有移动,老化
线程调度
Linux只支持系统范围的线程调度
实时调度:硬实时系统(硬截止时间)、软实时系统
进程同步
- 竞争:对共享数据的并发访问可能会导致数据的不一致性(进程顺序乱了,且结果不能预测)
- 互斥:指多个进程不能同时使用同一个资源
- 同步:进程之间的协作
临界区:
- 实现: 互斥、前进(有空让进)、有限等待
定义: 多个进程必须互斥的访问,进程中访问临界资源的一段代码
执行时间互斥
Peterson”s算法:
前提条件是加载
和存储
指令是原子指令,即加载和存储指令是不可被中断的指令。
不能没有turn,否则都进入不了临界区
硬件同步
现代计算机系统提供特殊指令叫原子指令( atomic instructions),运行时不会发生中断
- TestAndSet ( ) :检查和设置字的内容(返回原来的值,将传入的值变成true)
- swap( ) :交换两个字的内容 不可中断的指令
全局变量 lock 初始为false,相当于锁
局部变量 key 初始为true 每个进程一个 相当于为钥匙
在swap算法下,若key或lock为false,则可进去临界区
Peterson’s (软件实现),testandset,swap(硬件实现)都会出现忙等待
所以声明waiting【i】表示等待进入临界区的进程,初始为false
可以进入临界区:lock或waiting[i]为false
信号量
无忙等待的同步工具
1.二进制信号量,又称互斥锁
若想控制进程先后,定义一个前序变量,且初值为0,完成后才+1,执行下一个进程。
无忙等待的信号量
解决忙等待:将忙等待的进程挂起(运行状态—等待状态),可以进入临界区时,让进程重新启动(等待状态—就绪状态)
经典同步问题
有限缓冲问题
读者和写者问题
哲学家进餐问题
管程
条件变量:某一资源类型的信号量
死锁:
- 死锁:指
多个进程
互不相让,都得不到足够的资源(涉及多个资源
)
原因:竞争资源、进程推进顺序不当
出现条件:互斥(1个资源只能1个进程占用)、占有并等待、不可抢占、循环等待(P0等待的资源被P1占用,P1等待的资源被P2占用……)。
通过资源分配图描述:点: 进程、资源 边:请求边、分配边
处理死锁方法:
-
忽略死锁
-
预防死锁(限制资源请求、确保至少一个必要条件不成立)
通常不通过否定互斥条件来预防死锁
-
避免(安全状态:使每个进程都可顺序执行 ,确保系统不进去不安全状态
若单个实例,采用资源分配图 引入需求边看是否会出现环路;
当进程申请资源时,需求边变成申请边对资源的申请,把申请边变成分配边后,如果没有环就允许申请,如有环就不允许申请
若含有多个实例,银行家算法,安全算法)
银行家算法:
按循环选择下一个
1.安全性算法:确定系统是否处于安全状态
2.资源请求算法:判断是否可安全允许请求的算法
- 检测(也分只有一个实例:维护等待图(进程是节点)
若等待图中有环,则系统存在死锁;
多个实例:检测算法) - 恢复(人处理、资源抢占、进程终止、把不能正常运行的回滚到安全状态)
内存管理
重定位
:把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程
提高内存使用率、管理数据的存储、指令的运行
内存地址编制方法
一个进程使用的内存地址范围:由一对基地址寄存器和界限地址寄存器来定义
地址绑定是逻辑地址到物理地址的映射
逻辑地址:CPU产生,(虚拟空间)
物理地址:内存设备所读入的地址 可以直接寻址
内存管理单元:MMU
编译、加载时绑定 进行交换必须回到原位;执行时绑定,运行时可以发生地址变化
地址重定位:
静态:把指令地址全部转换为绝对地址,执行中无需再进行地址转换;
动态:在CPU访问内存前,动态依靠硬件地址变换机构
逻辑地址:CPU生成的地址
物理地址:内单元的地址
- 静态链接:加载程序合并到二进制程序镜像中,一直驻留在内存
- 动态链接,
链接
延迟到运行时,适用于系统库,由操作系统
管理,存根
:定位适当的内存驻留库程序 - 动态加载:直到被调用之前,程序不会被载入到内存,即加载延迟到运行时,由
程序员
决定
内存分配方式
分配内存空间:
单一连续区管理: 基址寄存器
多分区管理:可用于多道程序;固定(静态)分区:作业装入前,就被划分为若干个固定大小的连续分区,运行期间个数,大小不变
动态分配: 系统里有一张分区说明表,来记录已分配孔和未分配孔的信息
拼接(紧缩):解决碎片,只适用于动态重定位
不连续分配:
分页:把物理内存分成大小固定的块,称为帧
把逻辑内存也分成固定大小的块,叫做页。以页为单位分配内存,设置页表
没有内碎片
(有外碎片:紧缩:I/O不可以)
页表的实现:
1.用一组专用寄存器保存 页表基寄存器(PTBR)
2.可以放在主存中:页号,偏移 ;页表基址寄存器指向页表,页表限长寄存器表明页表的长度
通过联想寄存器(并行查找),对内存两次存取,一次是存取页表,一次是存取数据
解决办法:硬件缓冲,称为 地址转换旁观缓冲
(TLB),键-值
哈希表【虚拟页码,映射的帧号、指向链表下一个元素的指针】
反向页表:减少页表消耗的内存空间,整个系统只有一个页表 【进程标识符,页码,页偏移】
分段:以用户视角去管理内存
一般组成:主程序、函数、方法、对象、堆、栈、局部变量、全局变量等
逻辑地址:【分段号,偏移】
虚拟内存
基础:程序的局部性理论
允许执行进程时不必完全载入内存,可以部分程序载入到内存
虚拟内存也允许共享,实现进程之间内存共享
页错误:
页置换算法
4.近似LRU的实现:附加引用位算法、二次机会算法、增强型二次机会算法
物理帧的分配:平均分配方式:分配帧大小相同;比列分配:进程大小比例;优先级分配:进程优先级
- 系统颠簸:进程没有分配足够的帧而频繁的页调度
内存映射文件:采用虚拟内存将文件I/O当成普通内存访问
内核内存空间的分配:需要连续分配:buddy分配(按2的幂的大小来分配);slab分配(slab 是由一个或多个物理上连续的页,cache 含有一个或多个 slab)
存储管理:文件系统管理
操作系统对存储设备的物理属性进行了抽象的定义,即文件, 它是存储的逻辑单元。
大容量存储系统、一般是二级存储设备。
高速缓存,临时存储设备、置在高速与低速设备之间
在多任务环境下、多处理器环境下,分布式环境下必须要保
证数据的一致性,用硬件解决
I/O子系统
针对用户隐藏具体硬件设备的特性
- 一个包括
缓冲
(buffer)、高速缓存
(cache)和假脱机
(spooling)的内存管理部分- 通用设备驱动器接口
- 特定硬件设备的驱动程序
在Linux、unix上,通过文件管理接口实现
1.缓冲(Buffering):为传输数据暂时存储数据 ,自己用完就清空不用置换
2. 缓存(Caching):为性能提高暂时存储数据
3. 假脱机(Spooling):是关于低速字符设备与计算机主机交换信息的一种技 术,通过实现虚拟设备可以共享设备
I/O保护 :
所有I/O指令都是特权指令
内存保护:保护中断向量、中断服务程序, 基址、界限寄存器
在中断发生后,进入中断处理的程序属于操作系统程序
CPU保护:防止用户陷入死循环 使用timer定时器产生中断,控制权返回OS