操作系统的一些核心概念是要会的

# 操作系统的基本功能

操作系统是管理硬件与软件资源的系统软件,主要功能包括:

  1. 进程管理:创建、调度、终止进程,处理进程通信与同步。
  2. 内存管理:内存分配与回收,虚拟内存管理。
  3. 文件系统管理:文件读写、组织、权限管理。
  4. 设备管理:驱动程序、输入输出控制。
  5. 用户接口:提供 Shell、GUI 等交互方式。

追问 你能结合前端开发场景举例说明吗?

深入回答

  • 进程管理:Node.js 服务启动后,操作系统会分配 PID 并调度 CPU 运行,PM2/forever 等工具实际上是在做进程管理。
  • 内存管理:构建大型前端项目时,如果内存不足会触发 JavaScript heap out of memory 错误,这是 OS 内存管理限制导致的。
  • 文件系统管理:Nginx 静态资源访问依赖于操作系统的文件权限和路径管理。
  • 设备管理:比如 Web 应用通过浏览器访问摄像头,底层也要依赖 OS 的设备驱动。

# 进程与线程

什么是进程什么是线程

高效回答

  • 进程是操作系统资源分配和调度的最小单位,拥有独立的内存空间。由程序、数据集合和数据控制块三部分组成
  • 线程是 CPU 调度的最小单位,同一进程内的线程共享内存资源。 区别:
  1. 内存空间:进程独立,线程共享。
  2. 切换开销:进程切换开销大,线程切换小。
  3. 通信方式:进程间通信(IPC)复杂,线程可直接读写共享变量。

追问 那浏览器是多进程还是多线程的?

深入回答

现代浏览器是多进程架构,每个标签页、插件、渲染引擎都有独立进程,比如 Chrome 的浏览器进程、GPU 进程、网络进程、渲染进程。 渲染进程内又有多线程,比如:

  • GUI 渲染线程
  • JS 引擎线程
  • 定时器线程
  • 网络请求线程 这种架构避免了一个标签页崩溃导致整个浏览器挂掉。

# 同步与异步

高效回答

  • 同步:任务按顺序执行,必须等待前一个任务完成才能进行下一个。
  • 异步:任务发起后,不必等待任务完成即可继续执行,任务完成后通过回调、事件等方式通知。

追问 你能用操作系统 I/O 模型的角度解释一下异步吗?

深入回答

异步 I/O 本质是操作系统提供的能力:

  • 同步 I/O:用户进程发起 I/O 后阻塞等待,直到数据准备完成。
  • 异步 I/O:发起 I/O 后立即返回,内核准备好数据后再通知进程。 Node.js 的非阻塞 I/O 就是基于操作系统的异步 I/O 模型,比如 epoll、kqueue。

# 内存管理

问题 你知道虚拟内存是什么吗?

高效回答

虚拟内存是操作系统为每个进程提供的逻辑地址空间,进程使用的地址是虚拟地址,OS 会通过**内存映射(MMU)**将其转换为物理内存地址。 这样可以:

  1. 让每个进程都有独立的地址空间,提高安全性。
  2. 支持内存不足时使用硬盘交换区(Swap)。

# 死锁

问题 什么是死锁?出现死锁的条件是什么?

高效回答

死锁是多个进程(线程)因相互等待资源而无法继续执行的状态。 发生死锁的四个必要条件(互斥、请求保持、不剥夺、循环等待)同时满足时,就可能产生死锁。

追问 在前端或 Node.js 场景会出现死锁吗?

深入回答

在浏览器端基本不会出现典型的 OS 级死锁,但可能出现逻辑死锁

  • 两个异步请求相互依赖,造成 Promise 永远 pending。 在 Node.js 多线程(worker_threads)或数据库事务中,也可能因资源锁未释放而造成死锁。

# 系统调用

问题 什么是系统调用?为什么需要它?

高效回答

系统调用是用户程序与操作系统内核交互的接口,比如读文件、开网络连接都需要系统调用。 因为内核是受保护的,不能直接访问硬件,必须通过系统调用来间接访问。

追问 举个前端相关的系统调用例子?

深入回答

当 Node.js 调用 fs.readFile() 时,其底层会发起系统调用(如 Linux 的 read)去读取磁盘文件。 这时 V8 引擎调用 libuv,libuv 再调用 OS 提供的 API 完成文件读取。

# 内核调度

问题 操作系统常用的进程调度算法有哪些?

高效回答

  1. 先来先服务(FCFS):简单,但短任务可能被长任务拖慢
  2. 短作业优先(SJF):平均等待时间短,但需要预测运行时间
  3. 时间片轮转(RR):公平性好,适合交互系统
  4. 优先级调度:高优先级先执行,但可能导致饥饿
  5. 多级反馈队列(MLFQ):结合 RR + 优先级,动态调整

追问 浏览器的 JS 任务是怎么调度的?

深入回答

  • 基于事件循环(Event Loop)机制
  • 主线程按宏任务 → 微任务优先级调度

