目录
3.1.6 基本分页存储管理的基本概念(非连续分配管理方式)
第一章 操作系统概述
1.1操作系统的基本概念
1.1.1 操作系统的概念、功能和目标
直观理解操作系统的各个功能:比如用户是雇主,操作系统是工人(用来操作机器),计算机是机器(由处理机、存储器、设备、文件几个部件构成),工人有熟练的技能,能够控制和协调各个部件的工作,这就是操作系统对资源的管理;同时,他必须会接收雇主的命令,这就是“接口”;当有了他,机器发挥了更大的作用,那么他就成了“扩充机器”。
计算机系统的层次结构:
而操作系统的层次还能够继续进行划分:
计算机操作系统概念:
是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,她是计算机系统中最基本的系统软件。
1.1.2操作系统的功能和目标:
(1)作为系统资源的管理者:
(2)作为用户和计算机硬件之间的接口
用户接口分为命令接口和程序接口其中:
命令接口是指用户利用这些操作命令组织和控制作业的执行
程序接口是指编程人员可以使用它们来请求操作系统服务
易懵概念:系统调用=系统调用命令=广义指令
(3)作为最接近硬件的层次
需要提供的功能和目标:实现对硬件机器的拓展(即把硬件组织起来,实现一些功能,我们普通用户就可以直接使用这些功能,而无需关心这些东西在底层究竟是怎么组织起来工作的)
1.1.3 操作系统的特征
1.并发:指两个和多个事件在同一时间间隔内发生。这件事件宏观上是同时发生,微观上交替发生
(即使现在的计算机都是多核cpu,但是操作系统的并发性依然必不可少)
在操作系统中引入进程的目的是时操作系统能并发执行
并行:两个或多个事件同时发生
2.共享:即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用
共享分为两种方式:
并发和共享的关系(互为存在条件)
3.虚拟:是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的
虚拟存储器技术:
4.异步性
1.2 操作系统的发展与分类
学习提示:重点理解各阶段的有点和缺点。各阶段的主要优点都是解决了上一个阶段的主要缺点。
1.2.1手工操作阶段(此阶段无操作系统)
主要缺点:用户独占全机、人机速度矛盾导致资源利用率极低
1.2.2批处理系统(操作系统开始出现)
单道批处理系统
引入脱机输入/输出技术(用磁带完成),并监督程序负责控制作业的输入、输出
主要优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升
主要缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序。cpu有大量的时间是在空闲等待I/O完成。资源利用率依然很低。
多道批处理系统
主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源保持“忙绿”状态,系统吞吐量增大。
主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业后就只能等待计算机处理完成,中间不能控制自己的作业执行)
多道批的主要缺点是不能提供人机交互的能力,因此分时操作系统就是为了解决这个问题而诞生的
1.2.3分时操作系统
要求快速响应用户是分时系统出现的主要原因
计算机以时间片为单位轮流为各个用户/作业服务,各个用户可以通过终端与计算机进行交互
主要优点:用户请求可以及时被响应,解决了人机交互问题。
主要缺点: 由于操作系统对各个用户/作业都是完全公平的,因此不能优先处理一些紧急任务。不区分任务的紧急性。
1.2.4实时操作系统
主要优点:能够优先响应一些紧急任务,某些紧急任务不需要时间片排队。
在实时操作系统的控制下,计算机系统接收到外部信号后及时处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性
实时操作系统又有如下分类:
1.2.5 操作系统的特点
(1)批处理操作系统的用户脱机使用计算机,作业是成批处理的,系统内多道程序并发执行,交互能力差
(2)分时操作系统可以让多个用户同时使用计算机,人机交互性较强,具有每个用户独立使用计算机的独占性,系统相应及时
(3)实时操作系统能控制对象及时作出反应,可靠性高,响应及时,但是资源利用率低。
1.3 操作系统的运行环境
1.3.1 操作系统运行机制与体系
1.3.1 操作系统的运行机制
简单来说,“指令”就是处理器(CPU)能识别、执行的最基本命令
CPU如何判断当前是否可以执行特权指令?
操作系统的内核:
内核:是计算机上配置的底层软件,是操作系统最基本、最核心的部分,而实现操作系统内核功能的那些程序就是内核程序
操作系统的体系结构:大内核和微内核
1.3.2 中断和异常的概念(是操作系统必须提供的功能)
中断机制的诞生:在早期计算机中,各程序只能串行执行,系统资源利用率低。为了解决这个问题,人们发明了操作系统(作为计算机的管理者),引入中断机制,实现了多道程序并发执行。
本质:发生中断就意味着需要操作系统介入,开展管理工作
中断必须在核心态下进行
用户态、核心态之间的切换是怎么实现的?
答:是通过中断实现的。并且中断是唯一途径。而核心态到用户态的切换是通过执行一个特权指令,将程序状态字(PSW)的标志位置为“用户态”。
中断的分类:
外中断(指来自CPU执行指令以外的事件的发生)和内中断(也称异常、例外或陷入(trap),指源自CPU执行指令内部的事件)
另一种分类方式:
外中断的处理过程:
1.3.3 系统调用
操作系统是一层接口,对上层提供服务,对下层进行抽象。它通过系统调用向其上层用户、应用程序和应用系统提供对系统资源的使用
什么是系统调用?有何作用?
应用程序通过系统调用请求操作系统的服务。系统中的各种共享字员都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用的分类:
由于这些功能需要执行一些特权指令才能完成,因此系统调用的相关处理需要在核心态下进行。
系统调用与库函数的区别
系统调用背后的过程
传递系统调用参数->执行陷入指令(用户态)->执行系统调用相应服务程序(核心态)->返回用户程序
(通常情况下能在用户态执行的指令就可以在核心态执行,而陷入指令是唯一一个只能在用户态执行而不能在核心态执行的指令)
第二章 进程管理
2.1 进程与线程
2.1.1 进程的概念和特征
系统为每个运行的程序配置一个数据结构,成为进程控制块(PCB),用来描述进程的各种信息(如程序代码的存放位置)
进程的组成(进程实体):
程序段、数据段、PCB三部分组成了进程实体,一般情况下我们把进程实体就简称为进程,例如,所谓创建进程,实际上是创建进程实体中的PCB,而撤销进程,实际上是撤销进程实体中的PCB
注意:PCB是进程存在的唯一标志!
引入进程实体的概念后,可把进程定义为:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
注意:严格来说,进程实体和进程并不一样,进程实体是静态的(指的是数据本身),进程是动态的。不过,除非题目专门考察二者的区别,否则可以认为进程实体就是进程。
PCB中的内容:
进程的组织:
在一个系统中,通常有数十、数百乃至数千个PCB。为了能对他们加以有效的管理,应当用适当的方式把这些PCB组织起来
注:进程的组成讨论的是一个进程内部由哪些部分够成的问题,而进程的组织讨论的是多个进程之间的组织方式问题
进程的特征:
2.1.2 进程的状态与转换
进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时有需要等待CPU服务,可见,进程的状态是会有各种变化。为了方便对各个进程的管理,操作系统需要将进程合理地划分为集中状态。
进程的三种基本状态:
注意:
对于运行态:在单核处理机环境下,每一个时刻最多只能有一个进程处于运行态,而在双核环境下可以同时有两个进程处于运行态。
对于就绪态的进程,该进程已经拥有了除处理机之外所有需要的资源,一旦获得处理机,即可立即进入运行态开始运行。即:万事具备,只欠CPU
除了以上三种基本状态,进程还有另外两种状态:
进程状态的转换
注意:不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求)
2.1.3 进程的控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
简化理解:反正进程控制就是要实现进程状态转换
如何实现进程控制?
用原语实现进程的控制。原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作即原子操作。
原语采用“关中断指令”和“开中断指令”实现
(原语运行在核心态)
显然,关/开中断指令的权限非常大,必然是只允许在核心态下执行的特权指令
进程控制相关的原语:
2.1.5 进程通信
顾名思义,进程通信就是指进程之间的信息交换
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立
为了保证安全,一个进程不能直接访问另一个进程的地址空间。
但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法:
首先,对于
(1)共享储存:
两个进程,它们不能直接访问对方的地址空间所以操作系统会为两个进程分配一个共享空间,然后两个进程的通信就可以通过共享空间来完成。
注意:两个进程对共享空间的访问必须是互斥的,而互斥访问是通过操作系统提供的工具实现的。
共享存储分为两种:
(2)管道通信
“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。
注意:
1. 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道
2. 各进程要互斥地访问管道(例如,进程1在向管道中写数据时,进程2是不可以读数据的,只有当进程1把数据全部写入管道,进程2才能开始读取)
3. 数据是以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
4. 如果没写满,就不允许读。如果没读空,就不允许写
5. 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况(例如,若进程2想读取数据,而此时有进程3读取了 这个数据,那么进程2就读不到了)
(3)消息传递
进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换
消息传递分为:
直接通信方式:
进程1直接把消息通过发送原语发送给目标进程,这个消息就会被发送到消息缓冲队列的队尾,目标进程2通过接收原语把缓冲队列上的消息一个个取走
间接通信方式:
信箱中可能有很多消息,而这些消息由哪个进程发,有哪个进程收,都会标记在消息头里,所以并不用担心消息会被取错。
进程1会通过发送原语把消息放到信箱中,进程2会通过接收原语把消息取走。
2.1.6 线程概念和多线程模型
什么是线程,为什么要引入线程?
还没有 进程之前,系统中各个程序只能串行执行。而引入进程后就可以并行。
有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了线程,来增加并发度。
引入线程后:
CPU的调度服务对象不再是进程,而是进程中的线程,每一个进程中可能会包含多个线程,CPU轮流为线程服务。而QQ视频聊天处理程序和QQ传送文件处理程序如果想并发的完成,那么久可以把这两件事放在两个不同的线程下,自然就可以并发的完成了
引入线程后,线程成为了程序执行流的最小单位,而传统的进程是程序执行流的最小单位。
可以把线程理解为“轻量级进程”,以前CPU的调度单位是进程,而现在CPU的调度对象是线程,因此线程是一个基本的CPU执行单位,也是程序执行流的最小单位。
引入线程后,不进是进程之间可以并发,进程内的线程之间也可以并发,从而进一步提升了系统的并发性,使得一个进程内可以并发处理各种任务(如QQ视频、文字聊天、传文件)。
引入线程后,进程只作为除CPU之外的系统资源的分配单位(如打印机、内存地址空间等都是分配给进程的)。
引入线程机制后,有什么变化?
系统开销的类比:
去图书馆看书。
切换进程运行环境:有一个不认识的人要用桌子,你细腰把你的书收走,他爸自己的书放到桌子上,系统开销大
而统一进程内的线程的切换=你的舍友要用这张桌子,可以不把桌子上的书收走。
注:在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。而在引入了线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位,且无论在传统操作系统还是设有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系统资源(也有一点必不可少的资源),但线程可以访问其隶属进程的系统资源。我们要知道,如果线程也是拥有资源的单位,那么,切换线程也需要较大的时空开销,线程这个概念提出就没有意义了。
线程的属性
线程的实现方式
(1)用户级线程
(2)内核级线程
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上(n>=m)
重点:操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位
例如:在上面这个模型中,该进程有两个内核级线程,三个用户级线程,在用户看来,这个进程中有三个线程。但在操作系统看来,只有两个线程。因此即使该进程在一个4核处理机的计算机上运行,也最多只能背分配到两个核,最多只能有两个用户线程并发执行。
多线程模型
多对一模型:
一对一模型:
多对多模型
2.2 处理机调度
2.2.1 处理机调度的概念、层次
调度的基本概念
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些服务的顺序,这就是“调度”研究的问题
在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
调度的三个层次——高级调度
调度的三个层次——中级调度
补充知识:进程的挂起态与七状态模型
调度的三个层次——低级调度
三层调度的联系、对比
作业调度从外存的后备队列中选择一批作业进入内存,为它们建立进程,这些进程被送入就绪队列,进程调度从就绪队列中选出一个进程,并把其状态改为运行状态,把CPU分配给它。中级调度是为了提高内存的利用率,系统将那些暂时不能运行的进程挂起来。当内存空间宽松时,通过中级调度选择具备运行条件的进程,将其唤醒。
1)作业调度为进程活动做准备,进程调度时进程正常活动起来,中级调度将暂时不能运行的进程挂起,中级调度处于作业调度和进程调度之间
2)作业调度次数少,中级调度次数略多,进程调度频率最高
3)进程调度是最基本的,不可或缺
2.2.2 进程调度的时机切换与过程调度方式
进程调度的时机
进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机
进程调度的方式
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。(非常简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统)
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。(可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统)
进程的切换与过程
“狭义的进程调度”与“进程切换”的区别:
狭义进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可以是另一个进程,后一种情况就需要进程切换)
进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。
广义的进程调度包含了选择一个进程和进程切换两个步骤。
进程切换的过程主要完成了:
1.对原来运行的进程各种数据的保存
2.对新的进程各种数据的恢复(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)
注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行的进程的时间减少。
2.2.3 调度算法的评价指标
CPU利用率
系统吞吐量
周转时间
注意:
1. 由于作业周转时间包含了作业实际运行的时间,因此带权周转时间必然>=1
2.带权周转时间与周转时间都是越小越好(比如在排队等待过程中,等待时间越小越好)
3.对于周转时间相同的两个作业,实际运行时间长的作业在相同时间内被服务的时间更多,带权周转时间更小,用户满意度更高
4.对于实际运行时间相同的两个作业,周转时间短的带权周转时间更小,用户满意度更高
等待时间
计算机的用户希望自己的作业尽可能少的等待处理机
等待时间,指进程/作业处于等待处理机状态之和,等待时间越长,用户满意度越低。
对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。
对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。
一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业/进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。(所有进程(作业)的等待时间进行加和再除以进程(作业)数量)
响应时间
对于计算机用户来说,会希望自己的提交的请求(比如通过键盘输入了一个调试命令)尽早地开始被系统服务、回应。
响应时间,指从用户提交请求到首次产生响应所用的时间。
2.2.4 典型的调度算法(FCFS,SJF,HRRN)
先来先服务(FCFS)
短作业优先(SJF):
非抢占式的短作业优先算法
抢占式的短作业优先算法(又称“最短剩余时间优先算法”)
注意几个小细节:
对FCFS和SJF两种算法的思考
FCFS算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务。但是没有考虑到作业的运行时间,因此导致了对短作业不友好的问题。
SJF算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至还会导致饥饿问题
能不能设计一个算法,既考虑到各个行业的等待时间,也能兼顾运行时间呢?
高响应比优先算法被提出。
高响应比优先(HRRN):