目录
目录
前言:本文中使用了很多别人的博客和网站的知识图用来组成整个我理解的体系。文章初衷为了个人知识总结,非商用。感谢博主和站主的分享。关于后面的内容想后面通过程序的形式自己尝试,所以还没写。
操作系统
操作系统解决三个事情:系统调用、异常、中断。(参考:https://blog.csdn.net/LK274857347/article/details/78461494)
处理三个事情
系统调用 、中断、异常
- 中断:由硬件信号引发的,分为可屏蔽和不可屏蔽中断
- 异常:由指令执行引发的,比如除零异常,80x86处理器发布了大约20种不同的异常,对于某些异常,CPU会在执行异常处理程序之前产生硬件出错码,并压入内核态堆栈
- 系统调用:异常的一种,用户态到内核态的唯一入口
系统调用
中断
硬件:中断响应
捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序。 保存现场又称为保存上下文
软件:中断处理程序
识别中断类型并完成相应的处理
中断表示长这样的(通过终端号找到需要执行的中断程序---硬盘中)
异常
硬件:异常响应
捕获中断源发出的异常请求,以一定方式响应,将处理器控制权交给特定的处理程序。
软件:异常处理程序
识别异常类型并完成相应的处理
执行的图和中断执行的图一致。只是中间用的是异常表
内存管理
参考:https://blog.csdn.net/hguisu/article/details/5713164
内存管理设计目标
抽象、保护、共享、虚拟化
内存分配
连续内存分配
下面是分区式存储管理:为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发,但难以进行内存分区的共享。操作系统应维护的数据结构为分区表或分区链表。表中各表项一般包括每个分区的起始地址、大小及状态(是否已分配)
内碎片是占用分区内未被利用的空间,
外碎片是占用分区之间难以利用的空闲分区(通常是小空闲分区)
动态分区(dynamic partitioning)三种主要的分配方式:
- FIRST FIT 按分区在内存的先后次序
- BEST FIT 按分区在内存的先后次序从头查找,找到其大小与要求相差最小的空闲分区进行分配。从个别来看,外碎片较小;但从整体来看,会形成较多外碎片优点是较大的空闲分区可以被保留。
- WOST FIT 按分区在内存的先后次序从头查找,找到最大的空闲分区进行分配。基本不留下小空闲分区,不易形成外碎片。但由于较大的空闲分区不被保留,当对内存需求较大的进程需要运行时,其要求不易被满足。
非连续内存分配
页式和段式存储管理
页式存储管理
注意:page大小 != 帧(物理页单元)大小
逻辑地址空间大小>物理逻辑地址空间
快表提现了一种间接访问的技术。我们在处理性能问题的时候用1、缓存技术。2.间接访问的技术
段式存储管理:
虚拟内存
目的:提高内存的利用率,让更多的程序能跑到一台机子上。
内存紧缩:将各个占用分区向内存一端移动,然后将各个空闲分区合并成为一个空闲分区。
这种技术在提供了某种程度上的灵活性的同时,也存在着一些弊端,例如:对占用分区进行内存数据搬移占用CPU时间;如果对占用分区中的程序进行“浮动”,则其重定位需要硬件支持。
覆盖和交换技术
覆盖 (overlay)技术的目标是在较小的可用内存中运行较大的程序。这种技术常用于多道程序系统之中,与分区式存储管理配合使用。
覆盖技术的原理:一个程序的几个代码段或数据段,按照时间先后来占用公共的内存空间。将程序必要部分(常用功能)的代码和数据常驻内存;可选部分(不常用功能)平时存放在外存(覆盖文件)中,在需要时才装入内存。不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖。
交换 (swapping)技术在多个程序并发执行时,可以将暂时不能执行的程序(进程)送到外存中,从而获得空闲内存空间来装入新程序(进程),或读人保存在外存中而处于就绪状态的程序。交换单位为整个进程的地址空间。交换技术常用于多道程序系统或小型分时系统中,因为这些系统大多采用分区存储管理方式。与分区式存储管理配合使用又称作“对换”或“滚进/滚出” (roll-in/roll-out)。
原理:暂停执行内存中的进程,将整个进程的地址空间保存到外存的交换区中(换出swap out),而将外存中由阻塞变为就绪的进程的地址空间读入到内存中,并将该进程送到就绪队列(换入swap in)。
进程管理
参考:https://www.cnblogs.com/mickole/p/3185889.html
生命周期
进程控制块(PCB):存在意义:解决进程无法自我控制销毁等。就像一个人如何揪着自己头发也无法离开地面。
pcb包括:进程描述信息:
- 进程标识符用于唯一的标识一个进程(pid,ppid)。一个独一无二的数字编号,pid称为“进程标识”(process identifier)。是一个正整数2到32768
进程控制信息:
- 进程当前状态
- 进程优先级
- 程序开始地址
- 各种计时信息
- 通信信息
资源信息:
- 占用内存大小及管理用数据结构指针
- 交换区相关信息
- I/O设备号、缓冲、设备相关的数结构
- 文件系统相关指针
现场保护信息(cpu进行进程切换时):
- 寄存器
- PC
- 程序状态字PSW
- 栈指针
进程调度
调度算法
参考:https://blog.csdn.net/wanghao109/article/details/13004507
指标:等待时间 周转时间 饥饿现象
容易出现饥饿现象现象
FCFS: 先来先服务,也可以称为先进先出
SPN:最短进程优先,下一次选择所需处理时间最短的进程
SRT:最短剩余时间优先,总是选择预期剩余时间最短的进程
HRRN:最高响应比优先,R=(w+s)/s,其中R表示响应比,w表示已经等待的时间,s表示期待服务的时间
更加公平的算法
轮转: 以一个周期性间隔产生时钟中断,此时当前正在运行的进程被置于就绪队列,基于FCFS选择下一个就绪进程 运行。时间片是实现轮询算法的方式。但是这个需要额外的进程中断、切换过程中的开销(保存上下文即现场)。
MLFQ多级队列反馈:进程第一次进入系统是放置于RQ0,第一次被强占并返回就绪态时,放入RQ1,以后每次被强占就下降一级。如果进程处于最低等级,则不再降级,反复返回到该队列,直到结束。
FFS:应用在多人计算机,用户级别的公开调度
实时调度介绍
实时调度算法:用在火车,机床等。(在规定时间内必须完成的调度)
RM:速度单调调度算法:优先级越高限制性-周期表决定优先级。
注意:美国火星探测器出现一个问题-不定时故障重启。原因:资源被低级别的进程获取不释放,然而高优先级的进程只能等待,但是它又级别较高。解决思路:通过对资源也进行定级。
EDF:deadLine越早先执行。deadLine指的是距离最后截止的时间点。
同步和互斥
同步互斥介绍
引起:操作系统的中端,进程调度散发导致的进程之间的切换
同步:散布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行。
互斥:散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。比如:两个进程不可以同时进行(例如读,写操作)。
临界区Critical Section:一段共享资源且当一个进程使用,另一个就不能使用
饥饿Starvation:
死锁Dead lock:
忙等busing-wating:
同步互斥的实现
目标:1、有限等待 2、无忙等 3、互斥。 4、前进原则progress (宿舍合租买面包)
实现方式:算法实现代码参考:https://blog.csdn.net/lililuni/article/details/83755732
- 禁用硬件中断 ---应用广泛:进入临界区后,禁用操作系统的中断,保证原子操作和进程不被切换。主要问题:多核cpu难实现
- 基于软件的解决方案:涉及代码方式,满足特特性
- 更高级的抽象 :
经典同步互斥问题
读者写者问题
信号量的应用
思路:
哲学家就餐问题
以叉子作为临界资源
思路:
死锁问题
特征:解决方法
- 互斥:导致结果不确定
- 持有并等待:导致资源利用率低,可能造成饥饿现象(要不持有全部,要不持有)
- 无抢占:解决方式只有kill掉
- 循环等待:通过对资源进行按序申请解决
处理方法
- 确保不会进入死锁
- 正常恢复
- 忽略死锁---windows unix
死锁特征处理和预防(银行家算法)
参考:https://blog.csdn.net/weiyongle1996/article/details/71511956
处理方法:一般是打破4个特征一种一个就可以了。
预防办法:对会造成死锁的情况进行预判断。
银行家算法:
资源分配图:
预防死锁
1、保持事务简短并在一个批处理中
在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。
2、使用低隔离级别
确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺(比如这次的S NK和X IK 是InnoDB引擎Repeatable Read级别才有的)。
---------------------
作者:zxcodestudy
来源:CSDN
原文:https://blog.csdn.net/qq_16681169/article/details/73359670
版权声明:本文为博主原创文章,转载请附上博文链接!
死锁的监测和恢复
进程之间的通信
参考:https://www.cnblogs.com/CheeseZH/p/5264465.html
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
直接通信方式:管道(包括无名管道和命名管道)、消息队列、信号量、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。
间接*********:共享存储。
管程Pipe(包括无名管道和命名管道)、特点:
理解:通过linux命令的 | 比如 % ls | more 分页显示ls的内容
-
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
-
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
-
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
FIFO,也称为命名管道,它是一种文件类型
消息队列Message--缓存的队列实现
是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
信号量(semaphore)
与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。通知接受进程有某种事件发生读者写者问题,比如只有2个进程进入临界区,并通知其他进程不能进去;有一个在临界区域的进程出去了,通知其他外面进程可以进去了。
共享内存(Shared Memory)
指两个或多个进程共享一个给定的存储区。
文件系统和文件
内容详解参考:https://blog.csdn.net/github_36487770/article/details/79445896
类别
文件分配
空闲空间列表
多磁盘管理