【C++上岸】C++常见面试题目--操作系统篇(第二十八期)

📡 C++操作系统面试题精讲:从进程到死锁,一篇搞定!

面试官最爱问的操作系统八股文,看完直接拿offer! 💪


文章目录

    • [📡 C++操作系统面试题精讲:从进程到死锁,一篇搞定!](#📡 C++操作系统面试题精讲:从进程到死锁,一篇搞定!)
    • [📌 发生进程上下文切换有哪些场景?](#📌 发生进程上下文切换有哪些场景?)
    • [⚡ 进程切换为什么比线程更消耗资源?](#⚡ 进程切换为什么比线程更消耗资源?)
    • [🧠 聊聊:什么是用户态和内核态](#🧠 聊聊:什么是用户态和内核态)
    • [🏗️ 什么是内核?](#🏗️ 什么是内核?)
    • [🔌 Linux 操作系统的启动过程](#🔌 Linux 操作系统的启动过程)
    • [🔁 如何从用户态切换到内核态呢?](#🔁 如何从用户态切换到内核态呢?)
    • [🧩 PCB是什么?](#🧩 PCB是什么?)
    • [📊 进程调度算法](#📊 进程调度算法)
    • [🥬 生产者消费者模型](#🥬 生产者消费者模型)
    • [☠️ 死锁的解决策略](#☠️ 死锁的解决策略)
    • [💪 **坚持刷题,C++上岸指日可待!** 下期预告:《网络编程篇》 🔥 欢迎关注专栏,获取更多面试干货!](#💪 坚持刷题,C++上岸指日可待! 下期预告:《网络编程篇》 🔥 欢迎关注专栏,获取更多面试干货!)

📌 发生进程上下文切换有哪些场景?

进程上下文切换发生在以下场景:

  1. 时间片耗尽:当进程的CPU时间片用完时,系统会强制切换到其他进程。
  2. 系统调用:如I/O操作(文件读写、网络通信)需要等待时,主动让出CPU。
  3. 中断处理:硬件中断(如键盘输入)或异常(如除零错误)触发切换。
  4. 优先级抢占:高优先级进程抢占低优先级进程的CPU资源。
  5. 进程主动休眠 :如调用sleep()函数等待资源。
cpp 复制代码
// 示例:进程主动休眠触发切换
#include <unistd.h>
int main() {
    sleep(5); // 主动让出CPU
    return 0;
}

⚡ 进程切换为什么比线程更消耗资源?

根本原因:地址空间切换

  • 进程切换需要:
    1. 保存/恢复完整的虚拟内存映射表(MMU)
    2. 刷新TLB缓存
    3. 切换寄存器、堆栈、文件描述符等
    4. 内核态与用户态的双重切换
  • 线程切换仅需:
    1. 保存寄存器状态
    2. 切换堆栈指针
      💡 线程共享同一地址空间,省去了内存映射的重载开销!

🧠 聊聊:什么是用户态和内核态

权限分级设计

  • 用户态(User Mode)
    • 受限权限,禁止直接访问硬件
    • 应用程序运行空间(如malloc()printf()
  • 内核态(Kernel Mode)
    • 最高权限,可执行特权指令(如中断处理、设备驱动)
    • 操作系统核心代码运行空间

🔒 类比:用户态是"游客区",内核态是"管理员控制室"


🏗️ 什么是内核?

操作系统的核心引擎

  • 功能模块:
    • 进程调度器
    • 内存管理器
    • 设备驱动程序接口
    • 系统调用接口(如sys_open()
  • 设计模式:
    • 宏内核(Linux):所有功能集成在单一可执行文件
    • 微内核(Minix):仅核心功能在内核,其他作为服务进程
bash 复制代码
# 查看Linux内核版本
uname -a

🔌 Linux 操作系统的启动过程

  1. BIOS/UEFI阶段
    • 硬件自检,加载引导程序(如GRUB)
  2. Bootloader阶段
    • 加载内核镜像(vmlinuz)和初始化内存盘(initrd
  3. 内核初始化
    • 初始化硬件,挂载根文件系统
  4. 用户空间启动
    • 启动第一个用户进程init(如systemd)
    • 执行初始化脚本(/etc/rc.d

⏱️ 典型启动时间:桌面系统3-5秒,服务器系统10-30秒


🔁 如何从用户态切换到内核态呢?

三种主要途径:

  1. 系统调用

    • 通过软中断(如int 0x80syscall指令)
    cpp 复制代码
    // 示例:write系统调用
    #include <unistd.h>
    write(1, "Hello Kernel!", 13);
  2. 硬件中断

    • 外设触发(键盘输入、网卡数据到达)
  3. 异常

    • CPU执行非法指令(如除零、无效内存访问)

🧩 PCB是什么?

进程控制块(Process Control Block)

操作系统中进程的"身份证",包含:

  • 进程ID(PID)、父进程ID(PPID)
  • CPU状态:寄存器值、程序计数器
  • 内存信息:基址寄存器、界限寄存器
  • 资源清单:打开的文件、网络连接
  • 调度状态:就绪/运行/阻塞
c 复制代码
// Linux中PCB对应结构体(简化版)
struct task_struct {
    long state;            // 进程状态
    struct mm_struct *mm;  // 内存管理信息
    pid_t pid;             // 进程ID
    // ...
};

📊 进程调度算法

算法 特点 适用场景
FCFS(先来先服务) 非抢占,简单公平 批处理系统
短作业优先(SJF) 最小化平均等待时间 交互式系统
轮转调度(RR) 固定时间片轮转 分时系统
多级反馈队列 动态调整优先级 通用操作系统

💻 Linux采用CFS(完全公平调度器),基于虚拟运行时间(vruntime)分配CPU


🥬 生产者消费者模型

经典同步问题解决方案

  • 核心组件:
    • 共享缓冲区(固定大小队列)
    • 互斥锁:保护缓冲区访问
    • 条件变量:通知资源状态变化
cpp 复制代码
#include <queue>
#include <mutex>
#include <condition_variable>

std::queue<int> buffer;
std::mutex mtx;
std::condition_variable cv_producer, cv_consumer;

// 生产者
void producer() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv_producer.wait(lock, []{ return buffer.size() < MAX_SIZE; });
        buffer.push(data);
        cv_consumer.notify_one();
    }
}

// 消费者
void consumer() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv_consumer.wait(lock, []{ return !buffer.empty(); });
        int data = buffer.front();
        buffer.pop();
        cv_producer.notify_one();
    }
}

☠️ 死锁的解决策略

必要条件(同时满足时发生死锁)

  1. 互斥:资源独占
  2. 持有等待:保持资源并请求新资源
  3. 非抢占:资源不能被强制剥夺
  4. 循环等待:进程间形成等待环

解决策略:

  • 预防:破坏任一必要条件(如资源一次性分配)
  • 避免:银行家算法动态检测安全状态
  • 检测与恢复:定期扫描等待图,强制终止进程
  • 忽略:鸵鸟策略(适用于死锁极少发生的场景)

🔗 实际开发建议:使用std::lock()同时锁定多个互斥量,避免锁顺序不一致


💪 坚持刷题,C++上岸指日可待! 下期预告:《网络编程篇》

🔥 欢迎关注专栏,获取更多面试干货!

恭喜你坚持到这里!👏 本期我们覆盖了操作系统的基本原理,并实战解决了十个高频面试题。记住:理解其中的实现思想比硬背八股更重要,多练习才能在面试中游刃有余。😊 如果有疑问,欢迎评论区讨论~ 下期见!🚀

相关推荐
一匹电信狗2 小时前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
2501_927773072 小时前
imx6驱动
linux·运维·服务器
hy____1232 小时前
Linux_进程间通信
linux·运维·服务器
2401_838472512 小时前
C++中的访问者模式
开发语言·c++·算法
郭涤生2 小时前
C++的函数是否可以做到完全覆盖Linux和windows的跨平台
linux·c++·windows
fqbqrr3 小时前
2601C++,复制超文本格式
c++
m0_561359673 小时前
基于C++的机器学习库开发
开发语言·c++·算法
南宫码农3 小时前
神马影视8.5版本如意伪静态+视频教程
linux·运维·centos
2401_832402753 小时前
C++中的类型擦除技术
开发语言·c++·算法