操作系统期中复习
未完待续----后续补充全书完整板
一、计算机系统概述
1.1操作系统的基本概念
1.1.1操作系统的概念
操作系统:是指控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。
操作系统是计算机系统中最基本的系统软件。
1.1.2操作系统的功能和目标
1.操作系统作为计算机系统资源的管理者(了解,非重点)
(1)处理机管理:多道程序环境下,处理机的分配以进程为基本单位。因此处理机管理归结为对进程的管理。
主要功能包括:进程控制,进程同步,进程通信,死锁处理,处理机调度等等。
(2)存储器管理:为方便用户使用内存及提高内存的利用率。主要包括:内存分配与回收,地址映射,内存保护,内存共享,内存扩充。
(3)文件管理:负责文件管理的部分称为文件系统。主要包括:文件存储空间的管理,目录管理,文件读写管理和保护等等。
(4)设备管理:为方便用户使用各种设备,提高文件的利用率等。主要包括缓冲管理,设备分配,设备处理和虚拟设备等等。
2.操作系统作为用户与计算机硬件系统之间的接口(重点)
为了方便用户操控计算机硬件来运行程序。操作系统提供了两种接口:命令接口和程序接口。
命令接口:用户利用这些操作命令来控制作业的执行。
程序接口:编程人员用来请求操作系统服务。
(1)命令接口
用命令接口来控制作业主要有两种方式:联机控制方式和脱机控制方式。
联机命令接口:即交互式命令接口,用于分时或实时系统的接口。用户通过键盘输入操作命令,用户每输入一条命令,系统就执行一条命令。即每有一个命令就做一件事。
脱机命令接口:即批处理命令接口,用于批处理系统。脱机命令由一组控制命令组成。系统按照这组命令自动的执行命令。即类似于流水线自动化执行一组命令来完成一件事。
(2)程序接口
程序接口由一组系统调用组成。(系统调用是重点)
用户通过在程序中使用这些系统调用来请求操作系统为其提供服务。
目前主流的图形用户界面GUI,即图形接口,就是通过调用程序接口实现的。
1.1.3操作系统的特征
1、并发(重点)
并发指得是多个事件在同一时间间隔内发生。
在多道程序环境下,内存中同时装有多个程序,实现多道程序交替运行,即交替使用某个系统资源,是CPU尽可能的处于忙碌状态。
并行性是指系统同时进程运算或操作,是真正意义上的同时,即同一时刻内完成多种工作。
在支持多道程序的单处理机,一段时间内,宏观上是多道程序同时在执行,但在每一时刻,实际只有一道程序在执行,微观上这些程序是分时交替执行的。因此操作系统并发性是通过分时来实现的。
而CPU和IO设备,IO设备和IO设备能实现真正意义上的并行。(如能一边用耳机听歌,一边用键盘写此文章)
要实现并行,需要一些环境支持,如多流水线或多处理机环境。
辨析同一时间间隔和同一时刻
如一节课50分钟,打游戏和刷视频。
同一时间间隔:前20分钟专心打游戏,中间10分钟专心刷视频,后20分钟专心打游戏。在这一节课50分钟内打游戏和刷视频就是并发执行的。
同一时刻:整个50分钟,你一边刷视频一边打王者,打王者时分屏刷抖音,那么这50分钟内打游戏和刷视频就是并行执行的。
操作系统引入进程的目的就是:使程序能并发执行。
2、共享(重点)
共享即资源共享。指资源供内存中多个并发执行的进程共同使用。
资源共享分为两种方式:互斥共享和同时访问。
(1)互斥共享
某些资源虽然可以供多个进程使用,但一段时间内只允许一个进程使用。如打印机等(你打印时候,别人就不能使用)。
临界资源:这些一段时间内只允许一个进程访问的资源称为临界资源。大多数的物理设备及软件中的栈,变量,表格都是临界资源。必须互斥共享。
(2)同时访问
有些资源允许一段时间内可以被多个进程同时访问,同时指在微观上交替访问,即分时。
典型的资源如:磁盘设备,可重入代码编写的文件等,都可以被同时共享。
可重入代码:可理解为PDF形式的,而非Word形式的,内容不会被改变,所以允许多个人同时访问,而不会产生影响。
(可能有疑问,同时访问是分时交替访问,那不还是属于互斥共享吗?)
区别在于:
互斥共享要求完成这个任务期间,不能被打断。(如打印机在打印《滕王阁序》的时候,是不能被打断去打印生僻字歌词的,否则一页纸可能上面是滕王阁序,下面是生僻字歌词,那这两个打印任务都会失败。)
同时访问在完成任务期间允许被打断,效果和连续完成时一样的。
并发和共享是操作系统的两个最基本的特征。两者互为存在条件。
资源共享是以程序并发为条件的。系统若不能对资源共享进行有效管理,则会影响程序并发执行。
3、虚拟
虚拟是将一个物理的实体变为逻辑上的对应物。
虚拟技术有:时分复用技术,如虚拟处理机。空分复用技术,如虚拟存储器。
4、异步
多道程序环境下,多个程序并发执行,但资源有限的,进程的并发执行可能不是连续的,而是走走停停的,即中断的,进程以不可预知的速度推进,可能产生不同的结果,即进程的异步性。
1.1.4本节重点
(1)库函数与系统调用的区别和联系
库函数是语言或应用程序的一部分,运行在用户空间。
系统调用是操作系统的一部分,运行在内核空间。许多库函数也是通过系统调用来实现的。
未使用系统调用的库函数,比,使用系统调用的库函数,执行效率更高。
原因是:系统调用,需要进行上下文切换和状态的转换,如用户态转向内核态。
(2)多道程序和单道程序区别(多道程序贯穿整本书)
务必理解多道程序的含义。
抛开晦涩难懂的定义。
直接以吃饭例子来解释。吃饭时候,桌子上放着馒头、小米粥、辣椒炒肉。你要把馒头,小米粥,辣椒炒肉都吃完。吃法有很多种。就以馒头,小米粥,辣椒炒肉这个顺序来说明。其中人的嘴可以想象成CPU。
单道程序吃法:吃馒头,必须把整个馒头吃完才能拿下一个(小米粥),同样,必须喝完小米粥才能拿下一个(辣椒炒肉),等等……
多道程序吃法:吃口馒头,把馒头放下来,手去端来小米粥喝口,再把小米粥放下来,再用手夹一个辣椒炒肉吃。然后再吃口馒头,喝口小米粥,吃口辣椒炒肉。按这个顺序直到把三个都吃完。如果其中一样例如馒头先吃完了,那就小米粥和辣椒炒肉循环吃。
由此可见多道程序的优点:人的嘴会尽可能的在一直吃,不闲着。
在单道程序吃法中,可能因为吃了好几口馒头被噎住了,想要喝口小米粥,这时必须要请求才能喝,比如你要向家长报告才能喝,家长允许了,你才能放下馒头,重新端起小米粥喝,解决完噎住问题,要把小米粥还回去,继续啃你的馒头。(可见一个简单的事情,在按照规定严格的处理下来是很繁琐的)一来一回要浪费不少时间。
1.2操作系统发展历程
1.2.1手工操作阶段
此时无操作系统。
计算机上的所有计算都要认为操作,如程序的装入,运行,结果输出等。
硬件的发展使人机矛盾越来越大,人的速度跟不上机器速度,导致机器性能得不到有效提升。
缺点:1、用户独占全机,资源利用率低。2、CPU利用不充分,CPU等待人工操作(等待人工输入数据等)。
破局:用快速机器代替人工操作。由此下一阶段。
1.2.2批处理阶段
操作系统开始出现。
为解决人机矛盾,出现批处理系统,分为单道批处理系统、多道批处理系统(多道程序技术出现以后)。
1.单道批处理系统
为对作业连续处理,以脱机方式将一批作业输入彩带,作业一个接一个被连续处理。内存中始终保持一道作业。
特征:1、自动性。2、顺序性。3、单道性。
面临问题:在一个作业运行期间,发出IO请求,CPU会等待IO完成。此时CPU处于空闲状态。
为了进一步提高资源的利用率和系统的吞吐量,引入多道程序技术。由此发展出多道批处理系统。
2.多道批处理系统
作业存放在外存上排成队列,由作业调度程序选择若干作业调入内存。他们穿插运行,共享系统资源。
当因IO请求而暂停时,CPU不会闲着,而转去另一个作业继续运行。这是通过中断机制实现的。
中断机制(重点)后续详解
多道程序设计特点:多道、宏观上并行、微观上串行。
批处理系统上采用多道程序设计技术就形成了多道批处理系统。
优点:资源利用率高。系统吞吐量大。
缺点:用户响应时间长。不能人机交互。
批处理系统的主要缺点是无交互能力(重点)。
多任务操作系统(真题出现过,后续再补充)
1.2.3分时操作系统
分时技术:将处理器的运行时间分成很短的时间片。按时间片轮流将处理器分配给各个作业使用。
分时系统值多个用户通过终端同时共享一台主机。
分时系统是实现人机交互的系统。
特征:1、同时性。2、交互性。3、独立性。4、及时性。
当要求在规定时间内必须完成一个任务后,分时系统已经应接不暇了,由此出现了实时操作系统。
1.2.4实时操作系统
能在限制时间内完成某个任务。
分为软实时和硬实时。
实时系统的主要特点是:及时性和可靠性。
1.2.5网络操作系统和分布式计算机系统
网络操作系统是随计算机网络发展而诞生的。把各台计算机结合在一起,实现在计算机之间数据通信。
分布式操作系统是由多台计算机组成,其中任意两台计算机通过通信方式交换信息。每台计算机都具有同等地位,每台计算机的资源为所有用户共享,特点是分布性和并行性。
分布式操作系统和网络操作系统本质不同是:分布式操作系统中若干计算机相互协作完成同一个任务。
1.2.6个人计算机系统
是目前使用最广泛的操作系统。
1.3操作系统的运行环境
1.3.1处理机运行模式
在计算机系统中,CPU执行两种不同性质的程序。
1、操作系统内核程序。2、用户自编程序(系统外层的应用程序,简称应用程序)。
内核程序是应用程序的管理者。
内核程序要执行一些特权指令。而应用程序不能执行特权指令。
特权指令与非特权指令(指令例子是重点)
特权指令:不允许用户直接使用的指令。如IO指令、关中断指令、内存清零指令、粗去内存保护的寄存器的指令、修改程序状态字寄存器的指令等。
非特权指令:允许用户直接使用的指令,不能直接访问系统的软硬件资源,仅限于访问用户的地址空间,防止用户程序对系统破坏。
内核态和用户态执行的指令分析
CPU运行模式可以分为用户态和内核态。
CPU处于内核态,可以执行特权指令。
CPU处于用户态,只能执行非特权指令。
切换到用户态的指令也是特权指令。
应用程序运行在用户态,操作系统内核程序运行在内核态。
应用程序向操作系统请求服务时通过使用访管指令。
访管指令在用户态执行,属于非特权指令。
1.时钟管理
操作系统通过时钟管理向用户提供标准的系统时间。
通过时钟中断的管理,实现进程的切换
2.中断机制
引入中断技术的初衷是提高多道程序运行时的CPU利用率,比如使CPU在IO操作期间可以执行其他指令。后来发展成操作系统各类操作的基础。
即操作系统是靠中断驱动的软件。
中断机制中,小部分功能属于内核,负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少中断的处理时间,提高系统的并行处理能力。
3.原语
原语是操作系统底层一些可被调用的公共小程序,各自完成一个规定的操作。
特点
(1)处于操作系统的底层,最接近硬件的部分。
(2)具有原子性,即只能一气呵成。
(3)运行时间都较短,调用频繁。
定义原语的直接方法是关中断。让其所有动作不可分割的完成后再打开中断。
系统中的设备驱动、CPU切换、进程通信等功能的部分操作都可以定义为原语,成为内核的组成部分。
4.系统控制的数据结构及处理
为了实现对各种数据结构的有效管理,系统有如下常见的操作:
(1)进程管理。
(2)存储器管理。
(3)设备管理。
内核态指令实际包括系统调用类指令和一些针对时钟、中断和原语的操作指令。
1.3.2中断和异常的概念
在引入内核态和用户态这两种工作状态后,需要对这两种状态间进行切换。
操作系统内核工作在内核态。
用户程序工作在用户态。
CPU运行用户程序时,唯一能使用内核态实现的一些功能的方式是:通过中断或异常。
发生中断或异常时,运行用户态的CPU会立即进入内核态,这是通过硬件实现的。
中断是操作系统非常重要的一个概念。
操作系统发展的过程就是不断提高资源利用率的过程,而提高资源利用率就需要在程序未使用某种资源时。将对那种资源的占有权释放,这是通过中断实现的。
1.中断和异常的定义
中断:也成外中断,指来自CPU执行指令外部的事件,通常用于信息输入/输出,如设备发出的IO结束中断,表示设备输入/输出处理已经完成。
时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。
异常:也称内中断,指来自CPU执行指令内部的事件,如程序的非法操作码、地址越界、运算溢出、虚存系统的缺页及专门的陷入指令等引起的事件。
异常不能被屏蔽,一旦出现,就应该立即处理。
2.中断和异常的分类
外中断分为可屏蔽中断和不可屏蔽中断。
可屏蔽中断:通过INTR线发出的中断请求,通过改变屏蔽字实现多重中断。
不可屏蔽中断:通过NMI线发出的中断请求,通常是紧急的硬件故障。
异常分为故障、自陷和终止。异常是不可屏蔽的。
故障:指令执行引起的异常,如非法操作码、缺页故障、除数为0,运算溢出等。
自陷:也称陷入,事先安排的异常事件,如条件陷阱指令、系统调用指令等、
终止:指出现了CPU无法继续执行的硬件故障,如控制器出错,存储器校验错等。
故障异常和自陷异常属于软件中断(程序性异常)
终止异常和外部中断都属于硬件中断。
3.中断和异常的处理过程
当CPU在执行用户第i条指令时,检测到一个异常事件,或在执行第i条指令时,发现一个中断请求信号。
则CPU打断当前的程序,转到相应的中断或异常处理程序去执行。
若能处理了相应的问题,则在中断或异常处理程序的最后,CPU通过执行中断或异常返回指令,回到刚才被打断的第i条指令或第i+1条指令继续执行。
若处理不了相应的问题,则立即终止用户程序。
通常,对中断和异常的处理过程由操作系统完成。
中断处理与子程序调用的比较
(1)中断处理程序与被中断的程序是相互独立的。子程序和主程序是同一个程序的两部分,属于主从关系。
(2)中断的产生一般是随机的。而子程序调用是通过调用指令(CALL)引起的,是事先安排的。
(3)调用子程序的过程完全属于软件处理过程。而中断处理需要专门的硬件支持。
(4)中断处理程序的入口地址可由硬件向量法产生向量地址,再由向量地址找到入口地址。而子程序的入口地址由CALL指令中的地址码给出。
(5)调用中断处理程序和子程序都需要保护程序计数器PC的内容,前者是有中断隐指令完成,后者由CALL指令完成。
(6)响应中断时,需对同时检测到的多个中断请求进行裁决。而调用子程序没有这种。
1.3.3系统调用
系统调用是操作系统提供给应用程序(程序员)使用的接口。
系统中的各种共享资源都由操作系统统一管理。凡是与共享资源有关的操作(存储分配、IO传输及文件管理等),都必须通过系统调用方式向操作系统提出服务请求,由操作系统代为完成,将处理结束的结果返回给应用程序。
这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
一个操作系统提供的系统调用命令有几十至上百条,每个系统调用有唯一的系统调用号。
系统调用的功能:
设备管理。完成设备的请求或释放,设备启动等。
文件管理。完成文件的读、写、创建和删除等、
进程控制。完成进程的创建、撤销、阻塞和唤醒等、
进程通信。完成进程间的消息传递或信号传递等、
内存管理。完成内存的分配、回收等、
系统调用需操作系统内核程序负责完成,运行在内核态。
系统调用的处理过程
第一步,用户程序首先将系统调用号和所需的参数压入堆栈,
调用实际的调用指令,执行一个陷入指令,将CPU从用户态转为内核态,
由硬件和操作系统内核程序保护被中断进程的现场,将程序计数器PC、程序状态字PSW,通用寄存器内容压入堆栈。
第二步,分析系统调用类型,转入相应的系统调用处理子程序,
在系统重配置一个系统调用入口表,每个表项对应一个系统调用,
根据系统调用号可以找到该系统调用处理子程序的入口地址。
第三步,在系统调用处理子程序执行结束后,恢复被中断的或设置新进程的CPU现场,然后返回被中断或新程序,继续往下执行。
用户程序执行陷入指令,相当于将CPU的使用权主动交给操作系统内核程序(CPU状态由用户态进入内核态),之后操作系统内核程序对系统调用请求作出相应处理。
处理完成后,操作系统内核程序将CPU使用权还给用户程序(CPU状态由内核态回到用户态)。
这样设计的目的是:用户程序不能直接执行对系统影响非常大的操作,必须通过系统调用的方式青秀区操作系统代为执行,保证系统的稳定性和安全性。
1.4操作系统结构
1.分层法
2.模块化
3.宏内核
4.微内核
5.外核
1.5操作系统引导
1.6虚拟机
1.第一类虚拟机管理程序
2.第二类虚拟机管理程序
1.7本章小结
二、进程与线程
2.1进程与线程
什么是进程?
为什么引入进程的概念?
进程是怎么工作原理来解决问题的?
2.1.1进程的概念和特征
1、进程的概念
在多道程序环境下,多个进程并发执行,因此失去了封闭性,同时带来了间断性和不可再现性,为解决这个问题,引入了进程的概念。
多道程序:内存中同时存放多个程序,交替执行以提高资源利用率。
并发执行:多个进程 “同时” 运行,但实际是通过 CPU 时间片轮转而交替推进。指同一时间间隔。
封闭性:程序执行时独占系统资源(如内存、I/O 设备),其他程序无法干扰。
间断性:进程可能因等待 I/O、时间片耗尽等原因被中断,导致执行不连续。
不可再现性:并发执行时,资源竞争可能导致程序执行顺序不确定,结果无法复现。可见结果与执行顺序有关。
为了使并发执行的程序能独立运行,为其配置一个专门的数据结构,叫作进程控制块(即PCB)。系统通过PCB来描述进程的基本情况和运行状态。
(进程是人为定义的较抽象的概念,为了把他在计算机中实现,诞生了PCB,来代表一个进程,用一句话来描述PCB和进程:进程是对于人来说的,对于计算机来说就是PCB)。
所以
创建进程:就是创建PCB。
撤销进程:就是撤销PCB。
进程实体(进程映像):由程序段、相关数据段和PCB三部分构成。
进程的经典定义
(1)进程是一个正在执行的程序的实例。
(2)进程实一个程序及其数据从磁盘加载到内存后,在CPU上的执行过程。
(3)进程实一个具有独立功能的程序在一个数据集合上运行的过程。
即进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
这里的资源:理解为时间,即进程获得某种资源的时间,如获得CPU的时间。
进程是一个动态的、过程性的概念。
2、进程的特性
1动态性
进程是程序的一次执行。具有一定的生命周期,是动态产生、变化和消亡的。动态性是进程最基本的特征。
2并发性
指多个进程同村与内存中,可以在一段时间内同时运行。引入进程的目的就是为了能并发执行.
3独立性
进程是一个能独立运行、独立获得资源和独立接受调度的基本单位。未创建PCB的程序,都不能作为一个独立单位运行,因为他没创建进程。
4异步性
由于程序的相互制约,使各程序各自独立,不可预知的速度向前运行。导致执行结果具有不可再现性。为此必须配置相应的进程同步机制。
2.1.2进程的组成
进程是一个独立的运行单位,是操作系统进行资源分配和调度的基本单位。由三部分组成:PCB、程序段、数据段。
1.PCB
创建进程时,操作系统新建一个PCB,之后PCB常驻内存,任意时刻都可存取,在进程结束时删除PCB。
PCB是进程实体的一部分,是进程存在的唯一标志。
进程执行时:系统通过PCB了解进程的状态信息,便于操作系统对进程进行控制和管理。
进程结束时:系统回收PCB。进程也随之消亡。
操作系统调度进程运行时:
2.程序段
程序段是能被进程调度程序调度到CPU执行的程序代码段。
程序可悲多个进程共享。
多个进程可以运行一个程序。
3.数据段
进程对应的程序加工处理的原始数据,或执行时产生的中间数据。
2.1.3进程的状态与转换
进程有5种状态:创建态、终止态、就绪态、运行态、阻塞态。其中后三种为基本状态。
1.运行态
指进程正在CPU上运行。在单CPU中,一个时刻只有一个进程处于运行态。
2.就绪态
进程获得了除CPU之外的一切所需资源,一旦获得CPU,就可以立即运行。
可能有多个进程处于就绪态,排成一个队列(当然也可以排成多个队列),称为就绪队列。
3.阻塞态
也成等待态,指进程等待某一个事件而暂停运行。如等待某个资源可用,等待IO操作等。
4.创建态
进程正在被创建,尚未转到就绪态。
创建进程步骤
1、申请一个空白PCB。
2、为进程分配运行时所需的资源。
3、初始化PCB。
4、插入就绪队列。
5.终止态
进程正在从系统中消失,可能是进程结束或其他原因退出执行。先置为终止态,在进一步处理资源释放和回收工作。
区分就绪态和阻塞态。就绪态是进程仅缺少CPU,阻塞态是进程需要其他资源(除了CPU)或等待某一事件。
进程状态转换(重点)
就绪态->运行态:获得了CPU资源。
运行态->就绪态:时间片用完,或更高优先级进程就绪。
运行态->阻塞态:请求某一资源或等待某一事件发生。
阻塞态->就绪态:进程等待的事件到来。
2.1.4进程控制
操作系统中,一般将进程控制用的程序段称为原语。
原语的特点是:执行期间不允许打断,是一个不可分割的基本单位。
1.进程的创建
子进程与父进程的关系
允许一个进程创建另一个进程,创建者称为父进程,被创建的称为子进程。
子进程可以继承父进程拥有的资源。
子进程终止时,应将其从父进程获得的资源归还给父进程。
导致进程创建的操作
终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。
创建新进程的过程
(1)为新进程分配一个唯一的进程号,申请一个空白的PCB。若PCB申请失败,则创建失败。
(2)为进程分配运行所需的资源。若资源不足,则处于创建态,等待资源。而非创建失败。
(3)初始化PCB,主要包括初始化标志信息、初始化CPU状态信息和初始化CPU控制信息,以及设置进程的优先级。
(4)若进程就绪队列能够接纳新进程,则插入就绪队列,变为就绪态,等待系统调度。
2.进程的终止
引起进程终止的事件主要有:
(1)正常结束。
(2)异常结束。
(3)外界干预。
终止进程的操作过程
(1)根据被终止进程的标识符,检索出该进程的PCB,并读出该进程的状态。
(2)若被终止进程处于运行态,则立即终止该进程的执行,将CPU分配给其他进程。
(3)若该进程还有子进程,则通常将其所有的子进程终止(但有些系统不是)。
(4)将该进程的全部资源,归还给其父进程或操作系统。
(5)将该PCB从所在队列中删除。
有些系统不允许子进程在父进程终止的情况下存在,对于这类系统,一个进程终止,则他所有子进程也终止,称为级联终止。
然而有些系统不是这样的。
3.进程的阻塞和唤醒
进程阻塞的事件与时机
正在执行的进程,由于期待的事件未发生,进程便通过调用阻塞原语(Block),是自己由运行态转为阻塞态。
可见阻塞是一种进程自身的主动行为,只有处于运行态的进程,才能转为阻塞态。
阻塞原语执行过程:
(1)找到将要被阻塞进程的标识号PID对应的PCB。
(2)若该进程为运行态,则保护现场,转为阻塞态,停止运行。
(3)将该PCB插入相应事件的等待队列,将CPU调度给其他就绪进程。
进程唤醒的事件与时机
当被阻塞进程所期待的事件出现时,由有关进程调用唤醒原语(Wakeup),将等待该事件的进程唤醒。
唤醒原语执行过程:
(1)在该事件的等待队列中找到相应进程的PCB。
(2)将其从等待队列中移除,置为就绪态。
(3)将该PCB插入就绪队列,等待调度。
Block和Wakeup原语是一对作用相反的原语,必须成对使用。
2.1.5进程的通信
进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式,主要有以下三类。
1.共享存储
在通信的进程之间存在一块可直接访问的共享空间,通过这块共享空间进行读写操作实现进程之间的信息交换。
在对共享空间进行读写操作时,需要使用同步互斥工具对共享空间的读写进行控制。
共享存储分为两种:低级方式的共享是基于数据结构的共享,高级方式的共享是基于存储区的共享。
操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换由用户自己安排读写指令完成。
进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间。
想让两个进程共享空间,必须通过特殊的系统调用实现,而进程内的线程是共享进程空间的。
简单理解就是,一个洗钱的例子,一个人A在银行柜台抢钱放进麻袋里,另一个人B从麻袋里拿钱,存进银行。A不能直接把钱给B,B也不能直接拿A手里的钱。
2.消息传递
3.管道通信
4.信号
2.1.6线程和多线程模型
1.线程的基本概念
2.线程与进程的比较
3.线程的属性
4.线程的状态和转换
5.线程的组织和控制
6.线程的实现方式
7.多线程模型
2.2CPU调度
2.2.1调度的概念
1.调度的基本概念
在多道程序系统中,进程数往往多于CPU数(个人电脑CPU一般就一个),为解决进程随意争夺CPU的情况,需要CPU调度对CPU进行合理分配。
所谓分配就是从就绪队列中按照一定的算法选择一个进程,将CPU分配给该进程使用。以此实现进程并发执行。(本章主要学习各种调度算法)。
CPU调度是多道程序操作系统的基础,是操作系统设计的核心问题。
2.调度的层次
提交一个作用到完成一般要经历三级调度。
(建议记调度名字时,记忆括号里的,更有区分度和特点)
(1)高级调度(作业调度)
按照某算法从外存上后备队列中的作业选择一个(或多个),并分配内存、IO设备等资源。并建立相应的进程,使他具备了竞争CPU的权利。
作业调度就是辅存和内存之间的调度。每个作业只调入一次,调出一次。
多道批处理系统多配置作业调度。其他系统通常没有。
(2)中级调度(内存调度)
引入内存调度的目的是提高内存利用率和系统的吞吐量(重点)。
即将那些暂时不能运行的进程调至外存等待,此时进程处于挂起态。
当具备了运行条件且内存有空位置时,由中级调度决定将那些具备条件的进程重新调入内存。修改进程为就绪态。
中级调度实际就是存储器管理的对换功能。
(3)低级调度(进程调度)
按照算法从就绪队列选择一个进程,将CPU分配给他。
进程调度是最基本的调度。
各种操作系统都必须配置这种调度。进程调度的频率很高。
至此,先前学的运行态,就绪态等及各自转换。应该和这里联系起来。理解更清晰了。
3.三级调度的联系
(1)进程调度是最基本的,不可或缺。
(2)作业调度次数最少,中级略高,进程调度最频繁。
(3)中级调度和内存联系起来,提高内存利用率。
(4)作业调度为进程做准备,进程调度为进程执行做准备。
2.2.2调度的实现
1.调度程序(调度器)
用于调度和分派CPU的组件称为调度程序。常分为三部分。(排队器、分派器、上下文切换器)
(1)排队器
将系统中所有就绪进程排成一个或多个队列,便于调度程序选择。
每当有一个进程转变为就绪态时,排队器就将其插入相应的就绪队列。
(2)分派器
将调度程序选择的进程从就绪队列取出。将CPU分配给新进程。
(3)上下文切换器(重要)
对CPU进程切换时,会发生两对上下文切换。
第一对:将当前进程上下文保存到其PCB,再装入分配程序的上下文,便于分派程序运行。
第二对:移出分派程序的上下文,将新进程的CPU现场信息装入CPU相应的寄存器。
上下文切换要进行大量保存和装载命令。即load和store,花费较多时间。
用硬件方法来优化切换时间:
2.调度的时机、切换与过程
3.进程调度的方式
4.闲逛进程
5.两种线程的调度
2.2.3调度的目标
2.2.4进程切换
2.2.5CPU调度算法(重点)
1.先来先服务调度算法
2.2.6多处理机调度
2.2.7本节小结
2.3同步与互斥(重点)
2.4死锁
为什么会产生死锁?
产生死锁的条件是什么?
解决死锁问题的方法有哪些?
2.4.1死锁的概念
1.死锁的定义
多道程序系统中,由于进程的并发性,带来了一个新的问题,即死锁。
死锁就是多个进程因为竞争资源造成的僵局,即互相等待对方手里的资源,使各个进程都被阻塞。
类似于在一个只能容纳一辆车通过的乡间小路,一头来了一个小米SU7,另一头是一辆保时捷Taycan,两辆车都想通过,谁也不让谁,最终导致僵局,即死锁。
而本章就是解决这种僵局,即避免这种情况,或者发生这种情况怎么解决。
2.死锁与饥饿
饥饿是指进程在信号量内无限等待的情况。
产生饥饿的主要原因是:分配策略在分配资源时,由于某种策略导致某进程始终分配不到资源,即长时间等待,等待时间带来影响时,即发生了饥饿,甚至是饿死。
饥饿并不表示一定会死锁,只是说明至少有一个进程的执行被无限期推迟。
饥饿和死锁的共同点是,进程都无法正常向前推进。
死锁与饥饿的差别
1、发生饥饿的进程可以只有一个,而死锁至少要两个,因为他要形成一个环的关系。
2、发生饥饿的进程可能是就绪态,即长时间等待CPU,也可能是阻塞态,等待其他资源。而死锁的进程一定是阻塞态。
3.死锁产生的原因
(1)系统资源的竞争
对不可剥夺资源(打印机)的竞争才会产生死锁。
对可剥夺资源的竞争(CPU,主存)不会产生死锁。
(2)进程推进顺序非法
请求和释放资源的顺序不当。
信号量使用不当也会造成死锁。进程中间彼此等待对方发来的消息。
4.死锁产生的必要条件
产生死锁必须同时满足四个条件,缺一就不是死锁。
(1)互斥条件。要求分配的资源在一段时间内仅为一个进程所占有。
(2)不可剥夺条件。进程获得的资源未使用完之前不可剥夺。只能是主动释放。
(3)请求并保持条件。保持了至少一个资源,又提出了新的资源请求,但该新资源已被占有了,请求进程被阻塞,但对获得的资源不释放。
(4)循环等待条件。一个资源的循环等待链。每个进程获得的资源又被下一个进程请求。
循环等待条件和死锁
直观上,循环等待条件似乎就是死锁的定义。其实不然。
但死锁要求的循环等待条件更严格。
循环等待是死锁的必要条件。
不可剥夺条件和请求并保持条件
不可剥夺条件就是:我的东西你不能拿走。
请求并保持条件是:我的东西你不能拿走,我还可以再拿你的东西。
5.死锁的处理策略
为了不发生死锁,必须破坏死锁的四个条件之一。或者允许死锁发生,但发生后可以及时发现并处理。
(1)死锁预防。破坏死锁的四个必要条件之一或之多个。
(2)避免死锁。防止死锁进入不安全状态,著名的银行家算法。
(3)死锁的检测及解除。允许死锁发生,可以及时发现处理。
预防死锁和避免死锁都是在死锁发生前做的,
但预防死锁的限制条件较严格,实现简单,但会导致系统效率低。
避免死锁限制条件宽松,通过算法判断是否是不安全状态,实现复杂。
2.4.2死锁预防
预防死锁只要破坏四个必要条件之一就行。
1.破坏互斥条件。
将只能互斥使用的资源改为可共享使用。
但有些资源是只能互斥使用的,此方法不太可行,为了系统安全,要保留这种互斥行。
2.破坏不可剥夺条件。
当保持了一些不可剥夺资源的进程,请求新的资源得不到满足时,必须释放已保持的所有资源。
实现起来较复杂,释放已获得资源,说明之前做的全部无效,可以用于状态较容易保存和恢复的资源,如CPU的寄存器及内存资源。反复申请和释放导致增加系统开销,降低系统吞吐量。
3.破坏请求并保持条件。
要求进程在请求资源时,不能持有不可剥夺资源。有两种方法。
(1)预先静态分配方法。在进程运行前,一次性申请完所需要的全部资源。在运行期间破坏了请求条件,在等待期间破坏了保持条件。
(2)允许进程只获得运行初期所需的资源后,便可以开始运行。在运行过程逐步释放已分配且用完的全部资源后,才能申请新的资源。
方法一实现简单,但系统资源严重浪费,会导致饥饿。
方法二改进了这些缺点。
4.破坏循环等待条件。
为了破坏循环等待条件,采用顺序资源分配法。