这一页PPT展示了用户与操作系统的交互方式以及操作系统内部程序运行的关键机制。
用户与操作系统的交互层面
- 交互接口类型
- CLI(命令行):提及了 Shell 和 PowerShell 两种常见形式。
- GUI(图形用户界面):描述为操作介面、操作面板或触控形式。
- Batch(批处理):介绍了.bat 和.sh 两种文件类型用于批处理操作。
操作系统内部程序运行机制层面
- 系统调用相关
- 系统调用的触发:应用程序在运行过程中会触发系统调用,例如发生异常(如除零错误)或者硬件中断(I/O 请求)时,CPU 会暂停普通指令执行来进行系统调用。
- 系统调用示例:给出了 printf () 函数作为应用程序中涉及系统调用的例子。
- 模式切换相关
- 双模式介绍:操作系统运行在双模式下,包括用户模式(用 0 表示)和内核模式(用 1 表示),通过 PSW 寄存器的 Bit 位来区分这两种模式。
- 模式切换机制:通过陷阱机制(Trap)实现模式切换(中断),以 sys_write () 函数为例说明了从用户模式切换到内核模式的过程。
这一页PPT主要介绍了操作系统中的文件系统相关知识,包括虚拟文件系统的缓存以及多种文件系统的特性对比,同时提及了磁盘分区的结构
虚拟文件系统缓存
包括 Inode Cache、Page Cache(涉及多种文件系统如 Ext2、Ext4、XFS、NFS、proc、sysfs、ramfs 等)以及 Directory Cache 和 Buffer Cache,还有 Device Drivers。
就像我们在图书馆找书,图书馆管理员可能会有一些快速查找的小技巧和记录(缓存)。在计算机里,操作系统也有类似的 “小技巧” 来更快地找到文件。这里提到了几种缓存,比如 Inode Cache(它可能和文件的一些重要信息记录有关),还有和不同文件系统相关的 Cache Page(就好像针对不同类型书籍的专门查找记录),以及 Directory Cache(可能和目录信息有关)和 Buffer Cache(也许和数据缓冲有关),另外还有 Device Drivers(它就像连接计算机和各种设备的桥梁,让计算机能和硬盘等设备通信来处理文件)。
文件系统特性
列举了多种文件系统及其相关特性:
- ext2:最大文件名长度为 255 bytes,最大文件大小为 2TB,最大分区大小为 16TB。
- ext3:最大文件名长度为 255 bytes,最大文件大小为 2TB,最大分区大小为 16TB。
- ext4:最大文件名长度为 255 bytes,最大文件大小为 16TB,最大分区大小为 1EB。
- XFS:最大文件名长度为 255 bytes,最大文件大小为 8EB,最大分区大小为 8EB。
- Btrfs:最大文件名长度为 255 bytes,最大文件大小为 16EB,最大分区大小为 16EB。这里介绍了几种常见的文件系统,就像不同的图书馆管理规则。
ext2、ext3:这两种文件系统有点像比较老的图书馆管理规则,它们规定文件名最长是 255 个字节,文件最大能到 2TB,分区最大能到 16TB。
ext4:它是一种更新的规则,文件名长度还是 255 字节,但文件最大能到 16TB,分区最大能到 1EB(这是一个非常大的数字)。
XFS 和 Btrfs:它们也是不同的文件系统,有自己的规则。XFS 规定文件名 255 字节,文件最大 8EB,分区最大 8EB;Btrfs 规定文件名 255 字节,文件最大 16EB,分区最大 16EB。
磁盘分区结构
介绍了 MBR/GPT Group 结构,包括 Inode table、Super block 等结构,以及分区内的 Inode、Block bitmap、Inode bitmap 等相关内容,还展示了不同分区(如 /dev/sdb1、/dev/sdb2、/dev/sdb3)中数据块的存储方式,如 Direct block、Indirect block、Double indrect、Triple indrect 等。
想象我们的硬盘是一个大仓库,要把它分成不同的区域来存放东西。这里的 MBR/GPT Group 结构就是一种分区的方式,就像仓库里的货架分区。里面有 Inode table(可能和文件的索引信息有关)、Super block(也许是关于整个分区的一些重要信息)等结构。每个分区(比如 /dev/sdb1、/dev/sdb2、/dev/sdb2 等)里还有 Inode(可能是文件的一个重要标识)、Block bitmap(也许是记录哪些数据块被占用了)、Inode bitmap(可能是记录哪些 Inode 被占用了)等。而且数据在硬盘里的存放方式也有不同,像 Direct block(直接存放数据的块)、Indirect block(间接存放数据的块)、Double indrect(双重间接存放数据的块)、Triple indrect(三重间接存放数据的块)等,就好像有些东西直接放在货架上,有些东西放在盒子里,盒子又放在货架上,或者更复杂的存放方式。
这一页PPT强调了中断机制对操作系统和程序并发的重要性,并介绍了中断的作用、分类以及基本实现原理
1. 进程基础知识
1.1. 进程的基本概念
任务管理器
任务管理器中显示的就是进程。
进程是程序的一次执行过程,是一个动态的实体,具有程序计数器和相关资源。在任务管理器中,每个运行的程序实例都对应一个进程。例如,文档中提到同一个程序多次执行会对应多个进程,像多次打开腾讯 QQ(32 位)就会有多个对应的进程在任务管理器中显示。
任务管理器中进程相关信息体现
进程名称:如腾讯 QQ(32 位)、Adobe Genuine Software Integrity Service 等,这些是正在运行的程序名称,每个名称对应一个进程。
进程状态相关信息
- CPU 使用率:显示进程占用 CPU 的百分比,体现了进程在执行过程中对 CPU 资源的需求情况。例如某个进程显示 19% CPU,说明该进程当前正在使用的 CPU 资源占总 CPU 资源的 19%。
- 内存使用率:反映进程占用内存的情况,如 45% 内存表示该进程占用了系统总内存的 45%(这里是一个大致比例,基于当前系统内存使用情况)。
- 磁盘和网络使用率等:这些指标从不同方面展示了进程在运行过程中对磁盘 I/O 和网络资源的使用情况。
任务管理器中进程特性体现
进程的动态性和资源占用
文档强调进程是动态执行过程且占用资源,任务管理器中的这些信息直观地展示了进程在运行过程中的资源占用情况,包括 CPU、内存、磁盘和网络等方面,符合进程的动态和资源占用特性。
多个进程并发执行
任务管理器中同时显示多个进程,这也体现了文档中提到的进程并发概念,即多个进程可以同时存在并共享系统资源(如 CPU),在任务管理器中可以看到不同进程对资源的竞争和使用情况。
Q:操作系统是这些进程的管理者,它要怎么区分各个进程?
A:通过PID
程序与进程
程序是静态的指令集合,存于磁盘(可执行文件,如.exe)。
程序是一个被动实体,比如一个包含指令的文件(存储在磁盘上,通常称为可执行文件,例如.exe)。当一个可执行文件被加载到内存中时,程序就变成了进程。
进程是程序加载到内存后的动态执行过程,有程序计数器指定下一条指令,还有相关资源。
进程是一个活动实体,具有一个程序计数器(PC),用于指定要执行的下一个指令以及一组相关的资源。
进程与程序的关系:一个程序可对应多个进程。
该图展示了程序从磁盘加载到内存并实例化为进程的过程。
程序到进程的实例化
程序最初存储在磁盘上,包含一系列指令(Instruction #1、Instruction #2 等),当程序加载到内存(RAM)后,实例化成为进程(Process #1 等)。
线程相关
展示了一个包含线程指针及其优先级的表格(Table of thread pointers and their priorities),列举了不同优先级的线程,如 Thread #1(high)、Thread #2(low)、Thread #3(med)、Thread #4(low)等。
进程调度
涉及到一个调度器(Scheduler,是操作系统的一部分),它负责从多个进程(如 Process #2、Process #M 等)和线程中选择合适的线程(如 Thread #K(high))进行执行,包括选择执行(Select for execution)、抢占(Preemption)和执行(Execute)等操作。
程序计数器是一个 CPU 中的寄存器,它存放着下一条要执行指令的内存地址。在 Intel x86 和 Itanium 微处理器中,它也叫做指令指针(Instruction Pointer,IP),有时又称为指令地址寄存器(instruction address register,IAR)或指令计数器。
Q:“PC=PC+1”到底增加了什么内容?
A:“PC = PC + 1” 指的是程序计数器(PC)的值增加操作。
当 CPU 取完一条指令之后,会将 PC 寄存器的值加 “1”,这里增加的 “1” 实际上是指下一条指令相对于当前指令在内存中的偏移量为 1 个存储单元(一般以字节为单位,具体取决于计算机的指令集架构)。这是一种顺序执行指令的机制,使得 CPU 能够按照程序中指令的排列顺序依次执行。例如,如果当前 PC 指向内存地址为 0x1000 的指令,执行 “PC = PC + 1” 后,PC 将指向内存地址为 0x1001 的指令(假设每个指令占用 1 个字节的内存空间),从而实现程序指令的顺序执行。
进程的内存结构
内存结构组成
栈(stack)用于存放局部变量和函数返回地址。函数调用时,局部变量在栈上分配空间,函数执行完毕后通过栈指针(SP)恢复到调用前的状态。
把栈想象成一个放临时物品的架子。
当函数被调用时,就像有人开始使用这个架子,函数里的局部变量就像放在架子上的小物品,每个函数调用都有自己对应的 “小空间” 在栈上。
当函数执行完了,就像这个人用完架子走了,通过栈指针(SP)这个 “管理员”,架子又恢复到之前的状态,准备给下一个函数调用使用。
堆(heap)是程序运行时动态内存分配的区域。通过 malloc 函数在堆上分配内存,使用 free 函数释放内存。
堆是一个可以灵活使用的空间,就像仓库里有一块空地,可以根据需要随时划分出不同大小的区域来放东西。
在程序里,通过 malloc 函数就像在空地上圈出一块地方来存放数据,使用完了再用 free 函数把这块地方 “清理” 出来,给其他需要的地方使用。
数据段(data section)存放全局变量和静态变量。例如定义的全局计数器变量就存放在这里。
这是存放一些公共物品的区域,就像仓库里专门放大家都可能用到的工具的地方。
全局变量和静态变量就像这些公共工具,整个程序都可能会用到它们,所以放在数据段这个 “公共区域”。比如一个全局的计数器变量,就像一个大家都能看到和使用的计数器放在这里。
文本段(text section)存放程序代码,通常是只读的,包含编译器生成的二进制指令。
这就像仓库里专门存放产品说明书的房间。程序代码就像产品说明书,告诉计算机要做什么。而且这个房间里的说明书是只读的,不能随便修改,里面是编译器生成的二进制指令,就像说明书上用一种特殊的语言写的操作步骤。
相关指针
SP(堆栈指针):与栈相关,用于指示栈的相关操作。
SP 就像栈这个架子的管理员,它知道栈上每个物品(局部变量)的位置,通过它可以准确地找到东西,也可以把栈恢复到正确的状态。
PC(程序计数器):用于指示程序代码执行的位置,存放着下一条要执行指令的内存地址。
PC 就像一个指路人,它指着程序代码这个 “说明书” 上当前要执行的步骤(指令)的位置,并且知道下一个要执行的步骤在哪里,也就是存放着下一条要执行指令的内存地址。
并发与并行
并发概念
指多个事件或情况同时发生或存在,在这里是多个进程同时存在并共享 CPU。
与并行的区别
- 并行:指同时运行,多个任务在多个 CPU 上同时执行,无资源共享和干扰问题。
- 并发:在共享 CPU 情况下,多个进程交替执行,可能走走停停,一个进程可能被另一个替换占有 CPU(进程切换),动机是多道程序设计,因 CPU 数量有限。
进程并发的动机
多道程序设计
为什么不叫“并行的进程”?
因为计算机共享CPU! 多CPU,且执行完全独立 (CPU数量是有限的)
大多数计算机系统中,即使有多个 CPU(包括多核 CPU 这种情况),从操作系统和应用程序的角度来看,进程是共享这些 CPU 资源的。这意味着多个进程需要竞争使用 CPU 时间片来执行自己的指令。例如,在一个四核 CPU 的计算机上,可能同时有几十个甚至上百个进程在运行,这些进程并不能各自独占一个 CPU 核心一直运行下去,而是需要由操作系统进行调度,每个进程轮流使用 CPU 核心的一部分时间(时间片)来执行。
“多 CPU” 指计算机可能配备了多个物理 CPU 或者是多核 CPU。例如,服务器可能有多个物理 CPU,而普通的桌面电脑可能是多核 CPU(如四核、六核等)。
“执行完全独立” 是指每个 CPU 核心在理论上都可以独立地执行指令,不受其他 CPU 核心的直接干扰。比如在一个四核 CPU 中,每个核心都可以同时处理不同的任务。
然而,“CPU 数量是有限的” 强调尽管有多个 CPU 或多核 CPU,但相对于可能同时运行的大量进程来说,CPU 资源仍然是不够的。所以不能让每个进程都独占一个 CPU 核心进行完全并行的执行,而是需要采用并发的方式,让多个进程共享这些有限的 CPU 资源,通过操作系统的调度,在微观上交替使用 CPU,在宏观上实现多个进程同时运行的效果。
单道程序与多道程序
单道程序
定义
单道程序是指计算机系统在某个时间段内只能执行一个程序,该程序独占计算机系统的所有资源,直到它执行完毕。
特点
- 顺序性:程序中的指令按照编写的顺序依次执行,不会出现跳跃或中断(除非遇到异常情况)。
- 封闭性(独占性):程序在执行过程中独占计算机的各种资源,如 CPU、内存、I/O 设备等,其他程序无法同时使用这些资源。
- 可再现性:只要初始条件相同,程序每次执行的结果都是相同的。
单道程序不具有并发特性,因为它在某个时间段内只能执行一个程序。
单道程序不具有并行特性,因为它只有一个程序在执行,不存在多个任务同时执行的情况。
多道程序
定义
多道程序是指在计算机系统中同时存放多个程序,这些程序在宏观上是同时运行的,但在微观上是交替执行的,它们共享计算机系统的各种资源。
特点
- 间断性(间接制约和直接制约)
- 间接制约:多个程序共享资源时,由于资源有限,一个程序对资源的使用可能会影响其他程序的执行,导致程序执行出现间断。例如,多个程序都需要使用打印机,当一个程序占用打印机时,其他程序就需要等待。
- 直接制约:程序之间可能存在逻辑上的依赖关系,一个程序的执行结果可能是另一个程序执行的前提条件,这也会导致程序执行的间断。
- 失去封装性和可再现性:由于多个程序共享资源且相互影响,程序的执行环境不再是封闭的,执行结果可能会因为其他程序的干扰而发生变化,不再具有可再现性。
多道程序设计是实现并发的一种手段,通过在计算机系统中同时存放多个程序,并让它们共享资源,实现了在宏观上多个程序同时运行的效果,也就是并发。
多道程序主要关注的是多个程序在宏观上的并发执行,而并行则是强调多个任务在多个 CPU 上的同时执行。多道程序可以在多核 CPU 环境下实现一定程度的并行,即多个进程可以同时在不同的 CPU 核心上执行,但这并不是多道程序本身的核心概念,多道程序的核心是共享资源和并发执行。
进程的定义
进程在物理内存
进程在内存中离散存放
Q:进程在物理内存离散存放有什么好处?
好处
提高内存利用率:离散存放可以更灵活地利用内存空间。当内存中有许多小的空闲块时,离散存放的进程可以更好地适配这些空闲块,而不是像连续存放那样需要一大块连续的内存空间。这样可以减少内存碎片的产生,使内存的整体利用率得到提高。
便于内存动态分配和管理:操作系统可以根据进程的实际需求,动态地为进程分配物理内存空间。离散存放使得内存管理系统能够更方便地找到合适的空闲内存块进行分配,而不需要维护大量连续的空闲内存区域。这种动态分配方式有助于更好地满足不同进程在不同阶段对内存的需求。
Q:进程在物理内存离散存放有什么问题?
增加内存访问时间:由于进程在物理内存中是离散存放的,当进程运行时,可能需要频繁地在不同的内存块之间进行访问。与连续存放相比,这种离散访问可能会导致更多的内存地址转换和数据传输操作,从而增加了内存访问的时间延迟。这可能会对进程的运行效率产生一定的影响,尤其是对于对内存访问速度要求较高的应用程序。
内存管理复杂性增加:离散存放需要更复杂的内存管理机制。操作系统需要记录每个进程在物理内存中的各个离散块的位置信息,以及这些块之间的关联关系。同时,在进行内存分配和回收时,需要处理各种可能出现的情况,如内存碎片的合并、空闲内存块的查找和选择等。这种复杂性增加了内存管理系统的设计和实现难度,也可能会引入更多的错误和性能问题。
1.2. 进程状态
五态模型
七态模型
基本状态
运行态(Running)
定义:进程的代码在 CPU 上运行。
特点:单 CPU 时同一时刻只有一个进程处于此状态;多核 CPU 时可能有多个进程处于运行态。
就绪态(Ready)
定义:进程具备运行条件,但由于没有空闲 CPU 而暂时不能运行。
等待态 / 阻塞态(Waiting/Blocked)
定义:进程在等待某些事件的发生,比如 I/O 操作结束或是一个信号,不具备运行条件。
其他状态
创建态(New)
定义:进程正在被创建,操作系统为进程分配资源,初始化进程控制块(PCB)。
终止态(Terminated)
定义:进程正在从系统中挖掘,操作系统会回收进程拥有的资源,撤销 PCB。
挂起状态
- 阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现。
- 就绪挂起状态:进程在外存(硬盘),但只要进入内存,即刻就能运行。
进程队列
进程队列管理的是 PCB
就绪队列(Ready queue)
- 有一个队头指针,队列中的元素是一系列的进程控制块(PCB),如 pcb1、pcb2 到 pcb n。这些 PCB 按照一定顺序排列,通过 next 指针指向下一个 PCB。
- 就绪队列用于管理处于就绪状态的进程,即那些已经具备运行条件,等待分配 CPU 的进程。
阻塞队列(Blocked queue)
- 同样有一个队头指针,队列中的元素也是一系列的 PCB,包括 pcb1、pcb2 到 pcb n,通过 next 指针连接。
- 阻塞队列用于管理处于阻塞状态的进程,即那些因为等待某些事件的发生(比如 I/O 操作结束或是一个信号)而不具备运行条件的进程。
1.3. 进程切换
进程切换和进程离开CPU的关系
进程切换是指操作系统将 CPU 的控制权从一个进程转移到另一个进程的过程。这个过程不仅涉及当前运行进程离开 CPU,还包括选择新的进程并将 CPU 控制权交给它,同时还需要保存当前进程的上下文信息,恢复新进程的上下文信息等一系列操作。
时机
进程何时离开CPU?是什么触发了进程切换?
外部事件:进程被剥夺CPU使用权,进入就绪状态。这个动作叫抢占(preempt)。
时间片用完
在分时操作系统中,采用时间片轮转调度算法。每个进程被分配一个时间片,当一个进程的时间片用完时,操作系统会中断该进程的执行,将 CPU 分配给另一个就绪进程,触发进程切换。
外部中断
例如设备发出的 I/O 中断请求。
当一个进程正在等待 I/O 操作完成时,若相应的 I/O 设备完成了操作并发出中断信号,操作系统会暂停当前进程,去处理中断服务程序,然后可能切换到另一个就绪进程。
时钟中断也是一种常见的外部中断。可用于实现时间片轮转调度以及定时任务等。
高优先级进程就绪
如果一个具有更高优先级的进程进入就绪状态,操作系统可能会立即暂停当前正在运行的低优先级进程,将 CPU 分配给高优先级进程,触发进程切换,以保证高优先级的任务能够及时得到处理。
内部事件:进程主动放弃(yield)CPU,进入等待/终止状态。
进程主动放弃 CPU
进程可以通过系统调用主动放弃 CPU 的使用权,例如调用 sleep 函数让自己进入睡眠状态,或者等待某个事件的发生。这种情况下,操作系统会选择另一个就绪进程运行。
进程等待资源
当一个进程需要等待某个资源(如等待输入、等待其他进程释放临界资源等)而进入阻塞状态时,操作系统会将 CPU 分配给其他就绪进程,触发进程切换。
内部中断(异常)
当进程执行过程中出现错误或异常情况,如除零错误、访问非法内存地址等,操作系统会捕获这些异常并进行相应处理,可能导致进程切换。
过程
进程切换时OS要做什么?
1.保存处理机上下文,包括程序计数器和其他寄存器。
定义:进程的上下文是指进程在执行过程中某一时刻的状态信息。它包括了进程执行到的指令位置(程序计数器的值)、寄存器的值、栈中的数据、堆中的数据以及内存中的数据段等相关信息。可以理解为是进程在某个特定时刻的一个 “快照”,这个快照记录了进程运行到该时刻所需要的所有相关信息。
作用:当进程由于某种原因(如中断、时间片用完等)暂停执行,需要切换到其他进程执行时,操作系统需要保存当前进程的上下文信息。这样在以后某个时刻该进程再次被调度执行时,就可以根据保存的上下文信息恢复到之前暂停时的状态,继续正确地执行下去。
2.更新PCB信息。
3.把进程PCB移入相应队列,如就绪、某时间阻塞等队列。
4.选择另一个进程执行,并更新其PCB。
5.更新内存管理的数据结构。
6.恢复处理机上下文。
1.4. 中断
诞生原因
早期的计算机:各程序只能串行执行,系统资源利用率低
为了解决上述问题,人们发明了操作系统(作为计算机的管理者),引入中断机制,实现了多道程序并发执行。
本质:发生中断就意味着需要操作系统介入,开展管理工作。
概念
1. 当中断发生时,CPU立即进入核心态
(原因:发生了中断,就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换、分配I/O设备等)需要使用特权指令,因此CPU要从用户态转为核心态。)
2. 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理
3. 对于不同的中断信号,会进行不同的处理
整个过程:当中断发生时,CPU 立即进入核心态。此时,操作系统获得计算机的控制权,开始处理中断。在核心态下,操作系统可以运行内核程序,而内核程序能够执行特权指令,进行系统管理等关键操作。
CPU上会运行两种程序,一种是操作系统内核程序(是整个系统的管理者),一种是应用程序。
作用
使CPU从用户态切换为核心态,使操作系统获得计算机的控制权
“用户态→核心态”通过中断实现,且中断是唯一途径。
“核心态→用户态” 通过执行特权指令,将程序状态字(PSW)标志位设置为 “用户态”,意味着操作系统主动让出 CPU 使用权。
实现多道程序并发执行
如果没有中断机制,应用程序一旦在 CPU 运行就会一直运行,无法实现并发。中断使操作系统夺回 CPU 使用权,是实现并发的唯一途径。同时,在合适情况下操作系统内核会把 CPU 使用权主动让给应用程序。
分类
内中断
从内中断产生的具体原因来分类
硬件异常:
- 掉电:就像正在运行的电器突然没电了一样,计算机在运行过程中如果失去电源供应,所有正在进行的操作会立即中断。这是一种突发的、不可预见的情况,会导致计算机系统瞬间停止工作。
- 奇偶校验错误:可以想象为在传递信息的过程中,有一个 “校验员” 负责检查信息是否完整准确。如果出现奇偶校验错误,就意味着信息在传输或存储过程中可能被损坏或出现了错误,计算机系统需要中断当前操作来处理这个问题。
程序异常:
- 非法操作:比如你在玩游戏时,试图使用一种游戏规则不允许的方式进行操作,游戏就会报错。在计算机程序中,如果执行了不被允许的指令或操作,系统就会产生中断来阻止这种错误行为继续下去。
- 地址越界:把计算机的内存想象成一个有很多房间的大楼,每个程序只能在特定的房间内活动。如果一个程序试图访问不属于它的房间,就发生了地址越界,系统会中断这个程序的运行以防止出现更严重的问题。
- 断点:这是程序员在调试程序时设置的特殊标记。当程序运行到断点处时,就像汽车遇到红灯一样会停下来,方便程序员检查程序在这个特定位置的状态和数据。
- 除 0 错误:在数学中,我们知道不能除以 0。在计算机程序中,如果出现除以 0 的情况,系统会中断程序的执行,因为这是一个没有意义的操作,可能会导致不可预测的结果。
系统调用(陷阱机制):当程序需要操作系统提供某种服务时,就会通过系统调用的方式向操作系统发出请求。这就像是一个人向政府部门申请某种服务一样。系统调用会触发陷阱机制,使程序从用户模式切换到内核模式,以便操作系统能够执行相应的服务操作。
(一些理解:虽然发生了中断,就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换、分配I/O设备等)需要使用特权指令,因此CPU要从用户态转为核心态,而且中断的诞生就是为了实现了多道程序并发执行和使CPU从用户态切换为核心态,但是中断的产生原因不只是因为系统调用(陷阱机制),也可以说是系统调用(陷阱机制)是对中断规则的利用)
是从内中断的处理结果和严重程度的角度进行分类
陷阱(trap):通常是程序有意触发的中断,目的是为了执行特定的操作,比如进行系统调用或者执行特定的调试操作。可以把陷阱想象成一个故意设置的 “机关”,当程序运行到特定位置时,就会触发这个机关,进入一个特定的处理流程。
故障(fault):当程序在运行过程中出现了一个可以修复的错误时,就会触发故障中断。例如,程序试图访问一个暂时不可用的资源,或者在执行某个操作时出现了一些小问题。操作系统可以尝试修复这个错误,然后让程序继续执行。
终止(abort):这是一种非常严重的情况,当发生不可修复的错误时,系统会触发终止中断。比如,硬件出现了严重故障,或者程序出现了致命的逻辑错误,无法继续执行。在这种情况下,程序会被迫停止,并且可能需要采取一些紧急措施来保护系统的安全和稳定。
外中断
时钟中断
I/O中断(键盘中断、外围设备中断)
过程
1.5. 进程控制块(PCB)
包含信息
程序ID(PID、进程句柄)★:它是唯一的,一个进程都必须对应一个PID。PID一般是一个整形数字。
特征信息★:一般分系统进程、用户进程、或者内核进程等
进程状态★:运行、就绪、阻塞,表示进程现在的运行情况
优先级:表示获得CPU控制权的优先级大小
通信信息:进程之间的通信关系的反映,由于操作系统会提供通信通道
现场保护区:保护阻塞的进程
资源需求、分配控制信息
进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
其他信息:工作单位,工作区,文件信息等
结构体示例
包含struct mm_struct
(涉及内存相关结构)、struct vm_area_struct* mmap
、pgd_t* pgd
等成员,还有task_struct
结构体用于表示进程相关信息,包括进程 ID(pid),以及struct fs_struct
(涉及文件系统相关结构)等。
1.7. 进程调度
1.8. 进程创建
system () 函数:启动新进程,建立独立进程,需等待新进程执行完毕
fork () 函数:复制进程映像,父子进程并发执行,内存空间独立
exec () 函数族:替换进程映像,将新程序加载到当前进程空间运行
2. 封装 / 继承 / 多态知识回顾
2.1. 封装(Encapsulation)
- 概念:将对象的状态和行为包装在一起,隐藏内部实现细节,通过访问修饰符控制访问权限。
- 优点:减少耦合、自由修改类内部结构、精确控制成员变量、隐藏信息。
2.2. 继承(Inheritance)
- 概念:创建基于现有类的新类,复用现有类代码,新类可继承现有类的字段和方法。
- 特点
- 单继承与多重继承:Java 是单继承,但可通过接口变相实现多继承。
- 继承格式:使用 extends 关键字,子类拥有父类非 private 的属性和方法,可扩展。
- 构造器:子类不继承父类构造器,需显式或隐式调用,有参构造器需配适当参数。
- 关键字
- extends:用于类继承类,一个子类只能继承一个父类。
- implements:用于类继承接口,可同时继承多个接口。
- super 与 this:super 调用父类方法或构造器,this 指向当前对象。
- final:修饰类不可被继承,修饰方法不可被重写。
2.3. 多态(Polymorphism)
- 概念:同一行为在不同对象中有不同实现方式,通过方法重写和接口实现。
- 优点:消除类型耦合、可替换、可扩充、接口性、灵活、简化。
- 必要条件:继承、重写、父类引用指向子类对象。
- 实现方式
- 重写(Override)
- 概念:子类定义与父类同名、同参数列表、同返回类型的方法,覆盖父类实现。
- 规则:参数列表、返回类型、访问权限等有严格要求。
- 接口:类似生活中的接口,是方法特征集合,无方法实现。
- 抽象类和抽象方法:抽象类包含抽象方法,子类需实现抽象方法。
- 重写(Override)
2.4. 抽象类(Abstract Class)
- 概念:包含抽象方法的类,不能被实例化,只有非抽象子类可创建对象。
- 特点:不一定包含抽象方法,但有抽象方法必是抽象类,抽象方法无具体实现,构造方法和类方法不能是抽象方法,子类需实现抽象方法(除非子类也是抽象类)。