# I/O 模型

问题 操作系统中常见的 I/O 模型有哪些?

高效回答

  1. 阻塞 I/O
  2. 非阻塞 I/O
  3. I/O 复用(select/poll/epoll)
  4. 信号驱动 I/O
  5. 异步 I/O

追问 Node.js 为什么高并发?

深入回答

  • Node.js 使用事件驱动 + 非阻塞 I/O
  • 基于 epoll/kqueue 实现 I/O 复用
  • 单线程处理大量连接,不为每个连接创建线程

# 页面置换算法

问题 虚拟内存不够时怎么处理?

高效回答

  • 操作系统会使用 页面置换算法 将不常用的页面换出到磁盘(Swap)
  • 常见算法:
    1. FIFO:先进先出
    2. LRU:最近最少使用
    3. LFU:最不经常使用

追问 为什么 LRU 比 FIFO 好?

深入回答

  • FIFO 可能会淘汰正在频繁使用的页面(Belady 异常)
  • LRU 基于访问时间,能更符合实际使用情况

# 缓存与虚拟内存

问题 缓存和虚拟内存有什么关系?

高效回答

  • 缓存:存储热点数据,加快访问速度(CPU 缓存、磁盘缓存)
  • 虚拟内存:逻辑地址到物理地址的映射,解决物理内存不足

# 锁与并发控制

问题 操作系统中有哪些常见的锁?

高效回答

  • 互斥锁(Mutex):同一时间只允许一个线程访问
  • 读写锁(RWLock):读共享、写独占
  • 自旋锁(Spinlock):忙等锁,适合短时间锁定
  • 信号量(Semaphore):控制资源访问数量

追问 自旋锁和互斥锁的区别?

深入回答

  • 自旋锁:线程不会挂起,而是循环等待,减少上下文切换开销
  • 互斥锁:线程会被挂起,适合锁时间较长的场景

# 操作系统与浏览器的关系

问题 浏览器为什么要用多进程?

高效回答

  • 稳定性:一个标签崩溃不影响其他标签
  • 安全性:沙箱隔离网页代码
  • 性能:并行加载和渲染

追问 Chrome 中一次页面渲染涉及哪些进程?

深入回答

  1. 浏览器进程:管理 UI、文件、网络请求
  2. 渲染进程:解析 HTML/CSS/JS,布局绘制
  3. GPU 进程:加速渲染
  4. 网络进程:处理网络资源加载

# 常用 Linux 命令

高效回答

  • ls:列出目录内容,ls -la 显示隐藏文件与权限
  • cd:切换目录,cd - 返回上一个目录
  • pwd:显示当前路径
  • cat / more / less:查看文件内容
  • tail -f:实时查看日志末尾
  • cp / mv / rm:文件复制、移动、删除
  • chmod / chown:修改文件权限/所有者
  • grep:搜索文件内容
  • find:查找文件路径
  • tar / unzip:压缩解压文件
  • top / htop:查看系统资源占用

追问 1 grepfind 有什么区别?

深入回答

  • grep:在文件内容中查找字符串
  • find:在文件系统目录结构中查找文件
  • 结合使用:
find ./src -name "*.js" | xargs grep -l "axios.get"

# Linux 权限

问题 Linux 文件权限是怎么表示的?如何修改?

高效回答

  • 权限类型:r(4) 读、w(2) 写、x(1) 执行
  • 权限分三组:所有者、同组、其他人
  • chmod 755 file:所有者读写执行,其它人读执行
  • chmod u+x file:给所有者加执行权限
  • chown user:group file:修改所有者和组

追问 1 为什么不建议用 chmod 777

深入回答

  • 777 允许所有人读写执行,安全风险高
  • 最小权限原则:只给程序运行所需权限

# Linux 进程管理

问题 如何查看并管理进程?

高效回答

  • 查看:ps auxtophtop
  • 查找:ps aux | grep node
  • 结束:kill PID / kill -9 PID
  • 查看端口占用:
bash复制编辑lsof -i :3000
netstat -tunlp | grep 3000

追问 killkill -9 有何区别?

深入回答

  • kill → 发送 SIGTERM(15),允许进程清理
  • kill -9 → 发送 SIGKILL(9),直接由内核终止

# Linux 日志排查

问题 前端项目部署后出现 500 错误,如何排查?

高效回答

  1. 查看 Nginx/Apache 错误日志
tail -f /var/log/nginx/error.log
  1. 查看 Node.js 应用日志
pm2 logs
  1. 检查文件权限
ls -l ./dist
  1. 检查端口监听
netstat -tunlp | grep 3000

# 说说你对shell的理解?常见的命令?

Shell是一个由C语言编写的应用程序,他是用户使用Linux的桥梁,是一种命令语言

用户<--> shell <-->内核<-->硬件

bash文件

# Linux的用户管理的理解?

用户

用户组

# 输入输出重定向和管道的理解?