【408--考研复习笔记】操作系统----知识点速览
目录
一、计算机系统概述
1.计算机系统的组成
2.操作系统的定义与作用
3.操作系统的发展历程
4.操作系统的基本特性
5.操作系统的结构
简单结构
分层结构
微内核结构
模块化结构
宏内核结构
6.用户接口
7.系统调用
8.处理机的工作状态
9.中断机制
10.特权指令与非特权指令
二、进程与线程
1.进程的概念
2.进程的状态与转换
3.进程控制块(PCB)
3.1 进程控制
4.进程同步与互斥
实现进程互斥的方法
硬件方法
软件方法
互斥锁
信号量
5.进程通信
共享内存
消息传递
管道
套接字(Socket)
信号
6.线程
用户级线程
内核级线程
7.进程调度
主要任务
调度概念
调度实现
调度目标
进程切换
常见调度算法
先来先服务(FCFS)调度算法
短进程优先(SPF)调度算法
时间片轮转调度算法
优先级调度算法
多级队列调度算法
多级反馈队列调度算法
基于公平的调度算法
8.多处理器调度
9.死锁
产生死锁的原因
产生死锁的必要条件
死锁处理方式比较
预防死锁
避免死锁
检测死锁
三、内存管理
四、文件管理
五、输入输出系统
一、计算机系统概述
1.计算机系统的组成
请简述计算机系统由哪些部分组成。
- 硬件系统:是计算机系统的物理实体,由各种电子、机械和光电元件等组成,是计算机进行工作的物质基础,主要包括以下几个部分:
- 运算器:又称算术逻辑单元(ALU),是计算机中进行算术运算和逻辑运算的部件,能对数据进行加、减、乘、除等基本算术运算,以及与、或、非等逻辑运算。
- 控制器:是计算机的指挥中心,负责协调和控制计算机各部件按照指令的要求进行工作。它从内存中取出指令,分析指令的操作码和地址码,然后根据指令的要求向其他部件发出控制信号,使计算机有条不紊地执行程序。
- 存储器:用于存储程序和数据。可分为主存储器(内存)和辅助存储器(外存)。内存直接与 CPU 进行数据交换,速度快但容量相对较小,用于暂时存放正在运行的程序和数据;外存则用于长期存储大量的数据和程序,如硬盘、光盘、U 盘等,其容量大但速度相对较慢。
- 输入设备:是向计算机输入数据和信息的设备,如键盘、鼠标、扫描仪、摄像头等。它将人们熟悉的信息形式转换为计算机能够识别和处理的二进制代码,送入计算机内存。
- 输出设备:用于将计算机处理后的结果以人们能够理解的形式输出,如显示器、打印机、音箱等。它将计算机内部的二进制数据转换为字符、图像、声音等形式,呈现给用户。
- 软件系统:是指计算机系统中的程序、数据以及相关的文档资料的集合,用于管理和控制计算机硬件,实现各种功能,为用户提供操作界面和应用环境。软件系统可分为系统软件和应用软件两大类:
- 系统软件:是管理和控制计算机硬件与软件资源的程序,是计算机系统的基础软件,主要包括操作系统、语言处理程序、数据库管理系统、系统服务程序等。其中,操作系统是系统软件的核心,用于管理计算机的硬件资源和软件资源,为用户和应用程序提供接口和服务;语言处理程序用于将高级语言编写的源程序翻译成计算机能够执行的机器语言程序;数据库管理系统用于管理和组织数据,方便用户进行数据的存储、查询、修改等操作。
- 应用软件:是为了满足用户的特定需求而开发的软件,如办公软件(Word、Excel、PowerPoint 等)、图形图像处理软件(Photoshop、Illustrator 等)、游戏软件、财务管理软件、教学软件等。应用软件运行在系统软件之上,依赖于系统软件提供的支持来实现其功能。
说明硬件系统和软件系统各自包含的主要部件或成分,并阐述它们之间的关系。
硬件系统和软件系统是计算机系统中相互依存、相互作用的两个重要组成部分,它们之间的关系主要体现在以下几个方面:
- 硬件是软件的基础:硬件为软件提供了运行的物质基础,没有硬件,软件就无法运行。软件的所有功能都依赖于硬件来实现,例如,操作系统需要运行在特定的硬件平台上,应用软件需要通过硬件的运算器、控制器等部件来执行指令和处理数据。
- 软件是硬件的灵魂:软件赋予了硬件以生命力和功能。没有软件,硬件只是一堆毫无意义的电子元件和机械装置,无法发挥任何实际作用。软件通过指令来控制硬件的运行,实现各种复杂的功能,满足用户的不同需求。例如,操作系统通过对硬件资源的管理和调度,使得计算机能够高效、稳定地运行;应用软件则利用硬件的能力,为用户提供各种具体的服务和功能,如图形图像处理、文档编辑、游戏娱乐等。
- 相互促进、协同发展:硬件技术的发展会推动软件技术的进步,例如硬件性能的提升使得软件能够处理更复杂的任务、实现更丰富的功能、具有更好的用户体验。同时,软件的发展也会对硬件提出新的要求,促使硬件技术不断创新和改进。例如,随着虚拟现实(VR)和人工智能等软件技术的发展,对硬件的图形处理能力、计算能力等提出了更高的要求,从而推动了显卡、CPU 等硬件设备的不断升级。
2.操作系统的定义与作用
什么是操作系统?它在计算机系统中扮演着怎样的角色?
操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机系统的核心与基础。它是用户和计算机硬件之间的接口,同时也是计算机系统资源的管理者。
操作系统在计算机系统中扮演着以下重要角色:
- 用户与计算机硬件的接口:操作系统为用户提供了一个方便、友好的操作界面,使用户能够通过各种方式(如命令行、图形界面等)与计算机进行交互。用户无需了解计算机硬件的复杂细节,只需通过操作系统提供的接口发出指令,操作系统就会将这些指令转换为对硬件的具体操作,从而实现用户的需求。例如,用户通过鼠标点击打开一个应用程序,操作系统会负责加载程序到内存,并协调 CPU、内存、硬盘等硬件资源来运行该程序。
- 计算机系统资源的管理者:计算机系统包含多种资源,如 CPU、内存、外存、输入输出设备等。操作系统负责对这些资源进行合理的分配、调度和管理,以提高资源的利用率和系统的整体性能。例如,在多个程序同时运行时,操作系统会根据一定的算法为每个程序分配 CPU 时间片,使它们能够轮流执行,从而实现多任务处理;同时,操作系统还会管理内存的分配和回收,确保各个程序能够安全、高效地使用内存空间。
- 提供公共服务:操作系统为应用程序提供了一系列的公共服务,如文件管理、进程管理、设备管理等。应用程序可以通过调用操作系统提供的接口来使用这些服务,从而简化应用程序的开发过程。例如,应用程序需要读取或写入文件时,无需了解硬盘的物理结构和读写原理,只需调用操作系统提供的文件操作函数,操作系统就会完成文件的打开、读写、关闭等操作。
- 控制程序的执行:操作系统负责控制程序的启动、执行和终止。它会检查程序的合法性和安全性,为程序创建运行环境,包括分配内存空间、加载程序代码等。在程序执行过程中,操作系统会监控程序的运行状态,处理程序可能出现的错误和异常情况,并在程序执行结束后回收程序占用的资源。
操作系统有哪些主要功能?请分别举例说明这些功能是如何为用户和计算机系统提供服务的。
操作系统具有处理器管理、存储器管理、设备管理、文件管理和用户接口等主要功能,以下是这些功能及其为用户和计算机系统提供服务的具体说明:
- 处理器管理
- 功能:主要负责对 CPU 资源进行分配和调度,确保多个程序能够合理、高效地共享 CPU。包括进程控制、进程调度等。
- 服务方式:在多任务环境下,比如用户同时打开浏览器浏览网页、使用办公软件编辑文档,操作系统会为每个任务分配 CPU 时间片。通过进程调度算法,如时间片轮转算法,让各个进程轮流使用 CPU,使这些任务看起来是同时进行的,提高了 CPU 的利用率,也方便用户同时进行多项工作。
- 存储器管理
- 功能:负责内存空间的分配、回收和保护,以及内存的扩充等。
- 服务方式:当用户运行一个程序时,操作系统会为该程序分配足够的内存空间来存储其代码和数据。例如,在运行大型游戏时,操作系统会将游戏程序和相关资源加载到内存中,并确保不同程序之间的内存空间相互隔离,防止数据冲突和非法访问,保证了系统的稳定性和安全性。同时,操作系统还通过虚拟内存技术,将一部分外存空间模拟成内存使用,当内存空间不足时,把暂时不用的数据和程序交换到外存上,需要时再调入内存,从而为用户提供了比实际物理内存更大的可用空间。
- 设备管理
- 功能:负责管理计算机的各种输入输出设备,包括设备的分配、驱动和控制等。
- 服务方式:以打印机为例,当用户在应用程序中选择打印文档时,操作系统会将打印任务发送到打印机队列中,并根据打印机的状态和任务优先级,合理安排打印任务的执行顺序。操作系统还会为打印机提供相应的驱动程序,使打印机能够与计算机系统进行通信,实现正确的打印功能。对于其他设备,如鼠标、键盘等,操作系统也会实时接收它们的输入信号,并将其转换为计算机能够理解的指令,方便用户与计算机进行交互。
- 文件管理
- 功能:负责对计算机系统中的文件和目录进行管理,包括文件的存储、检索、共享和保护等。
- 服务方式:用户可以通过操作系统提供的文件管理工具,如资源管理器,方便地创建、删除、复制、移动文件和文件夹。例如,用户想要将一些照片整理到一个新的文件夹中,就可以在资源管理器中进行相应的操作。操作系统会将文件存储在硬盘等存储设备上,并通过文件系统的索引结构,快速准确地检索到用户需要的文件。同时,操作系统还可以设置文件的访问权限,如只读、读写等,保护文件的安全性和完整性,防止未经授权的用户访问和修改文件。
- 用户接口
- 功能:为用户提供与操作系统进行交互的界面和方式,包括命令行接口和图形用户接口等。
- 服务方式:图形用户接口(GUI)如 Windows 操作系统的桌面环境,用户通过鼠标点击图标、菜单等直观的方式来操作计算机,启动应用程序、进行文件管理等。例如,用户只需双击桌面上的浏览器图标,就可以快速启动浏览器访问互联网。命令行接口则适合专业用户和程序员,他们可以通过输入命令来精确控制计算机的操作。例如,在 Linux 系统中,用户可以通过命令行输入指令来安装软件、配置系统参数等。这两种接口方式都为用户提供了便捷的操作途径,满足了不同用户的需求。
3.操作系统的发展历程
请简要描述操作系统从诞生到现在经历了哪些主要阶段,每个阶段的特点是什么?
- 手工操作阶段
- 时间:20 世纪 40 年代中期到 50 年代中期。
- 特点:此阶段计算机没有操作系统,用户直接操作计算机硬件。程序员需用机器语言编写程序,通过控制台的开关和指示灯来输入程序和数据,计算结果也以同样方式输出。操作过程繁琐、效率低下,且计算机资源利用率极低。
- 批处理系统阶段
- 时间:20 世纪 50 年代中期到 60 年代中期。
- 特点:为提高计算机资源利用率,出现了批处理系统。它将用户作业成批地提交给计算机,由操作系统自动依次处理。早期的单道批处理系统每次只允许一个作业在内存中运行,作业执行完后再调入下一个作业。后来发展为多道批处理系统,可同时将多个作业放入内存,让它们交替使用 CPU 和其他资源,大大提高了系统的吞吐量和资源利用率,但作业的周转时间较长,用户无法与正在运行的作业进行交互。
- 分时系统阶段
- 时间:20 世纪 60 年代中期到 70 年代中期。
- 特点:分时系统允许多个用户通过终端同时使用一台计算机,操作系统采用时间片轮转的方式为每个用户分配 CPU 时间。每个用户感觉自己独占计算机,能及时得到系统响应,实现了人机交互。分时系统的出现极大地提高了计算机的使用效率,促进了计算机的普及。
- 实时系统阶段
- 时间:20 世纪 60 年代末开始出现并逐渐发展。
- 特点:实时系统主要用于对外部事件进行实时响应和处理的场景,如工业控制、航空航天、军事等领域。它要求系统能在严格的时间限制内完成任务,具有高可靠性和高实时性。实时系统分为硬实时系统和软实时系统,硬实时系统必须在规定的时间内完成任务,否则会导致严重后果;软实时系统则允许在一定程度上超过截止时间,但也需尽量保证任务的及时完成。
- 现代操作系统阶段
- 时间:20 世纪 80 年代至今。
- 特点:现代操作系统融合了批处理、分时、实时等系统的特点,同时具备了更强大的功能和更好的用户体验。操作系统的种类日益丰富,包括桌面操作系统、服务器操作系统、移动操作系统等,以满足不同设备和应用场景的需求。此外,现代操作系统还支持多用户、多任务、多线程,具有完善的文件系统、网络功能、图形化界面等,并且在安全性、稳定性和可扩展性方面有了很大的提升。
列举一些在操作系统发展过程中具有重要意义的操作系统,并说明它们的主要贡献。
在操作系统发展历程中,有许多具有重要意义的操作系统,以下为你列举一些:
- 批处理系统
- IBM 7090/7094 的监督程序3:是脱机批处理系统的代表,它极大缓解了人机矛盾及主机与外设的矛盾,是现代操作系统的原型。其主要贡献是实现了作业到作业的自动转接,减少了作业建立时间和手工操作时间,提高了计算机的利用率。
- 分时系统
- CTSS(Compatible Time-Sharing System)1:是最早的分时操作系统之一,它允许多个用户通过终端同时访问计算机,每个用户感觉自己独占计算机资源。其主要贡献是开创了分时系统的先河,为多用户操作系统的发展奠定了基础。
- MULTICS(Multiplexed Information and Computing Service)1:是一个具有重大影响力的分时操作系统,它引入了许多先进的概念和技术,如虚拟内存、进程管理、文件系统等,对后来的操作系统产生了深远的影响。
- 个人计算机时代的操作系统
- DOS(Disk Operating System)2:是个人计算机时代最具代表性的操作系统之一,它是单用户、单任务操作系统,主要用于 IBM PC 及其兼容机。其主要贡献是开启了 DOS 统治桌面操作系统的时代,为个人计算机的普及和应用做出了重要贡献。
- UNIX1:是一个强大的多用户、多任务操作系统,它具有良好的稳定性、安全性和可移植性,被广泛应用于服务器、工作站和大型计算机等领域。其主要贡献是为后来的操作系统提供了许多重要的概念和技术,如进程管理、内存管理、文件系统等。
- 图形用户界面(GUI)的操作系统
- Windows2:是微软公司推出的一款图形化操作系统,它具有友好的用户界面、丰富的应用程序和强大的功能,被广泛应用于个人计算机和服务器等领域。其主要贡献是推动了图形用户界面的普及和应用,使计算机更加易于使用和操作。
- Mac OS1:是苹果公司推出的一款图形化操作系统,它具有简洁、美观的用户界面和强大的多媒体功能,被广泛应用于苹果电脑和移动设备等领域。其主要贡献是为用户提供了一种高品质的计算体验,推动了苹果公司的发展和壮大。
- 互联网时代的操作系统
- Linux1:是一个开源的多用户、多任务操作系统,它具有良好的稳定性、安全性和可移植性,被广泛应用于服务器、工作站和嵌入式系统等领域。其主要贡献是推动了开源运动的发展,为用户提供了一种自由、开放的操作系统选择。
- Android1:是谷歌公司推出的一款开源移动操作系统,它具有丰富的应用程序和强大的功能,被广泛应用于智能手机和平板电脑等移动设备。其主要贡献是推动了移动互联网的发展,为用户提供了一种便捷、高效的移动计算体验。
4.操作系统的基本特性
操作系统的四个基本特性是什么?请分别解释其含义。
操作系统的四个基本特性是并发、共享、虚拟和异步,以下是对它们含义的解释:
- 并发
- 含义:指两个或多个事件在同一时间间隔内发生。在操作系统中,并发是指多个程序或任务在同一时间段内同时执行。例如,用户在使用计算机时,可以同时打开多个应用程序,如浏览器、文档编辑器、音乐播放器等,这些应用程序看似在同时运行,实际上是通过操作系统的调度,在 CPU 上交替执行,使得用户感觉它们是并发执行的。
- 共享
- 含义:即系统中的资源可供内存中多个并发执行的进程共同使用。根据资源的不同特性,共享方式可分为互斥共享和同时共享。
- 互斥共享:有些资源在一段时间内只允许一个进程访问,例如打印机,当一个进程正在使用打印机进行打印时,其他进程必须等待,直到该进程使用完毕释放打印机资源。
- 同时共享:有些资源允许多个进程同时访问,例如磁盘文件,多个进程可以同时读取同一个文件,或者在不同的位置同时对文件进行读写操作。
- 虚拟
- 含义:是指通过某种技术把一个物理实体变为若干个逻辑上的对应物。在操作系统中,虚拟技术主要有两种形式,即时分复用技术和空分复用技术。
- 时分复用:例如处理器的分时复用,通过时间片轮转的方式,把处理器的时间划分成多个时间片,轮流分配给多个进程使用,使得每个进程都能在一段时间内获得处理器的使用权,就好像每个进程都有一个独立的处理器一样。
- 空分复用:例如虚拟内存技术,它将物理内存和外存(如硬盘)结合起来,为每个进程提供了一个比实际物理内存大得多的虚拟地址空间,使得进程可以认为自己拥有足够大的内存空间来运行,而实际上数据可能部分存放在物理内存中,部分存放在外存中,操作系统会在需要时自动进行数据的换入换出。
- 异步
- 含义:在多道程序环境下,允许多个进程并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进。例如,一个进程在执行过程中可能需要等待 I/O 操作完成,或者等待获取某个资源,在等待期间,操作系统会调度其他进程执行,当等待的条件满足后,该进程才能继续执行。因此,每个进程的执行时间和顺序都是不确定的,这就是操作系统的异步性。
以某个具体的操作系统为例,说明它是如何体现这些特性的。
以 Windows 操作系统为例,其对操作系统的四大基本特性体现如下:
- 并发
- 多任务处理:用户可以同时打开多个应用程序,如同时运行浏览器、文档编辑软件、音乐播放器等。操作系统会在后台对这些程序进行调度,使它们能够交替占用 CPU 时间,从而实现多个任务看似同时进行。例如,用户在浏览网页的同时,可以让音乐播放器在后台播放音乐,还能在文档编辑软件中进行文字编辑工作1。
- 进程和线程管理:Windows 操作系统支持多进程和多线程。每个应用程序通常作为一个独立的进程运行,而进程内部又可以有多个线程。操作系统通过对进程和线程的管理,实现了并发执行。例如,一个浏览器进程可能包含多个线程,如负责页面渲染的线程、处理网络请求的线程等,这些线程可以同时工作,提高了浏览器的运行效率1。
- 共享
- 互斥共享:某些硬件资源如打印机,在同一时间只能被一个进程使用。当一个进程正在使用打印机进行打印时,其他进程需要等待。Windows 操作系统通过对打印机的管理,确保在任何时刻只有一个进程能够访问打印机资源,实现了互斥共享1。
- 同时共享:硬盘是可以被多个进程同时共享的资源。多个应用程序可以同时从硬盘中读取数据或向硬盘中写入数据。例如,用户可以同时从不同的应用程序中保存文件到硬盘,或者同时从硬盘中打开多个文件进行读取操作1。
- 虚拟
- 虚拟内存:Windows 操作系统支持虚拟内存技术,它将物理内存和硬盘空间结合起来,为每个进程提供了一个比实际物理内存大得多的虚拟地址空间。进程可以在这个虚拟地址空间中自由地分配和使用内存,而不必担心实际物理内存的限制。当物理内存不足时,操作系统会自动将一部分不常用的数据从物理内存交换到硬盘上的虚拟内存中,以腾出空间给其他需要使用物理内存的进程。这样,用户可以同时运行多个占用内存较大的程序,而不会因为物理内存不足而导致系统崩溃1。
- 虚拟设备:Windows 操作系统还可以通过虚拟设备驱动程序(VDD)模拟出一些虚拟设备,如虚拟打印机、虚拟光驱等。这些虚拟设备可以像真实设备一样被应用程序使用,为用户提供了更多的灵活性和便利性。例如,用户可以通过虚拟打印机将文档打印到一个虚拟的文件中,而不必真正连接一台物理打印机。
- 异步
- 进程执行的不确定性:在 Windows 操作系统中,由于多个进程可以并发执行,并且它们之间可能存在资源竞争和相互依赖关系,因此每个进程的执行时间和顺序都是不确定的。一个进程可能会因为等待某个资源而被阻塞,也可能会因为其他进程的执行而被抢占 CPU 时间。例如,当一个进程正在进行文件读写操作时,可能会因为硬盘繁忙而被阻塞,直到硬盘完成操作后才能继续执行1。
- 事件驱动的编程模型:Windows 操作系统采用了事件驱动的编程模型,应用程序通过响应各种事件来进行交互。这些事件可以是用户输入、系统消息、定时器中断等。应用程序在等待事件发生时,不会阻塞整个系统,而是可以继续执行其他任务。当事件发生时,操作系统会通知相应的应用程序,应用程序再根据事件的类型进行相应的处理。例如,当用户点击鼠标或按下键盘按键时,操作系统会产生相应的事件,并将其发送给当前具有焦点的应用程序,应用程序接收到事件后会进行相应的处理,如打开菜单、移动窗口、输入文字等。
5.操作系统的结构
操作系统有哪些常见的结构?请简述每种结构的特点和优缺点。
操作系统常见的结构有简单结构、分层结构、微内核结构、模块化结构和宏内核结构,以下是它们的特点以及优缺点:
简单结构
- 特点:早期操作系统常采用,无清晰结构设计,代码按功能随意组织,整体较为混乱。
- 优点:实现简单,开发成本低,适用于功能简单、资源有限的小型系统。
- 缺点:可维护性差,随着系统功能增加,代码变得难以理解和修改;可靠性低,一个模块出错可能导致整个系统崩溃;扩展性不足,难以添加新功能和支持新硬件。
分层结构
- 特点:将操作系统划分为多个层次,每层都建立在下层之上,各层有明确的功能和接口,下层为上层提供服务。
- 优点:系统结构清晰,易于理解和维护,每层的功能相对独立,修改某一层不会影响其他层;有利于系统的设计和实现,可按层次逐步进行开发和调试;增强了系统的可扩展性,新增功能可在相应层次中实现。
- 缺点:层次划分困难,若划分不合理,可能导致层间通信复杂,影响系统效率;由于需要通过多层接口进行通信,会带来一定的性能开销。
微内核结构
- 特点:内核只提供最基本的功能,如进程管理、内存管理、中断处理等,其他功能如文件系统、网络协议等以服务器进程的形式运行在用户空间。
- 优点:内核小巧,可靠性高,便于移植到不同的硬件平台;具有良好的可扩展性,可方便地添加新功能,只需增加相应的服务器进程;安全性强,用户进程和系统服务相互隔离,一个服务出错不会影响整个系统。
- 缺点:由于用户进程和系统服务之间的通信频繁,会带来一定的性能损失;系统实现复杂,需要精心设计进程间通信机制。
模块化结构
- 特点:将操作系统划分为多个功能模块,每个模块具有独立的功能,模块之间通过清晰的接口进行通信和协作。
- 优点:具有较高的可维护性和可扩展性,可独立开发、测试和替换模块,便于团队开发;系统的功能可以根据需要灵活组合,提高了系统的适应性。
- 缺点:模块划分需要谨慎,若划分不合理,可能导致模块间耦合度高,影响系统性能;模块之间的通信和协调可能较为复杂,需要良好的接口设计。
宏内核结构
- 特点:内核包含了丰富的功能,如进程管理、内存管理、文件系统、设备驱动等,这些功能都在内核空间中实现,形成一个庞大的整体。
- 优点:由于所有功能都在内核中,模块之间的通信效率高,能有效利用系统资源,提供较好的性能。
- 缺点:内核庞大复杂,可维护性差,一个小的改动可能影响整个系统;可靠性较低,内核中任何一个模块出错都可能导致系统崩溃;扩展性有限,添加新功能可能需要对内核进行较大的修改。
现代操作系统为什么大多采用分层结构或微内核结构?
现代操作系统大多采用分层结构或微内核结构,主要是因为这两种结构在可维护性、可扩展性、可靠性和安全性等方面具有明显优势,能够更好地满足现代操作系统复杂功能和多样化应用场景的需求。具体原因如下:
分层结构
-
良好的可维护性:分层结构将操作系统划分为多个层次,每层功能相对独立。当需要对系统进行维护或修改时,开发人员可以专注于特定层次,降低了对整个系统的影响,便于理解和管理系统代码。
-
方便的扩展性:各层之间通过明确的接口进行通信,新增功能可以在相应层次中实现,不会对其他层次造成太大干扰。这使得操作系统能够方便地添加新特性、支持新硬件或引入新的服务。
-
便于系统设计与实现:分层结构有利于将复杂的操作系统设计任务分解为多个相对简单的子任务,按照层次逐步进行开发和调试,降低了系统开发的难度,提高了开发效率。
微内核结构
-
高可靠性:微内核只提供最基本的核心功能,如进程管理、内存管理和中断处理等,内核代码量小,因此出现错误的概率较低。即使某个服务进程出现故障,也不会影响整个系统的运行,只会影响到该服务对应的功能,系统的可靠性得到增强。
-
良好的可扩展性:微内核结构便于添加新功能。由于大多数功能都以服务器进程的形式运行在用户空间,开发人员可以方便地增加新的服务器进程来实现新功能,而无需修改内核代码,这使得操作系统能够快速适应不断变化的应用需求和技术发展。
-
方便的移植性:微内核小巧且与硬件相关的部分集中在少数底层模块中,因此更容易将操作系统移植到不同的硬件平台上。只需对与硬件相关的少量代码进行修改,就可以让操作系统在新的硬件环境中运行,提高了操作系统的通用性和可适应性。
-
增强的安全性:微内核结构中,用户进程和系统服务相互隔离,每个进程都有自己独立的地址空间。这种隔离机制可以有效防止用户进程对系统内核和其他关键服务的非法访问和破坏,提高了系统的安全性和稳定性。
6.用户接口
操作系统提供了哪些用户接口?它们各有什么特点和适用场景?
操作系统提供的用户接口主要有命令行接口、图形用户接口和系统调用接口,以下是它们的特点和适用场景:
命令行接口(CLI)
-
特点
-
高效性:熟练掌握命令后,能快速完成各种任务,尤其适合批量处理和自动化操作。
-
灵活性:可通过组合不同命令和参数,实现复杂的功能,满足高级用户的个性化需求。
-
简洁性:无需图形界面支持,占用系统资源少,在资源有限的设备或服务器环境中优势明显。
-
学习成本高:需要记忆大量命令和参数,对初学者不友好。
-
-
适用场景
-
服务器管理:系统管理员通过命令行远程管理服务器,进行系统配置、服务启动 / 停止、文件管理等操作。
-
批量处理任务:如编写脚本批量重命名文件、批量安装软件等。
-
系统故障排查:在图形界面无法正常启动或出现故障时,通过命令行检查系统日志、修复文件系统等。
-
图形用户接口(GUI)
-
特点
-
直观性:以图形化的图标、菜单、窗口等元素呈现信息和操作选项,用户通过鼠标点击即可完成操作,无需记忆复杂的命令,易于上手。
-
交互性强:支持多任务处理,用户可同时打开多个窗口并在不同任务之间快速切换,方便进行各种操作。
-
美观性:具有丰富的视觉效果和个性化设置选项,能提供良好的用户体验。
-
资源占用较大:需要较多系统资源来支持图形界面的运行,在一些低配置设备上可能运行缓慢。
-
-
适用场景
-
日常办公:如使用办公软件、浏览网页、观看视频等,图形界面提供了便捷的操作方式。
-
图形设计与多媒体处理:设计师和多媒体工作者通过图形界面的专业软件进行图像、视频编辑等工作,方便直观地进行操作和效果预览。
-
普通用户使用:适合大多数非专业用户,满足他们日常使用计算机进行各种娱乐、学习和简单工作的需求。
-
系统调用接口
-
特点
-
功能性强:是操作系统提供给应用程序的接口,应用程序通过系统调用请求操作系统提供各种服务,如文件读写、进程创建、内存分配等,能直接访问硬件和系统资源。
-
编程性:需要通过编程语言来调用,对开发者要求较高,需要了解操作系统的相关知识和编程接口。
-
高效性:系统调用经过优化,能快速实现应用程序与操作系统之间的交互,保证系统的稳定性和安全性。
-
-
适用场景
-
软件开发:开发人员在编写应用程序时,通过系统调用接口实现各种功能,如开发数据库管理系统、网络应用程序等。
-
系统定制与开发:对于一些特殊需求的系统,如嵌入式系统、实时操作系统等,开发人员可以通过系统调用接口对操作系统进行定制和开发,以满足特定的应用需求。
-
命令行接口和图形用户接口在实现原理上有什么不同?
命令行接口(CLI)和图形用户接口(GUI)在实现原理上存在多方面的不同,主要体现在用户输入处理、界面呈现方式以及交互逻辑等方面,具体如下:
用户输入处理
-
命令行接口:主要通过字符输入来接收用户指令。用户在命令提示符后输入特定的命令字符串,然后由命令解释器对输入的字符串进行解析。命令解释器会按照预定的语法规则,将输入的命令分解为不同的部分,如命令名称、参数等,然后根据命令名称查找相应的命令处理程序,并将参数传递给该程序来执行相应的操作。
-
图形用户接口:通过鼠标、键盘等多种输入设备来接收用户输入。对于鼠标输入,系统会监测鼠标的位置、点击事件(如左键单击、右键单击、双击等)以及鼠标滚轮的滚动等操作。当鼠标点击某个图形元素(如按钮、菜单等)时,操作系统会根据该图形元素的位置和对应的事件处理程序来确定用户的操作意图。对于键盘输入,除了常规的字符输入外,还包括快捷键的处理等。操作系统会将键盘输入与当前具有焦点的图形元素相关联,以确定如何处理输入的字符或快捷键。
界面呈现方式
-
命令行接口:以字符形式在终端中显示信息。通常按照一定的格式输出文本内容,如命令的执行结果、系统提示信息等。界面的布局和样式相对简单,主要由文本行组成,用户通过阅读文本信息来了解系统的状态和操作结果。
-
图形用户接口:基于图形绘制技术,使用窗口、图标、菜单、按钮等图形元素来呈现界面。操作系统通过图形引擎在屏幕上绘制这些图形元素,并根据用户的操作动态地更新界面。界面的布局和设计更加灵活多样,注重视觉效果和用户体验,用户可以直观地通过图形元素来识别和操作各种功能。
交互逻辑
-
命令行接口:交互逻辑较为简单直接,用户输入命令后,等待系统执行并返回结果。命令的执行是顺序进行的,用户需要按照一定的顺序输入一系列命令来完成复杂的任务。如果命令输入错误或参数不正确,系统会返回相应的错误提示,用户需要根据提示重新输入命令。
-
图形用户接口:交互逻辑更加复杂和灵活。用户可以通过鼠标点击、拖动等操作与多个图形元素进行交互,操作的顺序和方式更加自由。例如,用户可以同时打开多个窗口,并在不同窗口之间进行切换、调整大小、复制粘贴等操作。此外,图形用户接口还支持事件驱动的编程模型,即当用户触发某个事件(如点击按钮)时,相应的事件处理程序会被调用,从而实现各种复杂的交互功能。
7.系统调用
什么是系统调用?它的作用是什么?
系统调用是操作系统提供给应用程序的一组接口,应用程序通过这些接口来请求操作系统内核提供服务。
作用
- 访问硬件资源:应用程序通常不能直接访问硬件,如磁盘、网络接口等。通过系统调用,应用程序可以请求操作系统代表它与硬件进行交互。例如,应用程序通过系统调用向磁盘写入数据,操作系统会负责将数据从应用程序的缓冲区传输到磁盘的指定位置。
- 管理系统资源:操作系统负责管理系统中的各种资源,如内存、进程、文件等。系统调用允许应用程序请求操作系统分配或释放这些资源。比如,应用程序通过系统调用申请内存空间来存储数据,或者创建新的进程来执行特定任务。
- 实现进程控制:系统调用提供了对进程的控制功能,如创建进程、终止进程、暂停进程、恢复进程执行等。应用程序可以利用这些系统调用来管理自身的进程,或者与其他进程进行协作。
- 文件管理操作:应用程序需要进行文件的创建、打开、关闭、读写等操作。系统调用为应用程序提供了统一的接口来执行这些文件管理任务,操作系统会根据应用程序的请求,按照文件系统的规则来操作文件。
- 提供安全机制:系统调用可以实现安全控制,确保只有授权的应用程序能够访问敏感资源。操作系统通过系统调用对应用程序的请求进行权限检查,防止应用程序非法访问系统资源,从而保障系统的安全性和稳定性。
请描述系统调用的一般过程,包括用户程序如何发起系统调用,操作系统如何响应和处理系统调用,以及调用结束后如何返回用户程序。
系统调用的一般过程如下:
用户程序发起系统调用
-
用户程序在执行过程中,当需要操作系统提供服务时,会通过特定的指令来发起系统调用。通常,这些指令会将系统调用的编号以及相关参数传递给操作系统。例如,在 x86 架构中,int 0x80 指令常被用于发起系统调用,其中 0x80 是系统调用的中断号。在传递参数时,一般会按照约定将参数存储在特定的寄存器中,不同的系统调用编号对应着不同的功能,参数则是该功能所需的输入数据。
操作系统响应和处理系统调用
-
中断处理:当用户程序发起系统调用指令后,CPU 会根据中断号跳转到相应的中断处理程序。这个中断处理程序是操作系统内核的一部分,它负责保存当前进程的上下文信息,包括程序计数器、寄存器的值等,以便在系统调用结束后能够恢复进程的执行。
-
系统调用处理:操作系统根据系统调用编号查找对应的系统调用处理函数。这个函数会根据传入的参数执行相应的操作,可能涉及到访问硬件资源、管理系统资源、进行进程控制等。例如,如果是文件读取的系统调用,处理函数会根据文件描述符和读取参数,从文件系统中读取相应的数据,并将数据存储到用户程序指定的缓冲区中。在处理系统调用的过程中,操作系统可能会进行一系列的检查和验证,以确保系统调用的合法性和安全性,如检查用户的权限是否足够执行该操作等。
返回用户程序
-
恢复上下文:当系统调用处理完成后,操作系统会恢复之前保存的进程上下文信息,将寄存器的值恢复到系统调用前的状态,并将程序计数器设置为系统调用后的下一条指令地址。
-
返回结果:操作系统将系统调用的结果通过特定的方式返回给用户程序。通常,返回结果会存储在某个寄存器中,用户程序可以通过读取该寄存器来获取系统调用的执行结果。例如,如果是文件读取的系统调用,返回结果可能是实际读取到的字节数,或者是一个表示错误代码的值,用于指示系统调用是否成功执行以及失败的原因。
通过这样的过程,用户程序能够安全、高效地利用操作系统提供的各种服务,而操作系统也能够对系统资源进行统一的管理和控制,确保系统的稳定性和安全性。
8.处理机的工作状态
大多数操作系统的内核包含4方面内容
1.时钟管理
2.中断机制
3.原语
4.系统控制的数据结构极其处理
处理机有哪些工作状态?它们是如何划分的?
处理机主要有用户态(目态)和核心态(管态)两种工作状态,具体划分依据如下:
- 指令权限:
- 核心态:在此状态下,处理机可以执行指令系统中的所有指令,包括特权指令。特权指令是指那些只能由操作系统内核执行的指令,如设置时钟、清内存、启动设备等,这些指令涉及到对系统资源的直接访问和控制。
- 用户态:处于用户态时,处理机只能执行非特权指令。用户程序通常在用户态下运行,这样可以防止用户程序随意访问和修改系统资源,保证系统的稳定性和安全性。例如,用户程序不能直接通过指令来启动或停止硬件设备,也不能随意修改系统的关键数据结构。
- 资源访问权限:
- 核心态:拥有对系统所有资源的访问权限,包括内存、外设、寄存器等。操作系统内核在核心态下可以根据需要对这些资源进行分配、管理和控制。例如,内核可以直接访问内存中的任何地址,以进行进程调度、内存管理等操作。
- 用户态:用户程序只能访问分配给它的内存空间和相关资源,不能访问其他进程的内存空间或系统的关键资源。这是通过硬件的内存管理单元(MMU)和操作系统的内存保护机制来实现的。如果用户程序试图访问超出其权限的资源,将会引发异常,由操作系统进行处理。
- 程序执行的优先级:
- 核心态:操作系统内核的程序具有较高的优先级,可以优先获得处理机的使用权,并且可以在必要时中断用户程序的执行,以完成系统的关键任务,如处理硬件中断、进行进程调度等。
- 用户态:用户程序的优先级相对较低,只有在操作系统调度到该进程时才能获得处理机执行。当系统中有更高优先级的任务(如内核的中断处理程序)需要执行时,用户程序可能会被暂停,以确保系统的关键任务能够及时完成。
在计算机系统中,处理机状态的转换是由硬件和操作系统共同完成的。例如,当用户程序执行到一条系统调用指令时,会引发一个中断,将处理机状态从用户态转换为核心态,以便操作系统执行相应的系统调用处理程序。当系统调用处理完成后,再将处理机状态转换回用户态,继续执行用户程序。这种状态划分和转换机制是现代操作系统实现多任务处理、资源保护和系统安全的基础。
处理机在不同工作状态下能执行哪些操作?为什么要区分不同的工作状态?
处理机在不同工作状态下能执行的操作如下:
- 核心态:
- 硬件资源控制:可以直接控制和管理硬件设备,如启动或停止磁盘、打印机等外部设备,对硬件寄存器进行读写操作,以配置设备的工作模式和参数。
- 系统资源管理:负责内存的分配与回收、进程的创建与销毁、进程调度、文件系统的管理等。例如,操作系统内核在核心态下可以根据进程的需求分配内存空间,将进程从就绪队列中调度到处理机上执行,以及对文件进行创建、删除、读写等操作。
- 执行特权指令:能够执行诸如设置系统时钟、改变处理机状态、开启或关闭中断等特权指令。这些指令对于系统的正常运行和管理至关重要,只有在核心态下才能执行,以确保系统的稳定性和安全性。
- 用户态:
- 执行用户程序指令:主要执行用户编写的应用程序代码,包括各种算术运算、逻辑运算、数据处理和函数调用等。例如,用户在使用办公软件进行文档编辑时,处理机在用户态下执行与文字输入、排版、保存等相关的指令。
- 进行系统调用:通过系统调用请求操作系统提供服务。如用户程序需要读取文件时,会通过系统调用向操作系统发出请求,由操作系统在核心态下完成文件读取操作,并将结果返回给用户程序。
区分处理机不同工作状态的原因主要有以下几点:
- 保护系统资源:将处理机的工作状态分为核心态和用户态,可以防止用户程序对系统资源的非法访问和破坏。用户态下的程序只能执行非特权指令,无法直接访问硬件和系统的关键资源,从而保证了系统的稳定性和安全性。例如,若用户程序能够随意访问和修改内存中的系统数据结构,可能会导致系统崩溃或数据丢失。
- 实现多任务处理:操作系统需要同时管理多个用户程序和系统任务。通过区分不同的工作状态,操作系统可以在核心态下进行进程调度、资源分配等操作,合理地为各个进程分配处理机时间和资源,实现多任务的并发执行,提高系统的资源利用率和吞吐量。
- 便于操作系统管理:核心态下的操作系统具有最高的权限,可以执行各种特权操作,对系统进行全面的管理和控制。而用户态下的用户程序则受到一定的限制,这样可以使操作系统更好地管理系统资源、处理中断和异常情况,为用户程序提供一个稳定、可靠的运行环境。例如,当发生硬件中断时,操作系统在核心态下可以及时响应并处理中断,而不会受到用户程序的干扰。
9.中断机制
什么是中断?中断在计算机系统中有什么重要作用?
中断是指计算机在执行程序的过程中,当出现某些突发事件或特殊情况时,暂时停止正在执行的程序,转而去执行处理该事件的程序,处理完毕后再返回原程序继续执行的过程。
中断在计算机系统中具有极其重要的作用,主要体现在以下几个方面:
- 提高 CPU 利用率:在没有中断机制的情况下,CPU 需要不断地查询外部设备的状态,以确定是否有数据需要处理,这会浪费大量的 CPU 时间。而有了中断机制,CPU 可以在等待外部设备数据的同时,去执行其他程序,当外部设备准备好数据后,通过中断信号通知 CPU,CPU 再暂停当前程序去处理数据,从而大大提高了 CPU 的利用率。
- 实现实时响应:对于一些实时性要求较高的任务,如工业控制中的传感器数据采集、航空航天中的飞行控制等,中断可以使计算机及时响应外部事件,确保系统能够在规定的时间内对突发事件做出处理,保证系统的实时性和可靠性。
- 协调多任务执行:计算机系统中通常有多个任务同时运行,中断可以作为一种协调机制,使不同任务之间能够合理地共享 CPU 资源。例如,当一个任务需要等待外部设备输入时,通过中断可以让 CPU 去执行其他任务,当输入完成后再通过中断通知 CPU 继续处理该任务,从而实现多任务的并发执行。
- 处理异常情况:计算机系统在运行过程中可能会出现各种异常情况,如除数为零、内存访问越界、硬件故障等。中断机制可以及时捕获这些异常,并转交给相应的处理程序进行处理,避免系统因异常而崩溃,提高了系统的稳定性和健壮性。
- 支持设备通信:中断是外部设备与 CPU 进行通信的重要方式。外部设备通过发送中断信号来告知 CPU 其工作状态或请求服务,使得 CPU 能够及时了解设备的情况并进行相应的处理,实现了 CPU 与外部设备之间的高效数据传输和交互。
请描述中断的处理过程,包括中断请求的产生、中断响应、中断处理和中断返回等环节。
中断的处理过程主要包括以下几个环节:
- 中断请求的产生:
- 当外部设备完成数据传输、出现故障,或者内部出现如除数为零、程序访存越界等异常情况时,相关的设备或部件会向 CPU 发送中断请求信号。例如,打印机完成数据打印后,会向 CPU 发出中断请求,告知其可以发送下一批要打印的数据。
- 每个中断源都有对应的中断请求线,这些请求线连接到 CPU 的中断控制器。中断控制器负责收集和管理这些中断请求信号,并根据优先级等规则决定是否将中断请求传递给 CPU。
- 中断响应:
- CPU 在执行每条指令的最后一个时钟周期会检查是否有中断请求到来。如果有中断请求,并且 CPU 当前处于允许中断的状态(即中断标志位为 1),则 CPU 会暂停当前正在执行的程序,进入中断响应周期。
- 在中断响应周期,CPU 会完成以下操作:首先,将程序计数器(PC)的当前值保存到堆栈中,以便中断处理完成后能返回原程序继续执行;其次,根据中断类型码,从中断向量表中获取相应中断服务程序的入口地址,并将其装入程序计数器(PC),从而使 CPU 能够跳转到中断服务程序开始执行。
- 中断处理:
- CPU 跳转到中断服务程序后,开始执行中断处理操作。首先,通常会保护现场,即将 CPU 中一些重要的寄存器(如通用寄存器、状态寄存器等)的值压入堆栈,以防止这些数据在中断处理过程中被破坏。
- 然后,根据中断源的类型,执行相应的处理程序。例如,如果是外部设备的中断请求,可能会进行数据传输、设备状态更新等操作;如果是内部异常中断,如除数为零,则可能会进行错误提示、程序恢复等处理。
- 在处理中断的过程中,可能会根据需要屏蔽其他中断,以防止在处理当前中断时被其他中断干扰。但也可以根据具体情况,允许某些更高优先级的中断嵌套进来,这取决于系统的中断优先级策略。
- 中断返回:
- 当中断处理完成后,需要恢复现场,即将之前保存在堆栈中的寄存器值弹出,送回到相应的寄存器中,使 CPU 恢复到中断前的状态。
- 最后,从堆栈中取出保存的程序计数器(PC)的值,将其装入 PC,CPU 便可以返回到原来被中断的程序处,继续执行后续的指令。
通过这样的中断处理过程,计算机系统能够及时响应各种外部事件和内部异常,保证系统的正常运行和高效处理。
10.特权指令与非特权指令
什么是特权指令和非特权指令?它们有什么区别?
特权指令是指仅能由操作系统内核在核心态下执行的指令,这些指令通常与系统资源的管理和控制相关,具有较高的权限和风险。非特权指令则是可以在用户态下由用户程序执行的指令,主要用于完成用户程序的各种功能,对系统资源的访问受到限制。两者的区别如下:
- 执行环境
- 特权指令只能在核心态下执行。核心态是操作系统内核运行的状态,具有对硬件和系统资源的完全访问权限。
- 非特权指令可以在用户态下执行。用户态是用户程序运行的状态,在此状态下程序只能访问有限的资源,不能直接访问硬件和系统的关键资源。
- 功能范围
- 特权指令用于实现对系统资源的管理和控制,如设置系统时钟、启动或停止设备、进行内存分区管理、改变处理机状态等。这些操作对于系统的正常运行和稳定性至关重要,需要严格控制执行权限。
- 非特权指令主要用于完成用户程序的各种任务,包括算术运算、逻辑运算、数据传输、函数调用等。它们只能在用户程序的地址空间内进行操作,不能直接影响系统的整体运行。
- 安全性
- 执行特权指令可能会对整个系统产生影响,如果被错误地执行或被恶意程序利用,可能导致系统崩溃、数据丢失或安全漏洞。因此,只有操作系统内核才能执行特权指令,以确保系统的安全性和稳定性。
- 非特权指令在用户态下执行,受到操作系统的保护和限制,不会直接对系统造成损害。即使用户程序中的非特权指令出现错误,也通常只会影响该程序本身的运行,而不会导致整个系统崩溃。
以设置系统时钟为例,这是一个特权指令操作。如果用户程序能够随意执行该指令,就可能会破坏系统的时间同步,影响各种依赖时间的操作和应用程序的正常运行。而用户程序中的加法、减法等算术运算指令,以及数据的读取和写入指令等都是非特权指令,它们在用户态下安全地执行,不会对系统的核心功能和资源造成直接影响。
为什么要区分特权指令和非特权指令?举例说明哪些操作需要使用特权指令。
区分特权指令和非特权指令主要是为了保障系统的安全性、稳定性以及实现对系统资源的有效管理,以下为你详细阐述:
区分原因
- 保障系统安全:计算机系统中有许多关键资源和敏感信息,如操作系统内核数据结构、硬件设备的控制寄存器等。如果用户程序可以随意访问和修改这些资源,可能会导致系统崩溃、数据丢失或被恶意篡改。通过区分特权指令和非特权指令,将对关键资源的访问和控制权限限制在操作系统内核,只有在内核态下才能执行特权指令,从而防止用户程序对系统造成破坏,保障系统的安全性。
- 确保系统稳定运行:操作系统需要对系统资源进行统一的管理和调度,以保证系统的正常运行。特权指令用于实现这些管理和调度功能,如进程调度、内存分配、设备驱动等。如果用户程序可以随意执行这些指令,可能会破坏系统的资源管理策略,导致系统出现死锁、资源竞争等问题,影响系统的稳定性。将特权指令的执行权限限制在内核态,可以确保操作系统能够有效地管理和控制资源,保证系统的稳定运行。
- 实现多用户和多任务环境:在多用户和多任务的计算机系统中,多个用户程序可能同时运行。为了避免不同用户程序之间的相互干扰和冲突,需要对每个程序的资源访问进行限制。区分特权指令和非特权指令可以实现这种限制,使得用户程序只能在自己的地址空间内执行非特权指令,而对系统资源的访问必须通过操作系统提供的系统调用接口,由操作系统在内核态下进行处理,从而实现了多用户和多任务环境的隔离和保护。
特权指令操作举例
- 设备管理类
- 启动设备:例如启动磁盘驱动器进行数据读写操作。磁盘是计算机系统中的重要存储设备,启动磁盘的操作需要对磁盘的控制寄存器进行设置,这涉及到硬件层面的操作,只有通过特权指令才能完成。
- 停止设备:当设备完成工作或出现故障时,需要停止设备的运行。如停止打印机的打印任务,这需要向打印机的控制端口发送特定的指令,这种操作必须在内核态下使用特权指令来实现。
- 内存管理类
-
内存分配与回收:操作系统需要根据进程的需求为其分配内存空间,并在进程结束后回收内存。这涉及到对内存管理数据结构的修改和操作,如修改页表、更新内存分配位图等,只有特权指令才能完成这些操作。
- 内存映射:将虚拟地址空间映射到物理地址空间是内存管理的重要功能。在进行内存映射时,需要修改硬件的内存管理单元(MMU)的相关寄存器,这需要使用特权指令来实现。
-
- 系统控制类
- 设置时钟:系统时钟是计算机系统的重要组成部分,它用于计时、调度任务等。设置系统时钟的时间和频率需要对时钟芯片的寄存器进行操作,这是一个特权指令操作。
- 改变处理机状态:将处理机从用户态切换到核心态或从核心态切换到用户态需要使用特权指令。这种状态切换是操作系统进行任务调度和资源管理的重要手段。
二、进程与线程
1.进程的概念
什么是进程?进程与程序的区别和联系是什么?
进程是指在系统中正在运行的一个应用程序的实例,是程序在一个数据集合上的一次动态执行过程。它是操作系统进行资源分配和调度的基本单位。进程具有并发性、动态性、独立性和异步性等特征。
进程与程序的区别
- 动态性与静态性:进程是动态的,它强调程序的执行过程,包括从创建、执行到消亡的整个生命周期。而程序是静态的,是一组指令的有序集合,存放在外存中,如硬盘上的可执行文件,不具有运行的含义。
- 并发性与顺序性:多个进程可以并发执行,它们在一段时间内交替占用处理器资源,实现多个任务的同时推进。程序本身不具有并发性,只有将程序加载到内存中作为进程运行时,才有可能与其他进程并发执行。
- 独立性与相关性:进程是一个独立的运行单位,它拥有自己独立的地址空间、资源(如内存、文件等),可以独立地被操作系统调度和执行。程序则不具有这种独立性,它需要通过进程来运行,多个程序之间可能存在相互依赖关系,但这种关系需要通过进程间的通信和协调来实现。
- 生命周期与持久性:进程有明确的生命周期,从创建开始,经过运行、暂停、唤醒等状态,最终结束并释放资源。程序则可以长期存储在外存中,具有持久性,只要不被删除或损坏,它就一直存在。
进程与程序的联系
- 进程是程序的执行实例:程序是进程的静态描述,是进程要执行的代码和数据的集合。当程序被加载到内存中并被操作系统创建为进程后,程序中的指令才会被逐条执行,从而实现程序的功能。
- 程序是进程的基础:没有程序,就无法创建进程。进程在执行过程中,始终围绕着程序所规定的逻辑和操作进行,程序决定了进程的行为和功能。
- 一个程序可以对应多个进程:同一个程序可以被多次加载到内存中,形成多个不同的进程,这些进程可以同时运行,并且各自有独立的执行路径和数据空间。例如,同时打开多个文本编辑器窗口,每个窗口都是同一个文本编辑程序的不同进程。
进程的基本特征有哪些?
进程具有以下基本特征:
- 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的。它具有一定的生命周期,从创建开始,经历运行、等待、就绪等状态,最终结束并释放资源。
- 并发性:多个进程可以在同一时间间隔内同时执行。在多道程序环境下,系统中通常会有多个进程同时存在,它们共享系统资源,交替使用处理器,从而提高系统的资源利用率和吞吐量。
- 独立性:进程是一个独立的运行单位,它拥有自己独立的地址空间,包括程序段、数据段和堆栈段等,进程之间的地址空间相互隔离。此外,进程还拥有自己独立的资源,如内存、文件、设备等,能够独立地被操作系统调度和执行。
- 异步性:每个进程都按照自己独立的、不可预知的速度向前推进。由于进程受到系统资源分配、其他进程的执行情况以及外部事件等多种因素的影响,其执行过程是不可预测的,可能会在任何时刻暂停或继续执行。
- 结构性:进程通常由程序、数据和进程控制块(PCB)三部分组成。程序是进程要执行的代码,规定了进程的操作逻辑;数据是进程处理的对象;进程控制块则是操作系统用于管理进程的信息集合,包含了进程的标识、状态、优先级、资源分配等信息。
2.进程的状态与转换
进程有哪些基本状态?请描述它们之间的转换关系及原因。
进程通常有三种基本状态:就绪状态、运行状态和阻塞状态。以下是它们之间的转换关系及原因:
- 就绪状态→运行状态
- 转换原因:当进程获得了除处理机以外的所有必要资源后,它就进入就绪状态,此时进程具备了运行的条件,只等待处理机资源。当调度程序从就绪队列中选择该进程并将处理机分配给它时,进程就从就绪状态转换为运行状态。
- 运行状态→就绪状态
- 转换原因:正在运行的进程如果时间片用完,或者有更高优先级的进程进入就绪队列,当前进程就会被抢占处理机,从而从运行状态转换为就绪状态。此外,当系统进行资源调度,需要将当前运行进程的处理机资源分配给其他更紧急的进程时,也会导致该进程进入就绪状态。
- 运行状态→阻塞状态
- 转换原因:当进程在运行过程中需要等待某一事件发生,如等待 I/O 操作完成、等待资源分配、等待信号量等,它就会主动放弃处理机,进入阻塞状态。此时,即使处理机空闲,该进程也不能运行,因为它需要等待的事件尚未发生。
- 阻塞状态→就绪状态
- 转换原因:当进程所等待的事件发生时,如 I/O 操作完成、资源已经分配给该进程、信号量可用等,进程就从阻塞状态转换为就绪状态。此时,进程重新具备了运行的条件,等待调度程序再次将处理机分配给它,以便继续执行。
需要注意的是,有些操作系统还可能会引入其他状态,如新建状态(进程正在被创建的过程中)、终止状态(进程执行完毕或因某种原因被终止)等,以更细致地描述进程的生命周期。但就绪、运行和阻塞是进程最基本的三种状态,它们之间的转换构成了进程在系统中动态执行的基本过程。
举例说明在什么情况下进程会进入阻塞状态?又如何从阻塞状态恢复到就绪状态?
进程进入阻塞状态是因为其在运行过程中需要等待某些事件发生,以下是一些常见的情况以及相应的从阻塞状态恢复到就绪状态的方式:
- 等待 I/O 操作完成
- 进入阻塞状态示例:当一个进程需要从硬盘读取文件数据时,它会发起一个 I/O 请求。由于 I/O 操作相对较慢,在数据传输完成之前,进程无法继续执行下一步操作,于是进入阻塞状态。例如,一个视频播放程序在加载视频文件时,需要从磁盘读取视频数据,此时进程会阻塞,直到数据读取完成。
- 恢复到就绪状态方式:当 I/O 设备完成数据传输,即硬盘将所需文件数据读取到内存后,会向操作系统发送一个中断信号。操作系统接收到该信号后,会将等待该 I/O 操作的进程从阻塞状态转换为就绪状态。
- 等待资源分配
- 进入阻塞状态示例:多个进程可能竞争同一资源,如打印机。当一个进程请求使用打印机时,如果此时打印机正被其他进程占用,那么该进程就会进入阻塞状态,等待打印机资源被释放。例如,多个文档打印任务同时提交,先申请到打印机资源的任务开始打印,其他任务则处于阻塞状态。
- 恢复到就绪状态方式:当占用打印机的进程使用完毕并释放打印机资源后,操作系统会检查等待该资源的进程队列,将其中的一个或多个进程从阻塞状态转换为就绪状态。
- 等待信号量
- 进入阻塞状态示例:在多进程协作中,信号量常被用于控制对共享资源的访问。如果一个进程尝试获取一个已被其他进程占用的信号量(例如,信号量初始值为 1,代表某一时刻只能有一个进程访问共享资源),那么它会进入阻塞状态,等待信号量被释放。例如,多个进程访问一个共享的数据库记录,通过信号量来保证同一时刻只有一个进程能对其进行写操作,若进程 A 正在写操作,进程 B 尝试写时就会因信号量被占用而阻塞。
- 恢复到就绪状态方式:当持有信号量的进程执行完相关操作并释放信号量时,操作系统会唤醒等待该信号量的一个或多个进程,将它们从阻塞状态转换为就绪状态。
- 进程间通信等待
- 进入阻塞状态示例:进程之间通过管道、消息队列等方式进行通信时,若发送进程发送消息后,接收进程尚未准备好接收,发送进程可能会进入阻塞状态。例如,进程 A 通过消息队列向进程 B 发送消息,若进程 B 此时正忙于处理其他任务,没有及时从消息队列中读取消息,进程 A 可能会阻塞,直到进程 B 准备好接收消息。
- 恢复到就绪状态方式:当接收进程准备好接收消息并从消息队列中取走消息后,会向发送进程发送一个确认信号,或者以某种约定的方式通知发送进程可以继续发送下一条消息,此时发送进程从阻塞状态恢复到就绪状态。
3.进程控制块(PCB)
什么是进程控制块?它包含哪些主要信息?
进程控制块(Process Control Block,PCB)是操作系统用于管理进程的核心数据结构,是进程存在的唯一标志。它包含了操作系统管理进程所需的所有信息,主要有以下几类:
- 进程标识信息
- 进程 ID(PID):是进程的唯一标识符,操作系统通过 PID 来区分不同的进程,就像每个人都有唯一的身份证号码一样。
- 父进程 ID:标识该进程的父进程,用于建立进程间的父子关系,便于进程的管理和资源分配。
- 用户 ID:表明运行该进程的用户身份,用于权限管理和资源访问控制。
- 进程状态信息
- 记录进程当前所处的状态,如就绪、运行、阻塞、暂停等,帮助操作系统了解进程的执行情况,以便进行相应的调度和管理。
- 进程控制信息
- 程序计数器(PC):指示进程当前要执行的下一条指令的地址,确保进程能够按照正确的顺序执行指令。
- 堆栈指针:指向进程的堆栈空间,用于保存函数调用的参数、返回地址和局部变量等,帮助进程在执行过程中正确地进行函数调用和数据存储。
- 进程优先级:表示进程相对于其他进程的重要程度和执行优先顺序,优先级高的进程通常会优先获得处理机资源。
- 调度参数:包含与进程调度相关的一些参数,如时间片、等待时间等,操作系统根据这些参数来决定进程的调度策略。
- 进程资源信息
- 内存空间信息:描述进程所占用的内存空间的起始地址、大小等信息,操作系统通过这些信息来进行内存管理,确保进程能够正确地访问自己的内存空间,同时避免不同进程之间的内存冲突。
- 打开的文件列表:记录进程当前打开的所有文件的相关信息,如文件描述符、文件指针等,方便进程对文件进行读写操作,同时也便于操作系统对文件资源进行管理。
- 占用的设备列表:列出进程当前占用的各种设备,如打印机、扫描仪等,操作系统可以根据这个列表来进行设备分配和资源回收,保证设备的合理使用。
- 进程通信信息
- 包含进程在进行通信时所需的信息,如管道、消息队列、信号量等通信机制的相关参数,用于实现进程之间的信息交换和同步。
PCB 就像是进程的 “档案袋”,操作系统通过它来全面了解进程的情况,实现对进程的创建、调度、执行、终止等一系列管理操作,确保系统中各个进程能够有序、高效地运行。
进程控制块在进程管理中起到什么作用?
进程控制块(PCB)在进程管理中起着至关重要的作用,主要体现在以下几个方面:
- 进程标识与区分:系统中的每个进程都有唯一的 PCB,其中的进程 ID(PID)作为进程的唯一标识符,就像人的身份证一样,使得操作系统能够准确地识别和区分不同的进程,便于对各个进程进行单独的管理和控制。
- 保存进程状态信息:PCB 记录了进程当前所处的状态,如就绪、运行、阻塞等。通过这个状态信息,操作系统可以清楚地了解每个进程的执行情况,从而进行相应的调度决策。例如,当一个进程从运行状态变为阻塞状态时,操作系统会根据其 PCB 中的状态信息,将处理机分配给其他就绪的进程。
- 支持进程调度:PCB 中包含了进程的优先级、调度参数等信息。操作系统的调度程序根据这些信息来确定哪个进程应该获得处理机资源以及获得多长时间的处理机资源。优先级高的进程通常会优先被调度执行,而时间片等调度参数则决定了进程在一次调度中能够使用处理机的时长。
- 管理进程资源:PCB 记录了进程所占用的各种资源信息,如内存空间、打开的文件、占用的设备等。操作系统可以根据这些信息进行资源的分配和回收。当进程需要更多资源时,操作系统会参考其 PCB 中的资源需求信息进行分配;当进程结束时,操作系统会根据 PCB 中的资源占用信息回收相应的资源,以确保系统资源的合理利用和有效管理。
- 实现进程通信:对于需要进行通信的进程,PCB 中包含了与进程通信相关的信息,如管道、消息队列、信号量等通信机制的参数。这些信息为进程之间的信息交换和同步提供了支持,使得不同进程能够协调工作,共同完成复杂的任务。
- 进程控制与操作:操作系统对进程的创建、终止、挂起、恢复等操作都是通过对 PCB 的操作来实现的。例如,创建一个新进程时,操作系统会为其分配一个 PCB,并初始化其中的各项信息;当进程执行完毕或出现异常需要终止时,操作系统会回收其 PCB 以及相关的资源。
3.1 进程控制
4.进程同步与互斥
基本定义
临界区遵循原则
什么是进程同步?什么是进程互斥?二者有何区别与联系?
进程同步和进程互斥是进程管理中的两个重要概念,以下是它们的定义、区别与联系:
进程同步(直接制约关系)
- 定义:进程同步是指多个进程在执行过程中,为了协调它们的工作流程,需要按照一定的顺序和规则来执行,以确保系统的正确性和稳定性。例如,在生产者 - 消费者问题中,生产者进程和消费者进程需要协调工作,生产者先生产数据,消费者才能消费数据,并且消费者不能在缓冲区为空时进行消费,生产者不能在缓冲区满时进行生产,这就需要通过进程同步机制来实现。
进程互斥(间接制约关系)
- 定义:进程互斥是指当多个进程同时访问某个临界资源(如打印机、共享内存区域等)时,为了避免数据不一致或混乱,同一时刻只允许一个进程访问该资源,其他进程必须等待,直到该资源被释放。例如,多个进程都需要使用打印机进行打印,如果不进行互斥控制,可能会导致打印数据混乱,通过进程互斥机制可以确保每次只有一个进程能够使用打印机。
区别
- 侧重点不同
- 进程同步主要关注进程之间的协作和执行顺序,以确保它们能够正确地协同工作,完成共同的任务。
- 进程互斥主要关注对临界资源的访问控制,防止多个进程同时访问临界资源而导致数据不一致或系统错误。
- 实现方式不同
- 进程同步通常通过信号量、条件变量等机制来实现,这些机制可以让进程在满足一定条件时进行等待或唤醒,从而协调进程的执行顺序。
- 进程互斥一般通过互斥锁、信号量等方式来实现,通过对临界资源进行加锁保护,确保同一时刻只有一个进程能够访问。
联系
- 都是为了保证系统的正确性:进程同步和进程互斥都是为了防止多个进程并发执行时出现数据不一致、系统错误等问题,从而保证系统的稳定性和正确性。
- 相互依存:在实际的系统中,进程同步和进程互斥常常是相互结合使用的。例如,在生产者 - 消费者问题中,不仅需要通过进程同步来协调生产者和消费者的工作顺序,还需要通过进程互斥来确保对缓冲区这一临界资源的正确访问,防止多个生产者或消费者同时访问缓冲区导致数据混乱。
- 都需要使用同步机制:无论是进程同步还是进程互斥,都需要借助一些同步机制来实现,如信号量、互斥锁等。这些同步机制为进程之间的协调和资源访问控制提供了基础。
实现进程互斥的方法
请简述实现进程互斥的方法,如硬件方法(TestAndSet 指令等)和软件方法(Peterson 算法等)。
实现进程互斥的方法有硬件方法和软件方法,以下是对常见方法的简述:
硬件方法
- TestAndSet 指令(TS 指令)
- 原理:TS 指令是一种硬件指令,它将一个内存单元的内容读取出来,并同时将该内存单元设置为一个特定的值。在进程互斥中,通常用一个变量来表示锁的状态,0 表示锁空闲,1 表示锁被占用。进程在进入临界区前,使用 TS 指令检查锁变量的状态,如果锁空闲,则获取锁并进入临界区;如果锁被占用,则继续循环检查。
- 优点:实现简单,效率高,适用于多处理器系统。
- 缺点:进程在等待锁时会一直循环,浪费 CPU 时间。
- Swap 指令(Exchange 指令)
- 原理:Swap 指令用于交换两个内存单元的内容。在进程互斥中,同样用一个变量表示锁的状态,一个变量表示进程的标志。进程先将自己的标志设为 1,然后使用 Swap 指令将锁变量和自己的标志进行交换。如果交换后锁变量的值为 0,说明锁空闲,进程可以进入临界区;否则,进程继续循环等待。
- 优点:与 TS 指令类似,实现相对简单,适用于多处理器系统。
- 缺点:同样存在进程等待时浪费 CPU 时间的问题。
软件方法
- Peterson 算法
- 原理:Peterson 算法用于解决两个进程之间的互斥问题。它使用两个变量
flag
和turn
来实现进程互斥。flag
数组用于表示进程是否想要进入临界区,turn
变量用于表示轮到哪个进程进入临界区。进程先设置自己的flag
为真,表示自己想要进入临界区,然后将turn
设置为对方的进程号,表示谦让。接着,进程检查对方的flag
和turn
的值,如果对方不想进入临界区或者轮到自己进入临界区,那么进程就可以进入临界区。
- 原理:Peterson 算法用于解决两个进程之间的互斥问题。它使用两个变量
- 优点:能够正确地实现进程互斥,避免了忙等待,适用于单处理器系统和多处理器系统。
- 缺点:只能解决两个进程之间的互斥问题,对于多个进程的情况需要进行扩展。
- 面包店算法(Bakery Algorithm)
- 原理:面包店算法是一种基于票号的互斥算法,类似于面包店中顾客取号排队的方式。每个进程在进入临界区前,先获取一个票号,票号的值表示进程的优先级。票号最小的进程可以进入临界区。如果有多个进程同时获取票号,那么按照进程的编号顺序来确定优先级。
- 优点:能够正确地实现进程互斥,适用于多个进程的情况,并且满足公平性原则,即每个进程最终都能进入临界区。
- 缺点:实现相对复杂,需要较多的存储空间来保存票号和选择数组。
互斥锁
信号量
什么是信号量?如何bb利用信号量实现进程的同步与互斥?请举例说明,如生产者 - 消费者问题、读者 - 写者问题等。
信号量是一种用于实现进程同步和互斥的机制,它可以被看作是一个具有整数值的变量,通过对其进行操作来控制进程的执行顺序和访问共享资源。以下介绍如何利用信号量实现进程的同步与互斥,并结合生产者 - 消费者问题和读者 - 写者问题进行举例说明。
信号量的基本操作
- P 操作:也称为 wait 操作或申请资源操作。执行 P 操作时,首先将信号量的值减 1,如果结果大于等于 0,则进程可以继续执行;如果结果小于 0,则进程被阻塞,放入与该信号量相关的阻塞队列中,等待其他进程释放资源来唤醒它。
- V 操作:也称为 signal 操作或释放资源操作。执行 V 操作时,将信号量的值加 1,如果加 1 后信号量的值小于等于 0,说明有进程在该信号量的阻塞队列中等待,那么就从阻塞队列中唤醒一个进程,让其进入就绪队列。
利用信号量实现进程互斥
实现进程互斥时,只需设置一个信号量,其初始值为 1,表示资源可用。
当进程需要访问临界资源时,先执行 P 操作,如果信号量的值变为 0,说明资源已被占用,进程进入阻塞状态;
当进程访问完临界资源后,执行 V 操作,释放资源,唤醒其他等待的进程。
利用信号量实现进程同步
实现进程同步需要根据具体的同步关系设置信号量和初始值。例如,若进程 A 需要等待进程 B 完成某个操作后才能继续执行,可以设置一个信号量,初始值为 0。进程 B 完成操作后执行 V 操作,使信号量的值变为 1,唤醒等待的进程 A;进程 A 在执行前先执行 P 操作,若信号量为 0 则阻塞,直到被进程 B 唤醒。
生产者 - 消费者问题
- 问题描述:有一群生产者进程在生产产品,并将产品放入缓冲区;同时有一群消费者进程从缓冲区中取出产品进行消费。缓冲区是有限大小的,当缓冲区满时,生产者进程需要等待;当缓冲区空时,消费者进程需要等待。
- 信号量设置:设置三个信号量,分别为
mutex
(用于互斥访问缓冲区,初始值为 1)、empty
(表示缓冲区空的数量,初始值为缓冲区大小)、full
(表示缓冲区满的数量,初始值为 0)。
读者 - 写者问题
- 问题描述:有多个读者和多个写者访问一个共享数据区。要求:① 允许多个读者同时读数据;② 写者写入数据时,不允许其他读者和写者访问;③ 读者在读数据时,不允许写者写入数据。
- 信号量设置:设置三个信号量,
rw_mutex
(用于读者和写者之间的互斥,初始值为 1)、mutex
(用于保护读者计数变量read_count
的互斥访问,初始值为 1),write_mutex
(用于写者之间的互斥,初始值为 1);一个整型变量read_count
(记录当前正在读数据的读者数量,初始值为 0)。
在生产者 - 消费者问题和读者 - 写者问题中,信号量通过合理地控制进程对资源的访问顺序和时机,有效地实现了进程之间的同步与互斥,保证了系统的正确性和稳定性。
阐述管程的概念,它与信号量有什么区别?
管程是一种用于实现进程同步和互斥的高级同步机制。以下是管程的概念以及它与信号量的区别:
管程的概念
管程是一个由过程、变量及数据结构等组成的集合,它们被封装在一个对象中。管程有以下特点:
- 互斥性:管程被设计成一次只能有一个进程进入管程执行,从而保证了对管程内共享资源的互斥访问。
- 条件变量:管程中可以定义条件变量,用于实现进程的同步。进程可以在条件不满足时阻塞在条件变量上,等待其他进程通过信号操作来唤醒。
管程与信号量的区别
- 实现方式
- 信号量是通过对一个整数值的变量进行原子操作(P 操作和 V 操作)来实现进程的同步和互斥,其操作较为底层和灵活,但需要程序员仔细地设计和管理信号量的使用,以避免出现死锁等问题。
- 管程则是将共享资源的操作和管理封装在一个类似于对象的结构中,通过过程调用的方式来访问共享资源,管程内部自动实现了互斥机制,程序员无需显式地使用 P 和 V 操作,降低了编程的复杂性和出错的可能性。
- 数据结构
- 信号量主要是一个简单的整数值变量,用于记录资源的数量或状态。
- 管程是一个较为复杂的数据结构,它包含了共享变量、对这些变量进行操作的过程以及用于同步的条件变量等,是一种更高级、更抽象的封装。
- 作用范围
- 信号量可以在多个进程之间广泛地使用,用于协调不同进程对各种类型资源的访问,其作用范围较为灵活,可以根据需要在不同的代码片段中使用。
- 管程通常用于对特定的共享资源进行集中管理和操作,它将与该资源相关的所有操作都封装在管程内部,使得对资源的访问更加集中和可控,作用范围主要是管程所封装的内部资源。
- 编程难度
- 使用信号量实现进程同步和互斥时,程序员需要仔细考虑信号量的初始值设置、P 和 V 操作的位置以及可能出现的并发问题,编程难度相对较高,容易出现逻辑错误。
- 管程提供了一种更高级的抽象,将复杂的同步细节封装在管程内部,程序员只需要关注对管程中过程的调用,无需过多关心底层的同步机制,因此编程难度相对较低,代码的可读性和可维护性更好。
5.进程通信
进程通信有哪些方式?请分别简述其特点和适用场景,如共享内存、消息传递、管道等。
进程通信是指进程之间进行信息交换和共享的机制。以下是几种常见的进程通信方式及其特点和适用场景:
共享内存
- 特点
- 高效性:它是最快的进程通信方式之一,多个进程可以直接访问同一块内存区域,无需进行数据复制,大大提高了数据传输效率。
- 复杂的同步机制:由于多个进程可以同时访问共享内存,为了保证数据的一致性和完整性,需要使用同步机制,如信号量、互斥锁等,这增加了编程的复杂性。
- 适用场景:适用于对数据传输速度要求高、数据量较大的场景,例如,在实时系统中,多个进程需要快速共享和处理大量的传感器数据;在数据库系统中,多个进程可能需要共享缓存数据。
消息传递
- 特点
- 灵活性:进程之间通过发送和接收消息来进行通信,消息的格式和内容可以根据具体需求进行定义,具有很高的灵活性。
- 异步性:消息的发送和接收可以是异步的,发送方不必等待接收方处理完消息后再继续执行,提高了进程的并发度。
- 相对较低的效率:与共享内存相比,消息传递需要进行数据的复制和传输,效率相对较低。
- 适用场景:适用于分布式系统、网络编程以及进程之间逻辑关系较为松散的场景。例如,在微服务架构中,不同的服务之间可以通过消息队列进行通信;在游戏开发中,不同的游戏模块之间可以通过消息传递来协调工作。
管道
- 特点
- 简单易用:管道是一种半双工的通信方式,数据只能在一个方向上流动,通常用于父子进程之间或有亲缘关系的进程之间的通信,使用起来相对简单。
- 自动同步:管道具有自动同步机制,当管道满时,写进程会被阻塞;当管道空时,读进程会被阻塞,这保证了数据的有序传输。
- 数据有限:管道的容量通常是有限的,如果需要传输大量数据,可能需要进行额外的处理。
- 适用场景:适用于具有一定逻辑顺序的进程之间的通信,例如,在 shell 脚本中,经常使用管道将一个命令的输出作为另一个命令的输入,实现数据的过滤和处理;在一些简单的进程协作场景中,也可以使用管道来传递少量的数据。
套接字(Socket)
- 特点
- 跨网络通信:套接字不仅可以用于同一台计算机上的进程通信,还可以用于不同计算机之间的进程通信,支持网络编程。
- 多种通信协议:可以使用不同的传输层协议,如 TCP(面向连接、可靠的传输协议)和 UDP(无连接、不可靠的传输协议),根据具体需求选择合适的协议。
- 复杂的设置和管理:相比其他进程通信方式,套接字的设置和管理较为复杂,需要处理网络连接、数据传输的可靠性、并发访问等问题。
- 适用场景:广泛应用于网络应用程序开发,如服务器 - 客户端架构的应用,包括 Web 服务器、文件传输服务器、即时通讯软件等,用于实现不同主机上进程之间的通信和数据交换。
信号
- 特点
- 异步通知:信号是一种异步的通信方式,用于通知进程发生了某种特定的事件,进程在收到信号后会暂停当前的执行,转而去处理相应的信号处理函数。
- 简单轻量级:信号的传递和处理相对简单,不需要进行复杂的数据传输和同步操作。
- 功能有限:信号通常只能传递简单的事件信息,不能传递大量的数据。
- 适用场景:用于处理系统中的异步事件,如进程终止、键盘中断、定时器超时等。例如,当用户按下 Ctrl + C 组合键时,系统会向当前运行的进程发送一个中断信号,进程可以捕获这个信号并进行相应的处理,如保存数据、清理资源等。
共享内存方式下,如何保证数据的一致性?
在共享内存方式下,可以通过以下几种方法来保证数据的一致性:
使用同步机制
- 互斥锁:进程在访问共享内存之前,需要先获取互斥锁。只有获得锁的进程才能对共享内存进行读写操作,其他进程则需要等待锁的释放。这样可以确保在同一时刻只有一个进程能够访问共享内存,避免数据冲突。例如,在 C 语言中,可以使用
pthread_mutex_t
类型的互斥锁,通过pthread_mutex_lock
函数获取锁,pthread_mutex_unlock
函数释放锁。 - 信号量:信号量可以用来控制多个进程对共享资源的访问。它通过一个整数值来表示资源的可用数量。进程在访问共享内存前,先执行信号量的 P 操作(等待操作),如果信号量的值大于 0,则将其减 1 并继续执行;如果信号量的值为 0,则进程阻塞等待。当进程完成对共享内存的访问后,执行信号量的 V 操作(释放操作),将信号量的值加 1,以唤醒其他等待的进程。
- 条件变量:条件变量通常与互斥锁一起使用,用于在特定条件满足时通知进程进行相应的操作。进程在访问共享内存前,先检查某个条件是否满足,如果不满足,则在条件变量上等待;当其他进程修改了共享内存使得条件满足时,通过信号量通知等待的进程,唤醒它们继续执行。
原子操作
对于一些简单的变量操作,可以使用原子操作来保证数据的一致性。原子操作是指在一个指令周期内完成的操作,不会被其他进程或线程打断。例如,对一个整型变量的加 1 操作,如果使用原子操作,就可以确保在多进程环境下,该操作的结果是正确的,不会出现数据不一致的情况。在 C++ 中,可以使用<atomic>
头文件中的atomic
类型来进行原子操作。
数据访问控制
- 制定访问规则:明确规定进程对共享内存的访问方式和顺序,例如,规定哪些进程可以读,哪些进程可以写,以及读写的先后顺序等。所有进程都必须按照这些规则来访问共享内存,以避免数据混乱。
- 数据结构设计:合理设计共享内存中的数据结构,使其易于管理和保护。例如,可以将相关的数据组合成一个结构体,对结构体的访问进行统一的控制;或者使用链表、队列等数据结构来组织数据,确保数据的一致性和完整性。
日志和恢复机制
- 记录操作日志:进程在对共享内存进行写操作时,同时将操作记录到日志中。日志可以包括操作的类型、时间、修改的数据等信息。这样在出现数据不一致的情况时,可以通过日志来追溯操作过程,查找问题所在。
- 数据恢复:根据日志信息,可以设计相应的恢复机制,在系统出现故障或数据不一致时,能够将共享内存中的数据恢复到一个正确的状态。例如,可以通过重新执行某些操作或者回滚某些操作来修复数据。
6.线程
什么是线程?线程与进程的区别和联系是什么?
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。以下是线程与进程的区别和联系:
区别
- 资源分配:进程是资源分配的基本单位,拥有独立的地址空间、内存、文件句柄等资源。而线程是 CPU 调度的基本单位,共享所属进程的资源,如内存空间、打开的文件等,但拥有自己独立的栈空间、寄存器等少量资源。
- 并发性:进程之间相互独立,并发执行时需要进行进程间通信来交换信息。多个线程在同一个进程内可以并发执行,共享进程的资源,通信更加容易和高效。
- 切换开销:进程切换时,需要切换整个地址空间和相关资源,开销较大。线程切换只需保存和恢复少量的寄存器内容以及栈指针等,切换开销相对较小。
- 独立性:进程具有较高的独立性,一个进程的崩溃通常不会影响其他进程。而线程的独立性相对较弱,一个线程的崩溃可能会导致整个进程崩溃,因为线程是在进程的地址空间内运行的。
联系
- 包含关系:线程是进程的一部分,一个进程可以包含多个线程。进程就像一个容器,为线程提供了运行的环境和资源。
- 协同工作:同一进程内的多个线程可以并发执行,共同完成进程的任务。它们可以通过共享内存等方式进行通信和协作,提高程序的执行效率。
- 创建和销毁:线程的创建和销毁通常由进程来管理。进程在启动时可以创建多个线程,在进程结束时,所有的线程也会随之结束。
- 依赖关系:线程的运行依赖于进程的资源和环境。如果进程被终止或资源被回收,线程将无法继续运行。同时,线程的执行也会影响进程的状态,例如线程的执行时间、资源占用等会影响整个进程的性能。
线程有哪些优点和缺点?在什么情况下适合使用多线程?
线程是程序执行流的最小单元,它具有以下优点和缺点:
优点
- 提高并发性:允许在同一进程中同时执行多个任务,充分利用多核处理器的资源,提高程序的整体执行效率。例如,在图形界面应用程序中,一个线程可以用于处理用户界面的交互,另一个线程可以同时进行数据的加载或计算,使用户体验更加流畅。
- 资源共享方便:同一进程内的线程共享进程的资源,如内存空间、文件句柄等,这使得线程之间的数据共享和通信更加容易和高效。多个线程可以方便地访问和修改共享数据,协同完成复杂的任务。
- 响应速度快:由于线程的切换开销相对较小,当某个线程需要等待某个事件发生(如 I/O 操作完成)时,操作系统可以快速切换到其他就绪的线程继续执行,从而提高系统的响应速度,减少用户等待时间。
缺点
- 编程复杂性增加:多线程编程需要考虑线程的同步、互斥、通信等问题,以避免数据竞争和不一致性。这增加了编程的难度和复杂性,容易导致程序出现难以调试的错误。
- 资源竞争问题:多个线程共享资源时,如果没有正确地进行同步控制,可能会导致资源竞争,从而产生不可预测的结果。例如,多个线程同时对一个共享变量进行写操作,可能会导致数据丢失或错误。
- 线程调度和执行顺序不确定:线程的调度由操作系统决定,程序员无法精确控制线程的执行顺序。这可能导致程序的行为在不同的运行环境或不同的时间出现差异,增加了程序的不确定性和调试难度。
在以下情况下适合使用多线程:
- I/O 密集型任务:当程序中有大量的 I/O 操作(如文件读写、网络通信等)时,使用多线程可以在一个线程等待 I/O 操作完成的同时,让其他线程继续执行其他任务,从而提高程序的整体性能。例如,一个网络服务器可以使用多个线程来处理多个客户端的连接请求,每个线程负责与一个客户端进行数据交互,避免因某个客户端的 I/O 操作阻塞而影响其他客户端的服务。
- 计算密集型任务:对于一些可以并行处理的计算密集型任务,使用多线程可以将任务分解到多个线程中同时执行,充分利用多核处理器的性能,加快任务的完成速度。例如,图像渲染、科学计算等领域可以通过多线程来提高计算效率。
- 异步处理和事件驱动编程:在需要处理多个异步事件或回调的场景中,多线程可以方便地实现事件的并发处理。例如,在图形界面应用程序中,用户的各种操作(如鼠标点击、键盘输入等)可以由不同的线程来处理,保证界面的响应性和流畅性。
- 提高程序的响应性:对于一些需要实时响应的应用程序,如游戏、实时监控系统等,使用多线程可以将实时任务(如游戏画面的更新、传感器数据的读取等)与其他非实时任务(如数据存储、日志记录等)分开处理,确保实时任务能够得到及时响应,提高程序的实时性和可靠性。
简述线程的实现方式,如用户级线程、内核级线程,它们各自的优缺点是什么?
用户级线程
- 实现方式:用户级线程的管理和调度完全由用户空间的线程库来实现,内核并不知道用户级线程的存在。线程库在用户空间维护一个线程控制块(TCB)表,用于记录线程的状态、栈指针等信息。线程的创建、销毁、切换等操作都由线程库通过调用系统函数来完成,但这些操作对内核是透明的。
- 优点
- 实现简单:不需要内核的支持,线程的管理和调度由用户程序自己控制,实现相对简单,可移植性好。
- 切换速度快:由于线程的切换不需要陷入内核,只需要在用户空间进行线程上下文的切换,因此切换速度较快,开销较小。
- 适合特定场景:对于一些不需要频繁进行系统调用的计算密集型任务,用户级线程可以充分发挥其高效的特点,提高程序的执行效率。
- 缺点
- 无法利用多核:因为内核只能看到进程,而不知道用户级线程的存在,所以在多核处理器环境下,同一进程中的多个用户级线程只能在一个处理器核心上运行,无法充分利用多核处理器的并行性。
- 阻塞问题:如果一个用户级线程执行了阻塞系统调用(如 I/O 操作),那么整个进程都会被阻塞,其他用户级线程也无法继续执行。
- 缺乏内核支持:由于没有内核的直接支持,用户级线程在处理一些复杂的系统资源分配和管理问题时会比较困难,例如内存管理、进程间通信等。
内核级线程
- 实现方式:内核级线程的管理和调度由操作系统内核负责。内核为每个线程维护一个线程控制块(TCB),记录线程的相关信息,如线程的状态、优先级、寄存器值等。内核通过调度算法来决定哪个线程可以运行,并负责线程的创建、销毁和切换等操作。线程的切换需要通过系统调用陷入内核,由内核来完成上下文的切换。
- 优点
- 支持多处理器并行:内核可以将不同的线程分配到不同的处理器核心上运行,充分利用多核处理器的并行性,提高系统的整体性能。
- 并发性能好:当一个内核级线程执行阻塞操作时,内核可以调度其他线程继续执行,不会导致整个进程阻塞,从而提高了系统的并发性能。
- 内核支持全面:内核可以为线程提供全面的支持,包括内存管理、进程间通信、中断处理等,使得线程能够方便地访问系统资源和进行各种操作。
- 缺点
- 切换开销大:线程的切换需要陷入内核,进行上下文的切换,涉及到内核态和用户态的转换,以及保存和恢复大量的寄存器信息等,因此切换开销较大,速度相对较慢。
- 实现复杂:内核需要维护大量的线程相关数据结构和执行复杂的调度算法,这增加了操作系统内核的复杂性和实现难度。
- 占用资源多:每个内核级线程都需要内核为其分配独立的栈空间、TCB 等资源,因此占用的系统资源相对较多,在内存有限的情况下,可创建的线程数量相对较少。
7.进程调度
进程调度的主要任务是什么?有哪些常见的调度算法?
主要任务
-
分配处理器资源:根据一定的策略,将 CPU 资源分配给处于就绪状态的进程,决定哪个进程可以获得 CPU 的使用权,并让其在 CPU 上运行。
-
提高资源利用率:通过合理的调度算法,尽可能地提高 CPU 的利用率,减少 CPU 的空闲时间,同时也要兼顾其他系统资源(如内存、I/O 设备等)的合理利用,以提高整个系统的性能。
-
保证系统的公平性和响应性:确保每个进程都能在一定时间内获得 CPU 资源,避免某些进程长时间得不到调度而处于饥饿状态。同时,要满足不同类型进程的响应时间要求,例如对于交互式进程,要保证其能够快速响应,以提供良好的用户体验。
调度概念
调度实现
调度目标
进程切换
常见调度算法
请分别阐述不同调度算法的原理、特点及适用场景,如先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转调度等。
先来先服务(FCFS)调度算法
- 原理:按照进程到达就绪队列的先后顺序,依次分配 CPU 资源。先到达的进程先执行,直至该进程完成任务或者因等待资源而阻塞,之后才会调度下一个进程。
- 特点:
- 算法实现简单,无需额外复杂的计算,只需记录进程到达的先后顺序即可。
- 公平性较高,每个进程按照到达顺序依次执行,不会出现某个进程优先于早到进程执行的情况。
- 平均等待时间可能较长,尤其是当长进程先到达时,后续短进程需要等待较长时间才能执行。
- 适用场景:适用于对公平性要求较高,且对进程执行顺序没有特殊要求的批处理系统。例如,在一些后台数据处理任务中,每个任务的重要性相同,采用 FCFS 算法可以保证任务按提交顺序依次处理。
短进程优先(SPF)调度算法
- 原理:从就绪队列中挑选预计运行时间最短的进程分配 CPU 资源。若有多个进程同时到达,选择运行时间最短的进程先执行。
- 特点:
- 能有效降低平均周转时间,提高系统吞吐量,因为短进程可以快速完成,减少了整体的等待时间。
- 需要预先知道进程的运行时间,然而在实际系统中,进程的运行时间往往难以准确预估。
- 可能导致长进程饥饿,即长进程长时间得不到 CPU 资源,因为不断有短进程进入就绪队列并优先执行。
- 适用场景:适用于进程运行时间差异较大,且对系统吞吐量要求较高的批处理系统。比如在科学计算场景中,有大量短计算任务和少量长计算任务,采用 SPF 算法可以让短任务快速完成,提高整体计算效率。
时间片轮转调度算法
- 原理:将 CPU 时间划分成固定长度的时间片。就绪队列中的进程按照先后顺序依次获得一个时间片的 CPU 使用权。当时间片用完,无论进程是否执行完毕,都会暂停执行并被放回就绪队列尾部,等待下一次调度。
- 特点:
- 响应时间有保障,每个进程在一个时间片内都有机会执行,能及时响应外部请求,用户体验较好。
- 公平性较好,所有进程都能在一定时间内获得 CPU 资源,不会出现某个进程长期独占 CPU 的情况。
- 若时间片设置不当,可能会导致频繁的进程切换,增加系统开销。时间片过长,算法会退化为 FCFS 算法;时间片过短,进程切换过于频繁,降低了 CPU 的有效利用率。
- 适用场景:适用于交互式系统,如操作系统的用户界面、实时监控系统等。在这些系统中,需要及时响应用户的操作,时间片轮转调度算法可以保证每个进程都能快速响应,提高系统的交互性。
优先级调度算法
-
原理:为每个进程分配一个优先级,调度器根据优先级的高低来决定进程的执行顺序。优先级高的进程优先获得 CPU 资源。优先级可以是静态的(在进程创建时确定且不再改变),也可以是动态的(根据进程的运行情况动态调整)。
-
特点:
-
可以根据进程的重要性、紧急程度等因素来分配资源,能满足不同进程的需求。例如,对于实时进程可以赋予较高的优先级,确保其能及时执行。
-
若优先级设置不合理,可能会导致低优先级进程饥饿,长时间得不到 CPU 资源。
-
动态优先级的实现相对复杂,需要根据进程的运行时间、等待时间等因素实时调整优先级。
-
-
适用场景:适用于对进程执行顺序有严格要求,且需要根据进程的重要性进行资源分配的系统。例如,在航空交通管制系统中,对飞机的调度需要根据航班的紧急程度、飞行状态等因素赋予不同的优先级,以确保飞行安全。
多级队列调度算法
多级反馈队列调度算法
-
原理:设置多个就绪队列,每个队列有不同的优先级,优先级越高的队列时间片越短。新进程进入系统后,先进入最高优先级队列,按时间片轮转方式执行。若在一个时间片内未完成,会被移到下一个优先级队列。只有当高优先级队列中没有进程时,低优先级队列中的进程才会获得 CPU 资源。
-
-
特点:
-
综合了时间片轮转和优先级调度的优点,既能保证短进程快速完成,又能兼顾长进程的执行。
-
能较好地适应不同类型的进程,对于短进程,可能在高优先级队列中快速完成;对于长进程,随着时间推移,会逐渐进入低优先级队列,避免长时间等待。
-
队列的设置和优先级的调整需要根据系统的特点进行合理配置,否则可能无法达到理想的调度效果。
-
-
适用场景:适用于通用操作系统,能处理各种类型的进程,如批处理任务、交互式任务等。在现代操作系统中,多级反馈队列调度算法被广泛应用,以提高系统的整体性能和响应能力。
基于公平的调度算法
在实时系统中,有哪些特殊的调度算法?它们是如何满足实时性要求的?
实时系统要求对外部事件做出及时响应,确保任务在规定的时间内完成。以下是一些实时系统中常见的特殊调度算法及其满足实时性要求的方式:
最早截止时间优先(EDF)调度算法
- 原理:根据任务的截止时间来分配 CPU 资源,截止时间越早的任务优先级越高,优先获得 CPU 执行。
- 满足实时性要求的方式:系统总是选择当前截止时间最早的任务进行调度,保证在截止时间前完成任务。只要系统中所有任务的总利用率不超过系统的处理能力,理论上所有任务都能在截止时间内完成。例如,在一个工业自动化控制系统中,有多个传感器数据采集任务,每个任务都有不同的截止时间,EDF 算法会优先调度截止时间近的任务,确保数据能及时处理和反馈,以维持系统的正常运行。
最低松弛度优先(LLF)调度算法
- 原理:任务的松弛度是指任务的截止时间减去其剩余执行时间再减去当前时间。松弛度越小,任务的优先级越高。LLF 算法总是选择松弛度最小的任务投入运行。
- 满足实时性要求的方式:该算法动态地根据任务的松弛度来调整优先级,能更灵活地应对任务执行过程中的各种变化。例如,在一个多媒体播放系统中,同时存在音频和视频解码任务,当视频任务的剩余时间较少且接近截止时间时,其松弛度变小,会优先于音频任务获得 CPU 资源,以保证视频播放的流畅性,满足实时性要求。
速率单调调度(RMS)算法
- 原理:根据任务的周期来分配优先级,周期越短,优先级越高。假设任务的执行时间固定,周期短意味着任务需要更频繁地执行,对实时性要求更高。
- 满足实时性要求的方式:通过给周期短的任务更高的优先级,确保它们能更频繁地获得 CPU 资源,从而在规定的周期内完成任务。例如,在一个实时监控系统中,一些关键传感器需要频繁采集数据,其任务周期较短,RMS 算法会赋予这些任务较高的优先级,保证数据能及时采集和处理,以实现对监控对象的实时监测。
这些调度算法在实时系统中通过合理分配 CPU 资源,根据任务的截止时间、松弛度或周期等因素来确定任务的执行顺序,从而满足实时性要求,确保系统能够可靠、及时地响应外部事件和完成关键任务。
8.多处理器调度
9.死锁
什么是死锁?产生死锁的原因和必要条件是什么?
死锁是指在多进程或多线程系统中,两个或多个进程(线程)因竞争资源而造成的一种互相等待的僵持局面,若无外力作用,它们都将无法推进。
产生死锁的原因
- 资源竞争:系统中存在多个进程(线程)同时竞争有限的资源,如打印机、内存空间等。当资源分配不当时,就可能导致死锁。例如,进程 A 占用了打印机,同时请求内存空间;进程 B 占用了内存空间,同时请求打印机,此时若不进行合理的资源分配和调度,就会产生死锁。
- 进程推进顺序不当:进程在运行过程中,请求和释放资源的顺序不合理,也可能引发死锁。例如,有三个进程 P1、P2、P3,它们分别需要资源 R1、R2、R3。如果 P1 先占用了 R1,然后 P2 占用了 R2,接着 P3 占用了 R3,此时 P1 请求 R2,P2 请求 R3,P3 请求 R1,就会形成死锁。
产生死锁的必要条件
- 互斥条件:进程对所分配到的资源进行排他性使用,即在一段时间内某资源只能被一个进程占用。如果此时还有其他进程请求该资源,则请求者只能等待,直至占有资源的进程释放该资源。例如,打印机在某一时刻只能被一个进程使用,不能同时被多个进程共享。
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。例如,一个进程已经占用了一部分内存空间,又请求打印机资源,在等待打印机资源的过程中,它不会释放已占有的内存空间。
- 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,只能由获得该资源的进程自己释放。例如,一个进程正在使用的 CPU 资源,不能被其他进程直接抢占,必须等该进程主动放弃 CPU。
- 循环等待条件:存在一个进程资源的循环等待链,链中的每一个进程已获得的资源同时被链中下一个进程所请求。例如,进程 P1 等待进程 P2 占用的资源,进程 P2 等待进程 P3 占用的资源,进程 P3 又等待进程 P1 占用的资源,形成一个循环等待的局面。
死锁与饥饿
死锁处理方式比较
预防死锁
如何预防死锁?请列举一些常见的预防死锁的方法。
破坏互斥条件
-
方法:允许资源共享使用,避免资源的排他性占用。
-
示例:对于可重入的代码段或数据,允许多个进程同时访问,只要访问的方式是安全的,就不会出现数据不一致等问题。例如,多个进程可以同时调用一个纯函数,该函数不会修改全局变量或共享资源,因此可以在多个进程中并发执行。
破坏请求和保持条件
-
方法:采用资源预分配策略,要求进程在开始执行前一次性申请它所需要的所有资源,在资源未满足前,不允许进程执行。
-
示例:一个大型的数据库事务处理系统,在执行一个复杂的事务之前,先将该事务可能涉及到的所有表、索引等资源一次性申请到位,然后再开始执行事务,这样就避免了在事务执行过程中因请求新资源而产生死锁的情况。
破坏不可剥夺条件
-
方法:当一个进程占有了某些资源而又申请新的资源不能满足时,可剥夺该进程已占有的资源,分配给其他进程。
-
示例:在分时操作系统中,当一个优先级较高的进程需要使用 CPU 资源时,可以剥夺正在运行的低优先级进程的 CPU 资源,分配给高优先级进程使用,以保证高优先级进程能够及时执行,避免因资源被低优先级进程长期占用而导致死锁。
破坏循环等待条件
-
方法:对资源进行排序,规定进程必须按照资源编号的升序或降序来请求资源,避免形成循环等待链。
-
示例:系统中有打印机、扫描仪、绘图仪等多种设备资源,为它们分别编号为 1、2、3。规定进程在请求资源时,只能按照从小到大的顺序进行申请。例如,一个进程如果已经申请了绘图仪(资源 3),那么它接下来只能申请编号大于 3 的资源,而不能再申请打印机(资源 1)或扫描仪(资源 2),这样就破坏了循环等待条件,防止死锁的发生。
避免死锁
死锁的避免与预防有什么区别?简述银行家算法的原理和实现过程。
死锁的预防是通过破坏死锁产生的必要条件,使死锁不可能发生;而死锁的避免是在资源动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁的发生。两者的主要区别在于:
- 方法不同:死锁预防是通过限制资源请求和分配的方式,事先破坏死锁产生的条件;死锁避免则是在资源分配过程中,根据系统当前状态,动态地判断资源分配是否安全,以决定是否分配资源。
- 资源利用率不同:死锁预防通常会对资源的使用和分配施加较多限制,可能导致资源利用率较低;死锁避免相对来说对资源的限制较少,资源利用率可能更高。
银行家算法是一种经典的死锁避免算法,以下是其原理和实现过程:
原理
- 把操作系统比作银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于顾客向银行家贷款。
- 银行家在给顾客贷款时,要考虑是否能在有限的时间内收回贷款,以保证银行资金的安全。同样,操作系统在为进程分配资源时,要判断此次分配后系统是否处于安全状态,即系统是否能找到一个安全序列,使所有进程都能顺利完成。如果存在安全序列,则分配资源;否则,不分配资源,让进程等待。
检测死锁
如何检测死锁?当检测到死锁后,有哪些解除死锁的方法?
死锁检测是指系统定期检查系统是否处于死锁状态,以便及时发现并采取措施解除死锁。以下是死锁检测的方法以及检测到死锁后解除死锁的方法:
死锁检测方法
- 资源分配图法
- 原理:用有向图来描述进程和资源之间的分配关系。图中节点分为进程节点和资源节点,有向边表示资源的分配或请求关系。如果资源分配图中存在环路,且环路上的每个资源都只有一个实例被进程占用,那么系统可能发生了死锁。
- 示例:有进程 P1、P2 和资源 R1、R2,P1 持有 R1 并请求 R2,P2 持有 R2 并请求 R1,这样就形成了一个环路,可能存在死锁。
- 利用数据结构记录资源分配和请求信息
- 原理:操作系统维护一些数据结构,如进程资源表、资源分配表等,记录每个进程占用的资源以及请求的资源。通过遍历这些数据结构,检查是否存在进程相互等待资源的情况,从而判断是否发生死锁。
- 示例:在一个多进程系统中,系统不断更新进程资源表和资源分配表。若发现进程 A 等待的资源被进程 B 占用,而进程 B 等待的资源又被进程 A 占用,就可以判定出现了死锁。
解除死锁的方法
- 资源剥夺法
- 原理:从其他进程中抢占足够的资源给死锁进程,以解除死锁。选择被抢占资源的进程时,通常要考虑进程的优先级、已运行时间等因素,尽量减少对系统的影响。
- 示例:若进程 P1 和 P2 发生死锁,P1 优先级较低,系统可暂时剥夺 P1 占用的部分资源分配给 P2,使 P2 能够继续执行并释放资源,从而解除死锁。
- 撤销进程法
- 原理:强制撤销部分或全部死锁进程,并剥夺它们占用的资源。可以选择撤销代价最小的进程,如优先级最低、运行时间最短的进程等。
- 示例:有三个进程 P1、P2、P3 陷入死锁,经过评估,P3 是一个不重要的后台进程,运行时间较短,那么可以撤销 P3,释放其资源,打破死锁局面。
- 进程回退法
- 原理:让死锁进程回退到某个先前的安全状态,重新分配资源。这需要系统具有进程回退的机制,能够记录进程的执行状态和资源分配情况。
- 示例:进程 P 在执行过程中发生死锁,系统将其回退到若干步之前的状态,此时 P 还没有请求导致死锁的资源,然后按照新的资源分配策略为 P 分配资源,避免死锁的发生。
三、内存管理
1.内存管理
1.1基本原理
-
什么是内存管理?其主要功能有哪些?
- 内存管理是操作系统中对内存资源进行管理和控制的机制。主要功能包括内存分配与回收、地址映射、内存保护、内存扩充等。
-
解释逻辑地址、物理地址、地址空间和存储空间的概念。
- 逻辑地址是程序中使用的地址,由段地址和段内偏移量组成;
- 物理地址是内存中实际的地址;
- 地址空间是指程序所拥有的逻辑地址范围,
- 存储空间是指内存中实际可用的物理空间。
程序的链接与装入
装入
链接
进程内存映像
内存保护