博主最近在搞自动化测试。。。太南了。。OS可能没空更新了
操作系统:是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,是计算机中最基本的系统软件
1、操作系统的功能:
2、操作系统的特征:共享
共享即资源共享,系统中的资源可供内存中多个并发执行的进程共同调用
3、虚拟:把一个物理上的实体变为若干个逻辑上的对应物,物理实体是实际存在的,而逻辑上对应物是用户感受到的------虚拟存储器技术
1、有时候程序同时运行需要的内存远大于4GB,为啥他们还可以在4GB内存的电脑上同时运行?yes,这就是虚拟存储技术,实际只有4GB内存,用户看来却远大于4GB
2、某单核cpu的计算机中,用户同时打开了好些软件。。为什么单核的能同时运行这么多?-----虚拟处理器技术,实际上只有一个cpu,微观上处理机在各个微小的时间段内交替为各个进程服务,让用户看起来有多个cpu在为自己服务(时分复用技术)
4、异步
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一罐彻底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性(有并发性才可能导致异步)
没有共享和并发(2个最基本特征),就谈不上虚拟和异步
5、分时操作系统
计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。解决了人机交互问题。 允许多个用户同时使用一台计算机
1、两种指令
2、两种处理器状态
3、两种程序
4、计算机系统的层次结构图
内核是操作系统最基本最核心的部分,是计算机上配置的底层软件。实现操作系统内核功能的那些程序就是内核程序。
(1)中断的概念、作用
发生中断就意味着需要操作系统介入,开展管理工作。cpu收到计时部件发出的中断信号,从用户态切换为核心态,对中断进行处理
Q:用户态、核心态之间的转换是怎么实现的?
A:用户态------>核心态 是通过中断 实现的,并且中断是唯一途径
核心态------>用户态 是通过执行一个特权指令,将程序状态字PSW标志位设置为“用户态”
(2)中断的分类
用户接口分为命令接口(允许用户直接使用)和程序接口(允许用户通过程序间接使用)。程序接口就是由一组系统调用组成。
1、系统调用的作用
应用程序通过系统调用请求OS的服务。系统中各种共享资源都由操作系统统一掌管,因此在用户程序中,凡事与资源有关的操作(如存储分配,I/O操作,文件管理等),都必须通过系统调用的方式向操作系统提出服务请求,由OS代为完成,这样可以保证系统稳定性和安全性。
2、系统调用的过程
传递系统调用参数---->执行陷入指令(用户态)---->执行系统调用相应服务程序(核心态)---->返回用户程序
注意:系统调用发生在用户态,对系统调用的处理发生在核心态
1、进程实体:PCB(进程控制块,用来描述进程的各种信息)、程序段(存放要执行的代码)、数据段(存放程序运行过程中处理的各种数据)三部分构成。一般情况下,把进程实体就简称为进程。所谓创建/销毁进程,实质上就是创建/销毁进程实体中的PCB。PCB是进程存在的唯一标志
2、严格来说,进程(动态)是进程实体(静态)的运行过程,是具有独立功能的程序在数据集合上运行的过程,系统进行资源分配和调度的一个独立单位。
3、进程的组织------链接方式
5、进程的状态与转换
另外两种状态:
6、进程控制
进程控制,可以简单理解为,就是实现各个进程状态的转换
原语:用原语实现进程控制。原语的特点是不允许中断,只能一气呵成,采用“开中断指令”和“关中断指令”实现,即原子操作。
无论哪个原语,要做的无非三件事情:更新PCB中的信息,将PCB插入合适的队列,分配/回收资源
7、进程通信
进程通信就是进程之间的信息交换。因为进程是分配系统资源的单位,因此各进程拥有相互独立的内存地址空间。为了保证安全,一个进程不能直接访问另一个进程的地址空间。
(1)共享内存
共享内存分为:
(2)管道通信
进程1-----写数据----->管道----读数据----->进程2
(3)消息传递
进程间的数据以格式化的消息为单位,进程通过OS提供的“发送消息/接收消息”两个原语进行数据交换。
1、有的进程可能需要同时做很多事,而传统的进程只能串行执行一系列程序,为此引入了线程,来提高并发度。可以把线程理解为轻量级进程
(1)线程是一个基本的CPU执行单元,也是程序执行流的最小单位
(2)引入线程之后,不仅进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提高系统的并发度,使得一个进程内也可以并发处理各种任务
(3)引入线程后,进程只作为资源分配的基本单位,而线程是调度的基本单位
(4)进程间并发需要切换进程的运行环境,系统开销大;线程间并发,如果在同一个进程内,则不需要切换进程,系统开销小
2、线程的一些属性:
3、线程的实现方式
(1)用户级线程
(2)内核级线程
操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理,这就需要确定某种规则来决定处理这些任务的顺序,这就是调度研究的问题。
1、调度的三个层次
(1)高级调度(作业调度)
高级调度按一定的原则从外存上处于后备队列的作业中挑选一个或多个作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使他们获得竞争处理机的权利。是内存与外存之间的调度。
高级调度对进程状态的影响:无—>创建态----->就绪态
(2)中级调度(内存调度)
中级调度对进程状态的影响:挂起态----->就绪态
(3)低级调度(进程调度)
低级调度对进程状态的影响:就绪态------>运行态
3、进程调度的方式
广义的进程调度包含了选择一个进程和进程切换两个步骤。进程的切换过程主要完成了:
4、调度算法的评价指标
(1)CPU利用率=忙碌的时间/总时间
(2)系统吞吐量:单位时间内完成作业的数量
=总共完成了多少道作业/完成作业的时间
(3)周转时间:指从作业被提交给系统开始,到作业完成为止的这段时间间隔。周转时间=作业完成时间-作业提交时间
(4)带权周转时间:=作业周转时间/作业实际运行的时间
5、调度算法
(1)FCFS
先来先服务(FCFS):
(1)主要从公平的角度考虑,按照作业/进程到达先后顺序进行服务
(2)非抢占式
(3)优点:公平,算法实现简单
(4)缺点:排在长进程/作业后的短进程需要等待很长时间,带权周转时间很大,对短作业来说体验不好。
短进程优先(SPF,shortest process first,SJF,job,短作业优先)
(1)追求最少的平均等待时间、最少的平均周转时间
(2)最短的作业/进程优先得到服务(最短是指服务时间最短)
(3)SPF是非抢占式算法,但也有抢占式版本------最短剩余时间优先,SRNT算法
(4)优点:“最短的”(这个最短是有前提的,下面有提到)平均等待时间、平均周转时间
(5)缺点:不公平。对短作业有利,长作业不利,可能产生饥饿现象
在所有进程可同时运行时(或在所有进程几乎都同时到达时),采用SPF算法的平均等待时间、平均周转时间最少
(3)HRRN
高响应比优先(HRRN,highest response ratio next)
(1)要综合考虑作业/进程的等待时间和执行时间
(2)每次调度时先计算各个作业的响应比,选择响应比最高的进程为其服务
(3)非抢占
-------------------------------进程调度-----------------------------------------
(4)时间片轮转RR算法
时间片轮转(RR,round-robin)
(1)公平的、轮流的为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片
(2)用于进程调度(只有作业放入内存建立相应的进程后,才能被分配处理机时间片)
(3)轮流让就绪队列中的进程一次执行一个时间片(每次选择排在就绪队列队头的进程)
(4)如果时间片太大,使得每个进程都可以在一个时间片内就完成,则RR算法退化为FCFS算法,并且会增大进程响应时间
(5)优点:公平,响应快,让各个进程得到及时的响应;缺点:不区分任务的紧急程度
(5)优先级调度算法
(1)算法思想:越来越多的应用场景需要根据任务的紧急程度来决定处理顺序
(2)每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程
(3)即可用于作业调度,也可用于进程调度
(4)抢占、非抢占式都有
(6)多级反馈队列算法
(1)对其他调度算法的折中权衡
(2)设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
(3)新景程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾
(4)只有第k级队列为空时,才会为k+1级队头的进程分配时间片
(5)抢占式算法
(6)用于进程调度
1、对临界资源的互斥访问,可以在逻辑上分为如下四个部分:
注意:临界区是进程中访问临界资源的代码段,进入区和退出区是负责实现互斥的代码段。
2、为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
1、单标志法
在这种情况下,对临界区的访问,一定是按P0—>P1—>P0—>P1—>…这样轮流访问。单标志法主要问题是,违背“空闲让进”原则
3、双标志后检查法
4、Peterson算法
Peterson算法采用软件方法解决互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则
1、中断屏蔽方法
2、TestAndSet指令
TSL指令是用硬件实现的,执行过程不允许被中断,只能一气呵成。
1、整型信号量
用一个整数变量来作为信号量,表示系统中某种资源的数量。对信号量的操作只有三种:P操作、V操作、初始化。
优点:检查和上锁一气呵成,避免了并发、异步导致的问题
缺点:不满足让权等待,会发生忙等
2、记录型信号量
即用记录型数据结构表示的信号量
3、信号量机制实现进程互斥
(1)分析并发进程的关键活动,划定临界区
(2)设置互斥信号量mutex,初值为1
(3)在临界区之前执行P
(4)在临界区之后执行V
4、信号量机制实现进程同步
同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。
(1)分析什么地方需要实现“同步”,即必须保证“一前一后”执行的2个操作
(2)设置同步信号量S,初始为0
(3)在“前操作”之后执行V,在“后操作”之前执行P
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入一个缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(这里“产品”理解为某种数据)
semaphore mutex=1; //互斥信号量,实现对缓冲区的互斥访问
semaphone empty=n; //同步信号量,表示空闲缓冲区的数量
semaphone full=0; //同步信号量,表示产品的数量,也即非空缓冲区的数量
能否改变相邻P、V操作的顺序?
因此,实现互斥的P操作一定要在实现同步的P操作之后。
由于V操作不会导致进程阻塞,因此两个V操作顺序可以交换。
在多消费者,多生产者模型时,如果缓冲区大小大于1,那就必须专门设置一个互斥信号量mutex,来保证互斥访问缓冲区(等于1的时候视情况可以不用设置)
有读者和写着两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程同时访问共享数据时可能导致数据不一致的错误。因此要求:
互斥:写与写、写与读
改进:
如果需要实现“一气呵成”,应该想到用互斥信号量
在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后,无外力干涉的话,这些进程都无法向前推进。
与饥饿和死循环的区别:
死锁产生的必要条件:
(1)互斥条件:只有对必须互斥使用的资源争抢才会导致死锁(像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的)
(2)不剥夺条件:进程所获得的资源在未使用完之前,不能由其它进程强行夺走,只能主动释放
(3)请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其它进程占有,此时请求进程被阻塞,但又对自己持有的资源保持不放
(4)循环等待条件:存在一种进程资源的循环等待链,链中的每个进程已获得的资源被下一个进程所请求
注意:死锁时一定循环等待,但循环等待未必死锁
何时会发生死锁?
1、破坏互斥条件
把互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。
缺点:并不是所有的资源都可以改造成共享资源。为了系统安全,有时候需要保护这种互斥性。
/2、破坏不剥夺条件
方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时,再重新申请。
方案二:当某个进程需要的资源被其他进程所占的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级
缺点:
3、破坏请求和保持条件
采用静态分配方法,即进程在运行前一次申请完他所需要的全部资源,在它的资源为满足前,不让它投入运行。
缺点:有些资源可能只需要用很短的时间,也被进程的整个运行期间一直保持着,就会造成严重资源浪费,资源利用率极低,也可能导致某些进程饥饿
4、破坏循环等待条件
采用顺序资源分配法。规定每个进程必须按编号递增的顺序请求资源,同类资源(编号相同的资源)一次申请完。
(拥有大编号资源的进程不可能逆向回来申请小编号资源)
缺点:
1、安全序列
就是指系统如果按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。如果系统处于安全状态,就一定不会发生死锁。
因此,可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以决定是否答应资源分配请求。这就是“银行家算法”的核心思想
内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理
1、内存地址:内存地址从0开始,每个地址对应一个存储单元。
相对地址:相对于内存起始地址的偏移量,又称为逻辑地址
绝对地址:内存中实际存放的位置,又称为逻辑地址
2、常用基本单位
2 10 2^{10} 210=1K , 2 20 2^{20} 220=1M, 2 30 2^{30} 230=1G
1、覆盖技术:用来解决程序大小超过物理内存总和的问题
覆盖技术的思想:
2、交换技术
(1) 内存空间紧张时,系统将内存中某些进程暂时换出到外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)。暂时被换出到外存等待的进程处于挂起状态。
(2)交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如,许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。
(3)可以优先换出阻塞进程;可换出优先级低的进程;
ps:PCB会常驻内存,不会换出外存
先讲一下内部碎片和外部碎片的概念。
1、连续分配管理方式
连续分配:指为用户进程分配的必须是一个连续的内存空间,分为单一连续分配、固定分区分配和动态分区分配
(1)单一连续分配
内存被分为系统区和用户区。内存中只能有一道用户程序,用户程序独占整个用户区空间。
(2)固定分区分配
为了能在内存中装入多道程序,且他们之间不互相干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区只装入一道作业。
固定分区分配可分为 分区大小相等(缺乏灵活性) 和 分区大小不等(小进程可分配小分区,大进程分配大分区)。
OS需要建立一个分区说明表,来实现各个分区的分配与回收。每个表项包括分区大小、起始地址、状态(是否已分配)。
(3)动态分区分配(可变分区分配)
不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,使分区的大小正好适合进程的需要。回收时,相邻的空闲分区要合并。
采用什么样的数据结构记录内存的使用情况?-----空闲分区表和空闲分区链
(关于怎么分配,需要采用一定的动态分区分配算法,在下面会有介绍。)
动态分区分配没有内部碎片,但是有外部碎片。可以通过紧凑技术来解决外部碎片。
2、动态分区分配算法
(1)首次适应算法
思想:每次从低地址开始查找,找到第一个满足大小的空闲分区
实现:空闲分区以地址递增的次序排列。每次分配内存时查找空闲分区链。
(2)最佳适应算法
思想:优先使用更小的空闲区
实现:把空闲分区按容量递增的次序排列
缺点:每次都选最小的分区进行分配,会留下越来越多的、难以利用的小的内存块,因此会产生很多外部碎片
(3)最坏适应算法
思想:解决最佳适应算法的问题----太多难以利用的小碎片。在每次分配时优先使用最大的连续空闲区,合影分配后剩余的空闲区就不会太小。
实现:把空闲分区按容量递减的次序排列,每次顺序查找空闲分区链
缺点:导致较大的连续空闲区被迅速用完。之后如果有大进程到达,就没有内存分区可用了。
(4)邻近适应算法
思想:针对首次适应算法,不要每次都从链头开始查找,而是从上次查找结束的位置开始检索。
实现:空闲分区按按地址递增的次序排列。每次分配从按上次查找结束的位置开始查找空闲分区表
缺点:由于低地址和高地址部分的空闲分区有相同的概率被使用,导致高地址部分的大分区更可能被使用,划分为小分区,最后无大分区可用(最坏适应算法的缺点)
四种算法,反而首次适应算法效果最好
3、非连续分配管理方式-----分页存储管理
(1)基本概念
Q:将进程地址空间分页后,OS如何实现逻辑地址到物理地址的转换?
①算出逻辑地址对应的页号(=逻辑地址/页面长度,取整数部分)
②要知道该页号对应的页面在内存中的起始地址
③算出逻辑地址在页面内的偏移量=(逻辑地址%页面长度)
④物理地址=页面起始地址+页内偏移量
①如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是 2 K 2^K 2K个内存单元
②如果有M位表示“页号”,则说明在该系统中,一个进程最多允许有 2 M 2^M 2M个页面
(2)页表
为了知道进程的每个页面在内存中存放的位置,操作系统为每个进程建立一张页表。-----页表记录进程页面和实际存放的内存块之间的对应关系。
(3)两级页表
单级页表存在的问题:
①页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框
②没有必要让整个页表常驻内存,因为进程在有段时间内可能只需要访问几个特定个的页面(虚拟存储技术)
采用多级页表,则各级页表的大小不能超过一个页面
。如果两级页表不够,可以分更多级
缺点:多级页表访问内存的次数变多
4、非连续分配管理方式-----分段存储管理
①与“分页”最大的区别-----离散时所分配地址空间的基本单位不同
②进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有个段名,每段从0开始编址。
③内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻
④分段系统的逻辑地址结构由段号(段名)+段内地址(偏移量)组成
⑤像页表一样,也需要建立一张段表(逻辑段到实际的物理内存的映射)
每个段对应一个段表项,记录了该段在内存中的起始位置(基址)和段的长度。各个段表项长度相同。
分页、分段管理对比:
传统内存管理:连续分配(单一连续、固定分区、动态分区),非连续分配(分页、分段、段页)
缺点:
①一次性:作业必须全部一次性装入内存后才能开始运行
②驻留性:作业一旦被装入内存,就会一直驻留在内存中
1、虚拟内存的定义和特征
在OS管理下,用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存
虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的
虚拟内存的实际容量=min(内存和外存容量之和,CPU寻址范围)
虚拟内存的三个特征:
①多次性:无需作业运行时一次性全部装入内存,允许被分成多次调入内存(所以采用离散分配内存,这样比较方便)
②对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中将其换入、换出
③虚拟性:逻辑上扩充了内存容量,使用户看到的容量大于实际容量