初识操作系统
Linux 源码
https://elixir.bootlin.com/linux/v6.0.6/source/Documentation
操作系统和计算机组成原理的基础讲解
https://www.cnblogs.com/cxuanBlog/p/12376364.html
操作系统的学习框架路线
https://www.cnblogs.com/cxuanBlog/p/13320810.html
操作系统发展史
串行处理、简单批处理系统、多道程序批处理系统、多到程序设计的实现、分时系统
操作系统体系结构
简单结构,层次化结构,微内核结构,模块结构,虚拟机
当今世界上最流行的操作系统时Windows
操作系统和苹果操作系统,因为具有良好的生态,UNIX
操作系统以网络为核心,安装在服务器上。Linux
原名GNULinux
免费且开源的多用户的安全的操作系统Redhat
,ubuntu
,Fedora
,Debian
等都是以Linux
改版完善来的。
操作系统就是为了屏蔽底层硬件,为用户提供一套统一,简单的可以通过对应的指令控制底层的硬件的软件。
一般使用的基于图形界面的操作系统叫做GUI
图形用户接口,而基于文本,命令行的就是shell
操作系统运行具有两种模式:用户态模式和内核态模式
底层硬件
CPU,多线程和多核芯片,内存,IO设备,总线
内存架构
处理器执行一条机器指令的过程可以称之为指令循环
指令循环是从取指令循环、解码阶段、执行阶段再次返回到取指令阶段
操作系统的异常
中断,IO设备发生改变,发出的信号触发,异步
,总是返回到下一条指令继续执行
陷阱,由程序主动发起的异常,同步
,总是返回下一条执行继续执行
故障,由正在执行的指令产生的各种错误引发,有可能是可恢复的,也可能是不可恢复的,同步
,可能返回当前指令重新执行,也可能终止当前程序
致命故障,硬件错误引发的不可恢复的错误,同步
,终止当前的程序
操作系统模式切换
操作系统分为用户模式
和内核模式
(特权模式)
比如windows
系统默认Ring0
是内核模式,Ring1
是用户模式
区分两种模式的原因就是保护系统资源,避免越权访问,提高系统安全性
进程
操作系统中最重要的就是进程
英文process
,进程是对正在运行中程序的一个抽象。CPU正在执行的一个任务,是系统进行资源分配和调度的基本单位
进程的执行就是CPU
会在各个进程之间进行来回切换。
进程的结构
进程 = 用户程序 + 用户数据 + 系统栈 + PCB + 共享区域
进程的创建
1、为新进程分配一个唯一的PID
2、给进程的各组成部分分配地址空间
3、初始化PCB
4、设置正确的连接
5、创建和扩展其他的数据结构
进程控制
1、获取进程ID
和父ID
2、创建和终止进程,一个进程创建一个子进程的系统调用是fork()
,其特点是调用一次,返回两次
,在父进程中返回子进程的ID
,在子进程中返回0
,终止系统调用的命令是exit()
,父子进程拥有不同的PID
,地址空间隔离,但是文件资源共享
3、装载运行程序,execve()
是调用一次从不返回
进程的切换
进程的切换是操作系统打断一个正在运行的进程,将处理区分配给另一个进程,让其拥有处理器资源并且开始继续执行的状态转换
当处理器执行程序的用户程序部分时,处于用户模式
处理器执行进程的内核程序或者访问内核资源的时候,处于内核模式
当用户程序调用内核提供的服务时,处理器发生用户模式
到内核模式
的切换
当内核服务完成,返回用户程序的时候,处理器发生内核模式
到用户模式的切换
进程的切换伴随着控制流的切换,内存的切换,操作系统模式的切换
进程上下文进行切换的好处
1、保护资源,避免越权访问,提高系统安全性
2、内核程序和用户程序封装在进程上下文中,只需要进行模式的切换,不需要进行进程的切换,减少了系统开销
3、内核程序在内核模式下运行,可以直接访问用户程序和数据,减少了用户程序和内核程序之间的数据传递,提高了进程执行效率
进程的退出
1、根据退出的ID号,在主进程表中找到对应的PCB
2、将退出释放的资源归还给父进程和操作系统
3、若该进程具有子进程,就先退出它的所有子进程,防止子进程脱离控制
4、将进程出队,释放PCB
进程控制块PCB
PCB = 进程标识信息(PID,PPID,UID) + 处理区状态信息(寄存器和栈指针) + 进程控制信息(资源调度,存储,通信)
进程的状态
新建,就绪,运行,阻塞,退出
七模型状态
当一个进程被交换到磁盘中时,就处于挂起的状态。组合之后就出现了四种可能的状态,就绪态,阻塞态,阻塞挂起,就绪挂起
异常分类
中断,陷阱,故障,致命故障
进程切换的时机:异常发生时候
过程调用和系统调用
1、过程调用是为了模块化程序设计的需要,系统调用是用户程序使用计算机资源和服务的一种方式
2、过程调用是通过指令跳转实现的,系统调用是通过异常陷阱实现的
3、过程的调用始终在一种模式下进行的,不会发生进程的切换和进程状态的切换,系统调用是会引起进程的切换和状态的切换
4、一个进程调用一个过程的时候,始终在用户模式下的,在用户进程调用一个系统调用的话,就会发生模式的切换以及在系统调用返回的时候,会再次进行模式的切换
进程的调度
调度目标
分为
面向用户的目标,具有周转时间,响应时间,最后期限,可预测性
面向系统的目标,具有并发度,吞吐率,CPU利用率,公平性,资源平衡
进程调度
长程调度,目标是并发度,决定一个进程是否被允许进入到计算机系统中进行处理,一旦进入,就将该进程添加到短程调度的队列
中等待调度
中程调度,和进程的内存管理相关
短程调度(分派程序),精确的决定下一次执行哪一个进程,执行频率最高
短程调度策略
类别 | 决策模式 | 响应时间 | 对进程的影响 |
---|---|---|---|
FCFS | 非抢占式 | 高 | 短进程和IO密集型不利 |
轮转 | 时间片用完抢占 | 短进程好 | 公平 |
SPN最短进程优先 | 非抢占 | 短进程好 | 长进程不利 |
SRT最短剩余时间 | 到达时抢占 | 好 | 长进程不利 |
HRRN最高响应比优先 | 非抢占 | 好 | 平衡 |
反馈 | 时间片用完抢占 | 不强调 | IO密集有利 |
周转时间T
= 等待时间w
+ 服务时间s
= 完成时间 - 到达时间
【带权周转时间】归一周转时间T/s
= 周转时间 T
/ 服务时间 s
线程
线程是环境和资源的抽象,是程序执行流的抽象,是操作系统能够进行运算调度的最小单位,包含在进程中,是进程中的实际运作单位
线程的结构 = 线程控制块 + 线程执行栈 + 线程局部存储
线程的实现方式分为两大类即是用户级线程
和内核级线程
使用范围
1.服务器中的文件管理或通信控制
2.前后台处理
3.异步处理
进程的并发和死锁
信号量Semaphore
和P
、V
操作
-
P(s)
操作,将信号量的是s.count--
,如果s.count < 0
,则操作系统就把系统调用P(s)
的进程置为阻塞态,将其加入到s.queue
中,如果s.count >= 0
,则P(s)
直接退出 -
V(s)
操作,s.count++
,如果s.count <= 0
,就在s.queue
中选择并移出一个进程,将他从阻塞态变为就绪态,并加入就绪队列中,然后退出。如果s.count > 0
,则V(s)
直接退出
死锁
DeadLock
是系统中多个进程并发执行时,由于资源占有和请求引起的一种进程永远被阻塞的状态的现象,就是进程之间持有自己的资源不愿放手,又要请求其他进程的资源满足自己的需要,造成的一种无解的,互相一直僵持的状态。
哲学家就餐问题就是一个典型的死锁问题,5 个哲学家,2把叉子,6个资源就会保证发生死锁
同类资源个数m
,n
个进程互斥使用,每个进程对于该类资源的最大需求量是k
,为了保证在任何调度情况下都不会发生死锁的条件 n * ( k - 1) + 1 <= m
资源分配图刻画进程和资源关系
死锁发生的条件,互斥 + 占有且等待 + 不可抢占 + 循环等待,这四个条件组合在一起,同时发生就会造成死锁
死锁的处理
-
死锁的预防,预分配,顺序分配方法
-
死锁的避免,银行家算法,每种资源的总量
Resource
,剩余每种资源的总量Available
,进程最大资源需求矩阵Claim
,资源分配矩阵Allocate
,每个进程还需要请求的资源矩阵Need = Claim - Allocate
-
死锁的检测,银行家算法,一旦剩余资无法满足任何一个进程资源的需求就报出出现死锁
死锁的恢复
取消全部死锁的进程,将每一个死锁进程回滚到检查点,连续取消死锁进程,连续抢占资源,直到不再存在死锁
内存
内存管理的四大基本需求,重定向,共享,保护,存储器扩充
虚拟内存
虚拟内存是对进程结构进行内存管理的一个中间数据结构
虚拟内存是一个由连续字节存储单元构成的数组
,而虚拟地址空间是虚拟内存中每一个字节的虚拟地址集合