什么是操作系统
操作系统(Operation System)简称OS,是管理计算机【硬件】与【软件】资源的计算机程序
计算机系统的构成
用户、应用程序、操作系统、硬件(裸机)
操作系统(OS)的作用
- 管理与配置内存
- 决定系统资源供需的优先次序
- 控制输入设备与输出设备
- 操作网络与管理文件系统等基本事务
- 提供一个让用户与系统交互的操作界面
操作系统(OS)的目标与功能
目标
-
有效性
管理系统资源,提高系统资源利用率
,提高系统的吞吐量
-
方便性
方便用户使用
功能
- 处理机管理
1.进程控制
2.进程同步
3.进程通信
4.调度 - 存储器管理
1.内存分配
2.内存保护
3.地址映射
4.内存扩充 - I/O设备管理
1.缓冲管理
2.设备分配
3.设备处理 - 文件管理
1.文件存储空间的管理
2.目录管理
3.文件的读/写管理和保护
操作系统的特征
- 并发
- 共享
- 虚拟
- 异步
OS的并发性(Concurrent)
什么是并发?
同一时间间隔内执行和调度多个程序的能力(同一个时间段内执行多个任务的能力
)
宏观上,同时执行多个程序;微观上,多个程序之间高速切换(分别交替执行),主要关注的是单个处理机同一时间段内处理任务数量的能力
与并行的区别?
并行是多个CPU处理,并发是单个CPU的处理
用户空间和内核空间
-
用户态
多少应用程序
,可以写在的程序 -
内核态
由内核管理的系统 例如文件系统
,进程(线程)调度
进程
进程(Process),是一个具有独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度
的独立单位
进程的结构
控制块(PCB)
:进程的唯一标识
- 数据段
- 程序段
进程的特征
- 动态性:由创建而生,由撤销而亡
- 并发性:多个进程同时运行
- 独立性:独立资源分配
- 异步性:相互独立、互补干扰
进程与线程区别
进程:CPU分配
资源的最小单位
线程:CPU执行
资源的最小单位
线程相当于进程,降低了创建、撤销和切换可执行实体的成本和难度
什么是线程
Thread,进程的轻型实体,也叫“轻量级进程”,是一系列活动按事先设定好的顺序依次执行的过程,是一系列指令的集合
为什么进程中要有线程?
提高OS(操作系统)的并发性
线程的特性
独立调度和分派的基本单位;可并发执行;共享进程资源
进程的生命周期
创建(New)
就绪(Ready)
执行(Running)
阻塞(Blocked)
终止(Terminated)
进程控制
OS对进程实现有效的管理,包括创建新进程、撤销已有进程、阻塞和唤醒、进程切换等多种操作。OS通过原语(Primitive)
操作实现进程控制。
原语
由若干条指令组成,完成特定的功能,是一种原子操作(Action Operation)
原子操作,要么全做,要么全不做,执行过程不会被中断
在管态/系统态/内核态下执行,常驻内存
是内核三大支撑功能(中断处理/时钟管理/原语操作)之一
创建原语:create
阻塞原语:block
唤醒原语:wakeup
撤销原语:destroy
处理机调度(进程调度)
根据一定的算法和原则将处理机资源进行重新分配的过程
前提:作业/进程数远大于处理机(进程)数
目的:提高资源利用率,减少处理机空闲时间
调度程序:一方面要满足特定系统用户的需求(快速响应),另一方面要考虑系统整体效率(系统平均周转时间)和调度算法本身的开销
处理机(进程)调度过程
保存镜像:记录进程现场信息
调度算法:确保分配处理机的原则
进程切换:分配处理机给其他进程
处理机回收:从进程收回处理机
调度算法指标
CPU利用率 ↑ 忙碌时间/总时间
系统吞吐量 ↑ 完成作业数/总时间
周转时间 ↓ 作业完成时间-提交时间
带权周转时间:周转时间/实际运行时间
等待时间 ↓ 作业等待处理机调度时间 关注平均值
响应时间 ↓ 提交请求到首次响应间隔
(一个页面正常响应时间是3s,最多不超过7s)
常见的进程调度算法
作业调度算法
先来先服务(FCFS,First Come First Served)
短作业优先(SJF,Shortest Job First)
高响应比优先调度(HRRN,Highest Response Ratio Next)
优先级调度(PSA,Priority-Scheduling Algorithm)
进程调度算法
时间片轮转调度
(RR,Round-Robin)
多级反馈队列调度
(MFQ,Multileveled Feedback Queue)
先来先服务(FCFS,First Come First Served)
算法内容:调度作业/就绪队列中最先入队者,等待操作完成或阻塞
算法原则:按作业/进程到达顺序访问(执行)
调度方式:非抢占式调度
适用场景:作业/进程调度
优缺点:
有利于CPU繁忙型作业:充分利用CPU资源
不利于I/O繁忙型作业,操作耗时,其他饥饿
短作业优先(SJF,Shortest Job First)
算法内容:所需服务时间最短的作业/进程优先执行
算法原则:追求最少的平均(带权)周转时间
调度方式:SJF/SPF非抢占式
适用场景:作业/进程调度
优缺点:
平均等待/周转时间最少
长作业周转时间会增加或饥饿
估计时间不准确,不能保证紧迫任务及时处理
高响应比优先调度(HRRN,Highest Response Ratio Next)
算法内容:结合FCFS和SJF,综合考虑等待时间和服务时间计算响应比,高的优先调度
算法原则:综合考虑作业/进程的等待时间和服务时间
调度方式:非抢占式
适用场景:作业/进程调度
响应比计算:
响应比=(等待时间+服务时间)/服务时间>=1
只有当前进程放弃执行权(完成/阻塞)时,重新计算所有进程响应比
长作业等待越久响应比越高,更容易获得处理机
优先级调度(PSA,Priority-Scheduling Algorithm)
算法内容:优先权调度,按作业/进程的优先级(紧迫程度)进行调度
算法原则:优先级最高(最紧迫)的作业/进程先调度
调度方式:抢占/非抢占式(并不能及时获得执行)
适用场景:作业/进程调度
优先级设置原则:
静态/动态优先级
系统>用户;交互型>非交互型;I/O型>计算型
低优先级进程可能会产生“饥饿”
时间轮转调度(RR,Round-Robin)
算法内容:按进程
到达就绪队列的顺序,轮流分配一个时间片
去执行,时间用完则剥夺
算法原则:公平、轮流为每个进程服务,进程在一定时间内都能得到响应
调度方式:抢占式,由时钟中断
确定时间到
适用场景:进程调度
有缺点:
公平、响应快,适用于分时系统
时间片决定因素:系统响应时间、就绪队列进程数量、系统处理能力
时间片太大,相当于FCFS;太小,处理机频繁切换,开销增大
多级反馈队列调度(MFQ,Multileveled Feedback Queue)
算法内容:设置多个按优先级排序的就绪队列,优先级由高到低,时间片从小到大,新进程采用队列降级法
进入第一级队列,按fcfs分时间片
没执行完,移到第二级,第三级。。。
前面的队列不为空,不执行后续队列的进程
算法原则:集前几种算法优点,相当于PSA+RR
调度方式:抢占式
使用场景:进程调度
优缺点:
对各类型相对公平;快速响应;
终端型作业用户;短作业优先
批处理作业用户;周转时间短
长批处理作业用户:在前几个队列部分执行
进程之间的协作
进程通信
进程通信即进程间的信息交换
进程是资源分配的最基本单位,各进程内存空间彼此独立
一个进程不能随意访问其他进程的地址空间(无法访问其他进程)
方式
共享存储(Shared-Memory)
消息传递(Message-Passing)
管道通信(pipe)
进程通信:共享存储
基于共享数据结构的通信方式
基于共享存储区的通信方式
进程通信:消息传递(message-Passing)
直接通信:点到点发送
发送和接受时指明双方进程的ID(保存在请求报文或请求头中)
每个进程维护一个消息缓存队列
接受通信:广播信箱
以信箱为媒介,作为中间实体
发进程将消息发送到信箱,收进程从信箱读取
可以广播,容易建立双向通信链
进程通信:管道通信(pipe)
管道(channel)
用于连接读/写进程的共享文件
,pipe文件
管道的本质是内存中固定大小的缓冲区
半双工通信
同一时段只能单向通信,双工通信需要两个管道
以先进先出(FIFO)方式组织数据传输
通过系统调用read()/write()函数进行读写操作
读时不写,写时不读
,读写两个操作是互斥的
进程同步
协调进程间的相互制约关系,使其按照预期的方式执行
前提
进程是并发执行的,进程间存在着相互制约的关系
并发的进程对系统共享资源进行竞争
进程通信,过程中相互发送的信号称之为消息
或事件
两种互相制约形式
间接相互制约关系(互斥
):进程排他性地访问共享资源
直接相互制约关系(同步
):进程间的合作,比如管道通信
进程同步:互斥访问临界资源的过程
进入区:尝试进入临界区,成功则加锁(lock)
临界区:访问共享资源
退出区:解锁(unlock)
,唤醒其他阻塞
进程
剩余区:其他代码
访问原子
空闲让进:临界区空闲,允许一个进程进入
忙则等待:临界区已有进程,其他进程等待(阻塞状态)
有限等待:处于等待的进程,等待时间有限
让权等待:等待时应让出CPU执行权,防止“忙等待”
(进入临界区加锁,退出临界区解锁并唤醒其他阻塞进程)类似于WC坑位
互斥的访问临界资源软件实现方法
(正常生产环境使用的是信号量)
单标志法:违背“空闲让进”
双标志法先检查:违背“忙则等待”
双标志法后检查:违背“空闲让进、有限等待”
皮特森算法:违背“让权等待”,会发生“忙等”
互斥的访问临界资源硬件实现方法
中断屏蔽方法:关中断/开中断
禁止一切中断,CPU执行完临界区之前不会切换
关中断可能会被滥用
关中断时间长影响效率
不适合用于多处理机,无法防止其他处理机调度其他进程访问临界区
只适合内核进程(该指令运行在内核态)
Test-And-Set(TS指令/TSL指令)
读出标志并设置为true,返回旧值,原子操作
也被称之为TSL指令(Test-And-Set-Lock)
违背“让权等待”,会发生忙等
Swap指令( EXCHANGE,XCHG指令)
交换两个变量的值,原子操作
违背“让权等待”
信号量(Semaphore)
实现临界区进程同步的方法
类似于停车场、餐厅排队
PV操作
P操作:wait原语,进程等待
V操作:signal原语,唤醒等待进程
整型信号量:违背“让权等待”,会发生忙等
原语可以理解为原子操作的函数
记录型信号量:进程进入阻塞状态,不会忙等
管程
进程同步:管程(monitor,监视器)
“管理进程”,即用于实现进程同步的工具
。是由代表共享资源的数据结构
和一组过程(进行PV操作的函数)
组成的管理程序(封装)
管程是一种并发控制机制
,本身就是负责管理共享资源以及对共享资源进行操作
,并提供多线程环境下的互斥与同步
,以支持并发的安全访问
(synchronized基于管程)
管程的组成:
管程名称
局部管程内部的共享数据结构
对该数据结构操作的一组过程(函数)
管程内共享数据的初始化语句
基本特征
- 是一个模块化的基本程序单位,可以单独编译
- 是一种抽象数据类型,包含数据和操作
- 信息掩蔽,共享数据只能被管程捏的过程访问
条件变量/条件对象
进入管程的进程可能由于条件不满足而阻塞
此时进程应释放管程以便于其他进程调用管程
进程被阻塞的条件(原因)
进程被移入条件队列后,应释放管程
死锁
多个进程由于竞争资源而造成的阻塞现象
,若无外力作用,这些进程将无法继续推进。
产生原因:
系统资源的竞争
进程推进顺序有问题
死锁产生的必要条件
互斥条件:共享资源的排他性访问
不剥夺条件:访问时该共享资源不会被剥夺
请求并保持条件:保持当前资源时请求另一个资源
循环等待条件:存在共享资源的循环等待链
死锁的预防
破坏互斥条件:
将只能互斥访问的资源改为同时共享访问
将独占锁改成共享锁
不是所有资源都能改成共享的
破坏不剥夺/不可抢占条件:
请求新资源无法满足时必须释放已有资源
由OS协助强制剥夺某进程某进程持有的资源
实现复杂,代价高
此操作过多导致进程任务无法推进
破坏请求并保持条件:
进程开始运行时一次性申请所需资源
资源浪费
进程饥饿
阶段性请求和释放资源
破坏循环等待条件:
对所有资源现行排序,按序号请求资源
请求时先低再高
释放时先高再低
对资源的编号应相对稳定,限制了新设备增加
进程使用资源的顺序可能与系统编号顺序不同
限制了用户编程
内存管理
存储器的多层结构
寄存器
高速缓存
主存储器
硬盘缓存
固定磁盘
可移动存储介质
进程运行原理
用户程序 -->进程
编译
链接
装入
链接
静态链接
装入时动态链接
运行时动态链接
装入
绝对装入
可重定位装入
动态运行时装入
细节
逻辑地址与物理地址(地址重定位)
内存保护
内存扩充的两种方式
覆盖
交换
内存管理方式
连续分配管理方式
单一连续分配
优点:实现简单,无外部碎片,不一定需要内存保护
缺点:只能用于单用户、单任务OS,有内部碎片,存储器利用率低
固定分区分配
动态分区分配
内存管理方式
连续分配管理方式
非连续分配管理方式
文件
以计算机硬盘为载体的存储在计算机上的信息集合
属性:
描述文件状态的一组信息,比如名称、标识符、类型、大小、位置、保护、时间、日期和用户标识等
基本操作:
创建文件;读文件;写文件;文件重定位(寻址);删除文件;截断文件;打开与关闭
文件的结构
无结构文件(流式文件)
以字节(byte)为单位
没有具体结构
采用穷举方式搜索(穷举:从第一个字节到最后一个字节)
有结构文件(记录式文件)
顺序文件
索引文件
索引顺序文件
直接文件或散列文件(hash file)
文件的目录结构
文件控制块(FCB):
基本信息
存储控制信息
使用信息
索引节点
目录结构
目录本质上是多层次的一个树型结构,删除只是只是计数器减少,断开其连接
文件共享和保护
文件共享
硬链接(索引节点)
软链接(符号链)
区别:
硬链接使用索引节点
加计数器
实现的
软连接就是创建了一个新的link文件,就是常说的快捷方式
文件保护:
口令保护
加密保护
访问控制
文件系统的实现
文件系统层次结构:
用户调用接口
文件目录系统
存取控制验证模块
逻辑文件系统与文件信息缓冲区
物理文件系统
辅助分配模块
设备管理程序模块
目录实现
目录的本质是一个数据结构,FCB的集合,有结构的文件
线性列表
哈希表
输入输出管理(IO)
什么是管道
ps -aux| grep 8080
head -8 文件名 | tail -f 输出第8行的文件内容
“|” 这个就是管道