操作系统

操作系统的特征

并发

并发:是指两个或多个时间在用一时间间隔内发生,这些时间宏观上是同时发生的,但微观上是交替发生的

并行:是指,两个或多个事件在同一时刻同时发生

操作系统的并发性是指:计算机系统中“同时”运行着多个程序,这些程序宏观上看是运行着的,而微观上看是交替运行的

单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行

多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行

共享

共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。

image-20251021175541893

所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)

生活实例:

虚拟

虚拟是指,把一个物理上的实体变为若干个逻辑上的对应物。物理实体是存在的,而逻辑上对应物是用户感受到的

虚拟技术中的“时分复用技术”。微观上处理机在各个微小的时间段内交替着为各个进程服务

异步

异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一管到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性

image-20251102162211524

只有系统拥有并发性,才有可能导致异步性

没有并发和共享,就谈不上虚拟和异步,因此,并发和共享是操作系统的两个最基本的特征

操作系统的发展与分类

手工操作阶段

image-20251102163047812

批处理阶段 --- 单道批处理系统

image-20251102163156330

image-20251102163334239

批处理阶段 --- 多道批处理系统

image-20251102163641689

分时操作系统

image-20251102163808095

实时操作系统

优点:能够优先响应一些紧急任务,某些紧急任务不需要时间片排队。

在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时间内处理完事件。实时操作系统的主要特点是及时性和可靠性

实时操作系统分为两周:

操作系统的运行机制

应用程序分为两种:

那么 CPU 如何判断出此时正在运行的是内核程序还是应用程序?

CPU 有两种状态,“内核态”和“用户态”

CPU 中有一个寄存器叫 程序状态字寄存器(PSW),其中有个二进制位,1 表示内核态,0 表示用户态

image-20251102170011644

中断和异常

中断的作用

在合适的情况下,操作系统内核会把 CPU 的使用权主动让给应用程序

“中断”是让操作系统夺回 CPU 使用权的唯一途径

如果没有中断机制,那么一旦应用程序上 CPU 运行,CPU 就会一直运行这个应用程序

中断的类型

内中断(也称异常、例外):与当前执行的指令有关,中断型号来源于CPU内部

来看几个例子

  1. 试图在用户态下执行特权指令
  2. 执行除法时发现除数为 0
  3. 有些时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令 --- 陷入指令,该指令会引发一个内部中断信号

外中断(也称中断): 与当前执行的指令无关,中断信号来源于 CPU 外部

  1. 时钟中断 --- 由时钟部件发来的中断信号
  2. I/O 中断---由输入/输出设备发来的中断信号

image-20251102174059398

中断机制的基本原理

不同的中断信号,需要用不同的中断处理程序来处理,当 CPU 检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到对应中断处理程序在内存中存放的位置

image-20251102174339931

系统调用

什么是系统调用

image-20251102174803596

系统调用和库函数的区别

image-20251102175449560

什么功能需要用到系统调用

凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理)等都必须通过系统调用的方式向操作系统内核提出服务请求

image-20251102175934580

系统调用的过程

  1. 首先先向 CPU 传递参数,表明系统调用类型,例如,Linux 下的 fork 指令
  2. 执行陷入指令,该中断由陷入指令引发,因此转入响应的中断处理程序 --- 即系统调用的入口程序
  3. 根据寄存器中的参数判断用户需要那种系统调用服务
  4. 然后调用 fork 系统调用的处理程序,让 fork 系统调用的处理程序上 CPU 执行
  5. CPU 转成用户态,继续执行其他指令

image-20251115234744114

image-20251115235004337

image-20251115235048831

image-20251115235349766

image-20251115235643514

进程的概念、组成、特征

进程的概念

程序:是静态的,就是存放在磁盘里的可执行文件,就是一系列指令集合

进程:是动态的,是程序的一次执行过程

进程的组成

PCB

当进程被创建的时候,操作系统会为该进程分配一个唯一的、不重复的 “身份证号” -- (PID)Process ID,进程 ID

操作系统要记录 PID、进程所属用户 ID(UID)

还要记录给进程分配了哪些资源(如:分配了多少内存、正在使用哪些 I/O 设备、正在使用哪些文件)

还要记录进程的运行情况(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)

这些信息都被保存在一个数据结构 PCB(Process Control Block)中,即进程控制快

操作系统需要对各个并发的进程进行管理,但凡管理时所需要的信息,都会被放在 PCB 中

image.png

除了 PCB 之外,进程的组成还包括程序段和数据段

image.png

PCB 是给操作系统用的

程序段、数据段是给进程自己用的,与进程自身的运行逻辑有关

进程的特征

程序是静态的,进程是动态的,相比于程序,进程拥有以下特征

image.png

进程的状态与转换

进程的状态

创建态、就绪态

image.png

运行态

image.png

在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)

在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下 CPU,并让它进入 “阻塞态

image.png

当一个进程结束了之后,一个进程可以执行 exit 系统调用,请求操作系统终止该进程

此时该进程会进入“终止态”,操作系统会让该进程下 CPU,并回收内存空间等资源,最后还要回收该进程的 PCB

进程状态的转换

image.png

image.png

进程 PCB 中,会有一个变量 state 来表示进程的当前状态

如:1. 表示创建态,2.表示就绪态,3.表示运行态,为了对一个状态下的各个进程进程统一的管理,操作系统会将各个进程的 PCB 组织起来

进程的组织

链接方式

image.png

索引方式

image.png

进程控制

进程控制就是要实现进程状态转换

如何实现进程控制

进程控制是由原语实现的

原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断

为什么进程控制(状态转换)的过程要 “一气呵成”?

image.png

如果不是”一气呵成“,当他完成第一步后收到了中断信号,那么 PCB2 的 state=1,但是它却被放在阻塞队列里

如何实现原语的“原子性”

使用 “关中断” 和 “开中断” 这两个特权指令实现原子性的

image.png

关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了 “原子性”

进程控制相关的原语

image.png

image.png

无论哪个进程控制原语,要做的无非三类事情:

  1. 更新 PCB 中的信息
  2. 将 PCB 插入合适的队列
  3. 分配/回收资源

image.png

image.png

进程通信

进程之间通信(Inter-Process Communication,IPC)是指两个进程之间产生数据交互

为什么进程通信需要操作系统支持?

因为进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立,因此,需要操作系统来实现进程中的通信

共享存储

image.png

如果使用共享存储来实现进程中通信,应该保证各个进程对共享空间的访问应该是互斥的

各个进程可以使用操作系统内核提供的同步互斥工具,如(P、V)操作

消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的 “发送消息/接受消息” 两个原语进行数据交换

image.png

假设现在进程 P 要发送一个消息给进程 Q

image.png

进程 P 现在本地初始化消息 msg,然后使用发送原语 send(Q, msg)

这会让 msg 进入到进程 Q 的消息队列里面

进程 Q 使用接受原语,reveive(P, &msg) ,操作系统会在 Q 的消息队列里面去找有没有这个消息,如果有,就会把 msg 传到 Q 的位置

间接通信方式

间接通信方式,以“信箱”作为中间实体进行消息传递

还是 P 向 Q 发送一个消息

  1. 进程 P 在自己的地址空间内完善 msg 的内容
  2. 发送原语,send(A, msg) 往信箱 A 发送消息 msg
  3. 进程 Q 接受原语,receive(A, &msg) 从信箱 A 中接受消息

image.png

操作系统允许多个进程往用一个信箱 send 消息,也可以多个进程从同一个信箱中 receive 消息

管道通信