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
死锁的检测,银行家算法,一旦剩余资无法满足任何一个进程资源的需求就报出出现死锁
死锁的恢复
取消全部死锁的进程,将每一个死锁进程回滚到检查点,连续取消死锁进程,连续抢占资源,直到不再存在死锁
内存管理的四大基本需求,重定向,共享,保护,存储器扩充
虚拟内存
虚拟内存是对进程结构进行内存管理的一个中间数据结构

虚拟内存是一个由连续字节存储单元构成的数组,而虚拟地址空间是虚拟内存中每一个字节的虚拟地址集合