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