【C++八股-第13期】操作系统基础
感谢花花,你必Offer
提纲:
👉 八股:
简单概述一下操作系统的几个核心功能
简单介绍一下CPU工作流程
说一下什么是CPU流水线
为什么操作系统要区分
内核态
和用户态
什么是系统调用
说一下并发和并行的区别
说一下你知道的物理内存层次
储存器类型(了解即可)
1. 简单概述一下操作系统的几个核心功能
操作系统具有几个核心功能,主要包括以下几点:
①进程管理: 操作系统负责管理计算机上运行的所有进程。进程是程序执行时的实例,操作系统分配资源(如CPU时间、内存空间)给每个进程,并控制它们的执行顺序和优先级。操作系统还负责进程的创建、调度、终止和通信。
②内存管理: 操作系统管理计算机的内存资源,确保每个进程都能够访问其所需的内存空间。这包括内存分配(分配内存给进程)、内存保护(防止进程访问未分配的内存区域或其他进程的内存)、内存回收(释放不再使用的内存)等功能。
③文件系统管理: 操作系统提供了文件系统,允许用户和程序组织、存储和访问文件。文件系统管理文件的创建、删除、修改和查找操作,同时提供了对文件和目录的权限控制和保护机制。
④设备管理: 操作系统管理计算机的硬件设备,包括输入输出设备(如键盘、鼠标、显示器)、存储设备(如硬盘、固态硬盘)、网络设备等。操作系统通过设备驱动程序与硬件设备通信,提供统一的接口供应用程序使用。
⑤用户界面: 操作系统提供了用户与计算机系统交互的界面,通常包括命令行界面(CLI)和图形用户界面(GUI)。用户界面使用户能够操作和控制计算机系统,执行各种任务和操作。
⑥安全和访问控制: 操作系统负责保护计算机系统和数据的安全性。这包括对用户进行身份验证和授权、实施访问控制策略、防止未经授权的访问和攻击等功能。
2. 简单介绍一下CPU工作流程
指令执行周期: CPU的基本工作单位是指令。CPU按照指令执行周期(Instruction Cycle)工作,通常分为取指
、译码
、执行
、访存
、写回
五个阶段:
当计算机运行时,CPU按照以下步骤执行指令:
-
取指阶段(Fetch): 控制单元根据时钟脉冲将程序计数器指向的指令地址发送到地址总线上。CPU从该地址读取指令,并将其存储到指令寄存器中。
-
译码阶段(Decode): CPU解析指令寄存器中的指令,确定指令的操作类型和操作数。
-
执行阶段(Execute): 如果指令需要操作数据,CPU将数据地址发送到地址总线上,并将数据读取到内部寄存器中。然后,运算单元对数据进行处理和计算。
-
访存阶段(Memory Access):如果指令需要访问内存,在这一阶段进行读写操作。
-
写回阶段(Write Back):将执行结果写回寄存器或内存。
这些步骤不断重复,直到程序执行完毕。CPU内部的寄存器和控制单元协调执行这些操作,确保指令顺利执行并且数据正确处理。
拓展(了解即可):
寄存器: CPU内部有多个寄存器,用于临时存储指令、数据和地址等信息,以加速指令的执行和数据的处理。常见的寄存器包括程序计数器(PC)、数据寄存器(Data Register)、地址寄存器等。
时钟信号和时序控制: CPU的运行受时钟信号调控,时钟信号确定了指令执行的节奏和速度,每个时钟周期称为一个时钟脉冲。时钟脉冲的频率决定了CPU的工作速度和性能。
数据通路和控制单元: CPU包括数据通路(Data Path)和控制单元(Control Unit)。数据通路负责数据在CPU内部各部件之间的传输和处理,控制单元负责指挥和协调各部件的工作,以确保指令正确地执行。
缓存和存储器: CPU通过高速缓存(Cache)与主存储器(RAM)交互,缓存用于暂存频繁访问的指令和数据,提高数据访问速度。CPU也通过存储控制器与其他外部设备如硬盘、显卡等交互。
指令集架构: CPU的工作方式和支持的指令集架构(如x86、ARM等)决定了其能够执行的指令类型和复杂度,不同架构适用于不同的应用场景和计算需求。
3. 说一下什么是CPU流水线
CPU流水线是一种通过将指令执行分解为多个阶段并并行处理来提高处理器性能的技术。它的基本思想是将每条指令的执行分成若干个子任务,每个子任务由流水线中的不同阶段处理,这样可以在同一时间并行执行多条指令,从而提高整个系统的吞吐量。
MIPS处理器的五级流水线将执行的生命周期分为五个部分:取指
、译码
、执行
、访存
、写回
。在理想情况下,当一个指令在流水线的一个阶段进行处理时,其他指令可以在流水线的其他阶段进行处理,从而实现并行执行。这种方式可以大大提高指令的执行效率。
我们可以用一个表格来展示一个简单的五级流水线的指令执行过程。假设我们有五条指令 I1,I2,I3,I4,I5
,流水线的五个阶段分别是:取指
(Fetch, F)、译码
(Decode, D)、执行
(Execute, E)、访存
(Memory Access, M)和写回
(Write Back, W)。
1 | F | ||||
2 | D | F | |||
3 | E | D | F | ||
4 | M | E | D | F | |
5 | W | M | E | D | F |
6 | W | M | E | D | |
7 | W | M | E | ||
8 | W | M | |||
9 | W |
拓展(了解即可):
关于MIPS区分:
- MIPS(百万指令每秒)
MIPS(Million Instructions Per Second)是一个衡量计算机处理器性能的指标,表示处理器每秒可以执行的指令数量。它的计算方式如下:
这个MIPS值越高,表示处理器的性能越好。然而,这个指标并不完全准确,因为不同的指令可能需要不同的时间来执行。
- MIPS架构(微处理器无关指令集)
MIPS(Microprocessor without Interlocked Pipeline Stages)是一种RISC(精简指令集计算机)架构,由MIPS Technologies公司设计。MIPS架构的一个重要特点是采用了五级流水线技术,这里的MIPS五级流水线具体指的是MIPS处理器的指令执行过程。
4. 为什么操作系统要区分内核态
和 用户态
先介绍一下两者是什么
内核态(核心态、系统态)和用户态是操作系统中两种不同的运行模式,用于控制对系统资源的访问和保护系统的稳定性和安全性。
特权级别 | 高 | 低 |
访问权限 | 完全访问硬件资源和内存 | 受限,只能访问虚拟内存空间 |
操作能力 | 可以执行特权指令 | 只能执行非特权指令 |
稳定性和安全性 | 错误可能导致系统崩溃 | 错误仅影响当前进程 |
使用场景 | 操作系统核心代码和驱动程序 | 应用程序和用户进程 |
模式转换 | 系统调用、异常、中断 | 系统调用、异常、中断 |
具体来说:
-
特权级别:
- 内核态:内核态具有最高特权级别,能够访问所有的硬件资源和执行所有的指令。
- 用户态:用户态具有较低的特权级别,受到操作系统的严格限制,不能直接访问硬件和关键系统资源。
-
访问权限:
- 内核态:可以直接访问内存、硬件设备和所有操作系统的数据结构。
- 用户态:只能访问自身进程的虚拟内存空间,不能直接操作硬件设备或访问其他进程的内存。
-
操作能力:
- 内核态:可以执行特权指令,如管理内存、启动和终止进程、处理中断等。
- 用户态:只能执行非特权指令,复杂操作需要通过系统调用请求内核态服务。
-
稳定性和安全性:
- 内核态:
危
由于内核态具有完全访问权限,错误操作可能导致整个系统崩溃或不稳定,因此需要非常谨慎。 - 用户态:由于权限受限,即使出现错误操作,也仅会影响当前进程,不会导致系统整体崩溃。
- 内核态:
内核态和用户态的转换
操作系统通过系统调用、异常和中断在内核态和用户态之间进行转换:
-
系统调用:
主动
用户态进程请求操作系统服务,如文件读写、内存分配等,通过系统调用陷入内核态。 -
异常:
被动
如非法指令或除零错误等异常发生时,处理器从用户态切换到内核态处理异常。 -
中断:
被动
硬件设备请求服务时,会触发中断,处理器切换到内核态处理相应的中断服务例程。
为什么要区分内核态
和 用户态
① 安全性和稳定性:
- 隔离和保护: 内核态具有更高的特权级别,可以访问系统的所有资源,包括硬件设备和操作系统的关键数据结构。为了保证系统的稳定性和安全性,将操作系统的核心功能和关键代码放置在内核态,防止用户进程直接操作关键资源,从而防止意外或恶意操作对系统的破坏。
- 错误隔离: 当用户程序发生错误或异常时,由于处于用户态限制,其影响范围仅限于当前进程,不会波及整个系统。而如果同样的错误发生在内核态,可能会导致系统崩溃或不可预期的行为。
② 性能优化:
- 提高效率: 用户态和内核态的
切换开销相对较大
,因为涉及到上下文切换和特权级别的转换。通过限制内核态的使用频率,可以减少这种开销,从而提高系统的整体性能。
③ 抽象和简化:
- 系统调用接口: 操作系统通过提供系统调用接口,允许用户程序请求内核态的服务和资源。这种抽象
简化了用户程序的编写
,同时又保证了对系统资源的合理访问和管理。
④ 多任务管理:
- 进程调度: 操作系统通过管理内核态和用户态的进程,实现多任务的调度和管理。内核态可以执行进程调度、资源分配等核心功能,而用户态的进程则在系统资源允许的情况下独立运行。
5. 什么是系统调用
系统调用(System Call)是操作系统提供给用户空间程序访问操作系统核心功能和服务的接口。它允许用户程序在需要操作系统内核权限时,通过预定义的接口向操作系统发出请求。当用户程序需要执行系统调用时,会触发从用户态切换到内核态的过程。这个过程包括保存用户程序的状态(上下文)、切换CPU特权级别等操作。
其实就是如果你想用一些系统功能(如文件操作、进程管理、网络通信等),就需要用操作系统提供的接口,这些接口就叫做系统调用。你可以在自己的程序中通过系统调用命令来使用他们。
这其实和你在代码里调用普通函数很相似,区别仅在于,
系统调用
由操作系统内核提供,运行在内核态
,而普通函数是你自己写的,运行在用户态
-
系统调用接口:
- 操作系统通过定义一组标准的系统调用接口,如 POSIX 标准在Unix/Linux系统中定义了许多常见的系统调用(如
open
、read
、write
等)。用户程序通过调用这些接口函数来请求操作系统提供的服务。
- 操作系统通过定义一组标准的系统调用接口,如 POSIX 标准在Unix/Linux系统中定义了许多常见的系统调用(如
-
系统调用的实现:
-
在Linux内核中,系统调用通过软中断(软件中断)实现。当用户程序执行系统调用时,会使用特殊的机器码(例如int 0x80)触发软中断,这会导致处理器从用户态切换到内核态,然后执行相应的系统调用处理程序(系统调用服务例程)。
-
系统调用服务例程负责解析用户程序传递的参数、执行相应的内核操作,并返回执行结果给用户程序。
-
6. 说一下并发和并行的区别
尽管并发和并行都涉及多个任务同时执行的概念,但它们的实现方式、效果和应用场景有着显著的区别
并发(Concurrency)
定义:并发指多个任务在同一时间段内执行,但不一定是同时刻。
注意:在单个CPU
的情况下,实际上一个时刻只有一个任务在运行。只不过CPU会快速地在不同任务之间进行切换,使得多个任务看上去几乎同时进行。这种切换是由操作系统的调度器管理的,通过时间片轮转或优先级调度等方式实现。
并行(Parallelism)
定义:真正意义上的同时运行
并行指多个任务在同一时刻同时执行,每个任务使用独立的处理器核心或多核处理器的多个核心。每个任务都在独立的处理器单元上执行,真正同时进行。
区别总结
-
时间粒度: 并发是在较小的时间片内交替执行多个任务,而并行是在同一时刻同时执行多个任务。
-
执行环境: 并发通常发生在单个处理器上,通过时间片轮转实现任务的交替执行;而并行发生在多个处理器核心或多核处理器上,每个核心可以独立地执行一个任务。
-
资源需求: 并发下的任务共享资源,需要考虑资源竞争和同步问题;并行中的任务各自独立执行,资源分配更加并行化和独立。
7. 说一下你知道的物理内存层次
寄存器 | 纳秒级 | 很小,几百字节到几千字节 |
高速缓存 (L1) | 1-2 纳秒 | 数十 KB |
高速缓存 (L2) | 3-10 纳秒 | 数百 KB |
高速缓存 (L3) | 10-40 纳秒 | 数 MB |
主存储器 (RAM) | 50-100 纳秒 | 数 GB |
磁盘存储 | 毫秒级到几十毫秒级 | 数 TB |
寄存器: 快
、存的少
、最贵
磁盘:慢
、存的多
、便宜
拓展(了解即可):
操作系统借助内存管理器有效地管理这些物理内存层次
① 内存分配: 跟踪哪些内存空间是可用的,为进程分配合适大小的内存空间。
②内存保护: 确保不同进程的内存空间互不干扰,防止程序错误或恶意程序破坏系统稳定性。
③内存回收: 当进程结束或释放内存时,回收已分配的内存空间,使其可供其他进程使用。
④虚拟内存管理: 通过虚拟内存技术扩展物理内存空间,允许程序使用比实际物理内存更大的地址空间。
8. 储存器类型(了解即可)
ROM | 只读存储器(Read-Only Memory)数据一经存储不可更改 |
固态半导体存储器,存储固定数据和程序,如启动代码和固件。 |
RAM | 随机存取存储器(Random Access Memory) | 与CPU直接交换数据的内部存储器主存 ,存储当前运行的程序和临时数据,提供高速读写能力。 |
SRAM | 静态随机存取存储器(Static Random-Access Memory)CPU缓存和快速存储器 |
用于高速缓存和高性能要求的应用,只要通电数据就不会消失,断电消失, |
DRAM | 动态随机存取存储器(Dynamic Random-Access Memory)常规计算机内存 |
主存储器,需要周期性刷新,提供大容量存储,用于。 |
EPROM | 可擦除可编程只读存储器(Erasable Programmable ROM) | 用于存储固件和程序,可以重复写入和擦除,通过紫外线擦除,操作不方便。 |
PSRAM | 伪静态随机存储器(Pseudo Static Random Access Memory) | 提供高速存储和简化控制器需求,用于嵌入式系统和移动设备中,结合了SRAM和SDRAM特性。 |
EEPROM | 电可擦除可编程只读存储器(Electrically Erasable Programmable ROM) | 用于存储小容量数据和配置信息,如设备参数和校准数据。 |
Flash | 闪存存储器,属于EEPROM类型,易于擦除和重写,功耗低。 | 用于存储大容量数据,如操作系统、应用程序和用户文件。 |
NOR Flash | NOR闪存,支持直接执行代码,适合小容量、高传输效率的应用。 | 用于嵌入式系统中的代码存储和执行,如固件存储和引导加载程序。 |
NAND Flash | NAND闪存,高密度存储和快速写入/擦除特性,适合大容量存储需求。 | 用于存储大量数据,如手机存储、固态硬盘和闪存卡。 |