操作系统
1概念
操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理的组织调度计算机工作和资源分配,以便给用户和其他软件方面的接口和环境,是计算机系统中最基本的系统软件。
2.操作系统的功能
1资源的管理
1处理器管理 2存储管理 3设备管理 4文件管理
2向用户提供服务
a命令接口
联机命令接口:一个命令输入,一个命令输出
脱机命令接口:将命令写在文件中,批量执行
b程序接口:由系统调用组成
3操作系统的特征
1并发性
2共享性
3虚拟性
4随机性
4操作系统的发展历史
5操作系统的两种指令,两种处理器状态,两种程序
根据对程序删除文件的例子,引出了特权指令和非特权指令。使用这两种指令时需要处于不同的状态,其中只有核心态才可以使用特权指令,用户态只能使用非特权指令。而需要使用特权指令的程序称为内核程序,需要使用非特权指令的程序称为应用程序
什么样的是内核程序和应用程序呢?
首先要知道什么是内核,内核是指计算机上配置的底层软件,操作系统中最核心,最基本的部分,实现操作系统内核功能的程序就是内核程序。
内核又分为大内核和微内核,上面图,大方框的叫做微内核,如果包含了所有的就叫做大内核。
6中断和异常
中断机制的诞生:早期的计算机,各个程序只能串行的执行,系统的资源利用率非常的低,因此引入了操作系统,作为计算机的管理者,引入了中断机制,实现了多道程序并发执行。
当一个用户程序在执行时,cpu进入了用户态,执行完成一个时间片之后,cup收到了计时部件发出的中断信号,将用户态切换成了核心态,将有操作系统内核来对中断信号进行中断处理,比如切换到另一个线程或者进程上,然后直需要执行一个特权指令,将psw程序状态字标志位设置成用户态,就可以进入用户态。
7中断的分类
总结
系统调用
系统调用的概念和作用
即,系统调用是操作系统给应用程序使用的接口,可以理解为是一种可以供应用程序调用的特殊接口,应用程序可以发出系统调用请求来获得操作系统的服务。
系统调用和库函数的区别
对于库函数中的简单的方法,如取绝对值,等操作,可以由用户态进行完成即可不会使用到系统调用,但是对于一些文件的操作,如创建文件等,需要切换到核心态,需要系统调用由操作系统完成。
系统调用的背后过程
注意:系统调用发生在用户态,由陷入指令产生内中断,将用户态切换成核心态,然后经过操作系统进行处理
进程和线程
进程的基本概念
进程是操纵系统中最基本,最重要的概念,由于并发技术的出现,程序这个静态概念已经不能反映出并发程序执行过程中出现的特征,为此引入进程来描述程序动态执行的过程。
基本特征:
1动态性:指进程也有自己的生命过程,有生命周期
2并发性:多个进程能够存于同一个内存中,在一定时间内都可以执行
3调度性,进程是系统中申请资源和调度的单位
进程的状态和互相转换过程
进程控制
进程之间的通信
线程
什么是线程,为什么会引入线程
线程的实现方式
多线程模型
多对一线程模型
一对一线程模型
多对多线程模型
小节回顾
处理机(CPU)调度
处理机的分级
进程调度的时机
进程调度的方式
抢占式和非抢占式
进程切换的过程
调度的参数
调度算法
先来先服务(fcfs)
短作业优先算法sjf,分为抢占式和非抢占式
非抢占式sjf短作业优先算法
抢占式srjf最短剩余时间优先算法
高响应比hrrn
时间片轮转法
优先级调度算法
非抢占式
抢占式
多级反馈队列调度算法
进程同步和进程互斥
进程互斥的细节
进程互斥软件实现方法
进程互斥硬件实现方法
信号量机制实现进程互斥
第一种整型信号量
第二种,记录型信号量
记录型信号量的过程细节
使用信号量机制实现进程同步前V后P操作。
进程同步的生产者消费者问题
多个消费者和生产者模式
死锁问题
1概念:多个进程或者线程在争抢资源时,互相有对方所需要的资源,而又不能立即释放,导致各个线程或者进程都阻塞,无法向前推进的现象。
2死锁、饥饿、死循环的区别
死锁产生的四个条件
1互斥条件:每一个资源只能分配给单个进程去访问,进程一旦获取资源,就不允许其他资源去使用。
2不可抢占条件:任何一个进程不能去从另一个进程去抢占资源,只能让资源拥有者主动释放资源。
3循环等待条件:
所以进程循环的等待资源,会产生死锁
4请求和保持条件(占有且等待):进程不是一次性的申请所有的资源,而是得到一部分的资源之后,还允许继续申请新的资源。
死锁的处理策略之预防死锁:
破坏互斥条件
把互斥使用的资源改造成允许共享使用的资源,系统就不会进入死锁状态,缺点是并不是所有的资源都可以改造成可以共享使用的资源。
破坏不可抢占条件(就是已经占用的资源只能由占用进程的资源自己进行释放)
方案1:当某一个进程请求新的资源不满足时,它必须立即释放保持的所有资源满意后需要时在申请。也就是说当申请不到自己想要的资源时,及时释放自己的资源
方案2当进程需要的资源被其他的进程所占用时,可以由操作系统协助,将需要的资源进行强行剥夺。(可以结合进程的优先级进行资源的调度)
破坏请求保持条件:当进程申请新的资源请求发生阻塞时,自己手里的资源也不会释放
可以采用静态分配方法,即进程在运行之前,一次申请完它所需要的全部资源,在它的资源未满足之前,不让他投入运行,一旦运行成功,这些资源就一直归它所有,该进程就不会在请求其他的资源了
该策略实现简单,但是该策略可能会导致某些进程发生饥饿。并且有些资源可能只需要很短的时间,却一直在运行过程中一直保持着资源,会造成严重的浪费。资源利用率低。
破坏循环等待条件(存在进程资源的循环等待链,进程中每一个进程已经获取的资源同时又被下一个进程所请求)
可以采用顺序资源分配法,首先给系统中每一个资源进行编号,规定每一个进程必须按照编号递增的顺序请求资源,编号相同的资源必须一次申请完。一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源,大编号的资源不可以逆向的回来获取申请小编号资源,因此不会产生循环等待的现象
死锁的处理策略之避免死锁银行家算法
银行家算法:在每一次分配资源之前,将用户需要的资源和系统还剩余的资源进行比较,只有所有线程都满足条件之后,就认为该状态是安全的,才进行资源的分配,否则就会进入不安全状态,就一直阻塞等待,不进行资源的分配。
用可用的剩余资源数和最多还需要的资源数进行对比
算法流程
总结银行家算法:可以看出银行家算法可以很好的避免死锁的发生,但是缺少实用价值,因为很少有进程能够在运行之前就知道自己所需要的资源最大值,而且进程数也不是固定的,因此现实中有很少系统使用银行家算法。
死锁的处理策略之死锁的监测和解除
上面的几种介绍是为了避免发生死锁,但是如果系统中发生了死锁,应该有检测死锁的算法和死锁解除的算法
如何实现死锁的检测:
必须有两个条件:
1用某种数据结构来保存资源的请求和分配信息
2提供一种算法来对上述信息来检测系统是否进入死锁状态。
使用资源分配图来对资源和进程的关系来进行表示,如果资源分配图出现环路,完全不可以简化,就代表出现了死锁。
注:绿色表示资源已经分配给其他的进程,蓝色表示所需要的资源
实现死锁的解除:
内存管理
内存地址和存储单元
一个内存地址对应了一个存储单元,而存储单元的大小由按字节编址和按字编址进行判断。
进程运行的基本原理
进程由PCB、数据和程序三个部分组成
逻辑地址和物理地址
逻辑地址就是相对地址,源程序经过编译之后会形成目标代码程序,其使用的具有逻辑关系的地址就称为逻辑地址。
物理地址就是绝对地址,cpu可以通过物理地址直接找到其中存放的程序或数据,进而完成各种指令的执行和数据的访问。
从写程序到运行的步骤:
链接的三种方式:
a 静态链接:在程序运行之前将各个模块和库函数链接成一个完整的可执行文件(装入模块),之后将不在拆开。
b装入时动态链接:将各个目标模块装入内存时,边装入内存边链接。
c运行时动态链接:在程序执行中需要该目标程序时,才对它进行链接,优点是便于修改和更新
怎么实现逻辑地址到物理地址的转换?(这一过程也成为重定位)
三种方法:
- 绝对装入
在编译时,程序就已经知道要放在内存中的哪个位置,那么编译程序会产生绝对地址的目标代码,装入程序会按照装入模块中的地址,将程序和数据装入内存中,就可以直接找到内存地址,一般绝对装入只适用于单道程序环境
- (静态重定位)可重定位装入
编译链接之后的装入模块地址都是从0开始的,指令中使用的地址,数据存放地址都是相对于起始地址的逻辑地址,根据内存的当时情况,将装入模块装入到内存的合适地址,装入时对地址进行重定位,将逻辑地址变成物理地址。特点是一个作业在装入内存时,必须要有满足要求的全部的连续的内存空间,如果没有满足就不装入作业,作业一旦进入内存,就期间就不能够在移动,也不能申请内存空间
- 动态重定位装入
程序编译链接之后的装入模块的地址都是从零开始的,装入程序把装入模块装入内存之后,并不会立即把逻辑地址转换成物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入到内存之后所有的地址依然是逻辑地址,这种方式需要一个重定位寄存器的支持。采用动态重定位时允许程序在内存中发生移动。并且可以将程序分配到不连续的空间中,在程序运行之前只需要装入他的部分代码就可以运行,根据需要动态申请分配内存,便于程序段的共享,可以向用户提供一个比存储空间大的多的内存地址
内存管理
总起:内存管理的四个功能为:
1地址转换(即逻辑地址到物理地址的转换【装入的概念】)
2存储保护
保证进程在自己的内存空间中运行不会越界访问,有两种方式:设置上下限寄存器和利用重定位寄存器和界地址寄存器进行判断
设置上下限寄存器
重定位寄存器和界地址寄存器
3内存的扩充
覆盖技术:来解决程序大小超过物理内存总和的问题
交换技术
:核心思想是内存紧张时,系统内存中某些进程暂时换出外存,把外存中某些已经具备条件的进程换入内存(类似于处理机调度的中级调度即内存调度)
交换技术需要涉及到三个问题:
1应该在外存中的什么位置保存被换出的进程?
2应该在什么时刻进行进程的交换呢?
3应该换出哪些进程
覆盖技术和交换技术的区别
覆盖技术是针对于同一个进程而言,而交换技术是多个进程之间的调度
4内存空间的分配与回收
单一连续分配
固定分区分配
因此为了记录不同区的大小和使用情况,需要建立一个数据结构来记录
动态分区分配
1
2动态分配分区算法
首次适应算法:每一次都从低地址开始查找,找到第一个能满足大小的空闲分区,每一次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区。
最佳适应算法:将所有的空闲分区按照容量的递增顺序链接,每一次分配内存时顺序查找空闲分区链,找到第一个满足要求的空闲分区,可以保证即使没有占满空闲分区,每一次剩余的空闲也会是最小的。(所以会留下很多小碎片)
最坏适应算法又称为最大适应算法:为了解决最佳适应算法中留下太多的难以利用的小碎片问题,每一次都找最大的分配,这样分配之后的剩余分区就不会太小,更方便使用,只需要把空闲分区按照容量递减的顺序链接,每一次分配内存时顺序查找空闲分区链(或者空闲分区表)找到大小满足要求的第一个空闲分区
邻近适应算法:是在首次适应算法之上的改进,在首次适应算法中每一次都是从链头开始查找,所以会导致地址部分出现很多的空闲分区,并且每一次查找时经过这些分区也会增加查找的开销,所以引入临近适应算法,每一次查找时都是从上一次查找结束的位置开始查找空闲分区链(表),找到满足要求的第一个空闲分区。
3如何进行分配和回收的操作
内存碎片和外存碎片
外村碎片太多可能会不能产生连续的内存,引入紧凑技术可以解决外部碎片
分页存储管理
在固定分区时,因为分区太大会导致内存碎片或者外存碎片垃圾太多,因此引入分页存储管理。
- 现在将内存空间同样进行分区,将区域分成大小相等的更小的分区,每一个分区叫做页框,或者页帧,每一个页框都有一个编号,即页框号或页帧号。
- 将用户进程的地址空间也分为和页框大小相等的一个个区域,称为页,每一个页也有编号,叫做页号,也是从0开始的。
- 操作系统以页框为单位为各个进程分配内存空间,进程的每一个页面分别放入一个页框中,即页面和 页框具有一一对应的关系。但是不需要在按照编号进行对应,可以分散对应。故难点在于如何实现逻辑地址到物理地址的转换。
- 在动态重定位中,采用了重定位寄存器,来解决逻辑地址到物理地址的转换,
因此为了计算出物理地址,还需要知道在内存中的起始地址,所以需要找到页面对应的页框号。所以操作系统为每一个进程建立一张页表,专门记录每一个进程的页号对应的内存中的页框号。
注意每一个页表项的长度是相同的,页号是可以隐含的,不需要单独指明页号,可以根据块号,然后按照一定的算法算出来的。
总结流程:
例子:
TLB引入快表提高逻辑地址到物理地址的转换过程
两级页表
为什么要引入两级页表呢?因为只采用一个页表所占的连续内存比较大
因此引入:
分段存储管理
分页和分段的区别在于,分页中每一个页面长度大小是相同的,而分段时,每一个段的大小是不同的
虚拟内存
传统存储管理的优缺点;
局部性原理:包括时间局部性和空间局部性
虚拟内存的三个特点:
1多次性:是指并不是一次性的把所有的作业都加载到内存中,而是允许被分成多次调入内存
2交换性:作业无需常驻内存中,而是允许在作业运行中把作业换入换出
3虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量实际上远大于实际的容量
页面值换算法
1opt最佳值换算法
最佳值换算法思想是:向后看,看以后哪个页最少被使用,选择最长时间不需要的页换出去,不能实现,因为未来情况无法预知
2lru算法
先进先出算法思想是:向前看,把前面使用过的页进行排序,最后选择最久没有使用的换出内存
3fifo值换算法
先进先出算法,使用链表,每加入一个就将加入的页放到链的尾部,先淘汰掉驻留在主存中时间最长的页(也就是从链的头部开始淘汰然后将新加入的页放在链表的尾部),哪一个页最先装入贮存中,哪个页就先被换出去,缺点是虽然是在主存中时间最长,但是可能是频繁使用的,因此很少纯粹的使用此算法。
改进的先进先出算法:加上两个标志位,如果页被修改(读或者写)就将标志位置为1,然后党遍历到链头部时,如果标为位为0,则说明没有被使用过,可以直接将头部删除,将新的页加到尾部,但是如果遍历到头部的标志位为1,则将头部的元素加到链尾,改变装入的时间。
4时钟值换算法
改进的fifo算法虽然好,但是要经常在链表中移动页,这降低了系统效率,因此引入时钟值换算法,引入环形链表,将指针指向最老的页,当发生缺页中断时,首先检查指针指向的页,如果标志位R位为0则直接淘汰该页,并且将新的页加入到该页,然后将指针向前移动一位。然后如果R为是1,则清除1变成0,接着向下移动,直到找到0,将页面删除后,把新的页面加到此位置,再将指针向下移动一位。
5改进的时钟置换算法