操作系统(OS)是管理计算机硬件资源,为上层软件提供服务的系统软件。 硬件本身只会执行二进制指令,没有操作系统,应用软件完全无法工作
学习顺序:先学习通用操作系统理论(不分Windows/Linux),再落地Linux实操。 核心四大模块:进程管理、内存管理、文件系统、IO管理,这四块是所有操作系统的骨架,也是面试、后续学习网络、编程、运维的底层基础。

2.1.1 通用操作系统核心原理

一、进程与线程(最高频、最重要)

1.进程 Process

进程:操作系统进行资源分配的最小单位。 一个程序被加载到内存运行之后就变成进程。

  • 每个进程拥有独立内存空间、文件描述符、CPU时间片等资源。
  • 进程之间相互隔离,A进程不能随便读写B进程的内存,防止程序互相破坏。
    进程完整生命周期:
  1. 创建:操作系统创建新进程,分配内存、PID进程号。
  2. 就绪态:资源准备好了,等待分配CPU时间。
  3. 运行态:CPU正在执行该进程的指令。
  4. 阻塞态(等待):进程等待某些事件,比如等待磁盘读文件、等待网络数据,让出CPU。
  5. 终止:程序退出,操作系统回收内存、文件等全部资源。

PID:进程唯一编号,操作系统靠PID区分不同进程。

2.线程 Thread

线程:CPU调度执行的最小单位,也叫轻量级进程。 一个进程内部可以包含一个或者多个线程

  • 同一个进程里面所有线程共享这个进程的内存、文件句柄等资源
  • 每个线程拥有自己独立栈、寄存器,CPU可以轮流调度线程执行任务。

通俗举例: 打开浏览器(1个进程),浏览器里面:一个线程渲染网页,一个线程下载图片,一个线程响应用户鼠标点击。 多个线程并行干活,这就是多线程。

进程与线程核心对比

  1. 进程之间资源完全隔离;同一个进程内线程共享资源。
  2. 创建进程开销大(要分配整套内存资源);创建线程开销很小。
  3. 一个进程崩溃,默认不会影响其他进程;一个线程崩溃,整个所属进程直接崩溃

并发与并行

  • 并行:多个CPU核心,同一时刻真正同时执行多个任务。
  • 并发:单个CPU核心,操作系统快速切换多个任务的时间片,宏观看起来好像同时运行,微观上是交替执行。

    操作系统的CPU调度器,就是专门做任务切换的。

上下文切换

CPU从一个进程/线程切换到另一个进程/线程,需要保存当前寄存器、栈等现场,加载下一个任务现场,这个操作叫上下文切换。

上下文切换会消耗CPU资源,切换太频繁,系统性能下降。


二、内存管理

操作系统负责统一管理物理内存(RAM),给各个进程分配内存,回收不用的内存。 核心概念:物理内存、虚拟内存、栈、堆、内存泄漏、内存溢出

  1. 物理内存:真实内存条硬件,实实在在的内存空间。
  2. 虚拟内存(虚拟地址空间)

非常关键:每一个进程看到的都是独立虚拟地址,不是直接访问物理内存。 操作系统通过MMU内存管理单元,把虚拟地址映射到真实物理内存。 好处: ① 进程之间地址隔离,A进程无法访问B进程内存; ② 可以使用磁盘空间充当内存后备(交换分区swap)。
Swap交换分区(Windows叫虚拟内存页面文件): 把硬盘一部分空间拿出来,当做内存应急。物理内存不够的时候,把暂时不用的数据写到硬盘swap;需要的时候再读回内存。 ⚠️硬盘速度远慢于内存,大量使用swap,系统会非常卡顿,swap不能替代物理内存。

  1. 进程内部内存划分:栈(stack)、堆(heap)
  • 栈Stack:自动分配自动释放,存放局部变量,空间很小,速度快。函数调用就使用栈。栈溢出会直接程序崩溃。
  • 堆Heap:程序手动申请、手动释放的大块内存,用来存放大量数据。
  1. 内存泄漏 Memory Leak 程序申请堆内存,使用完毕之后,没有释放。程序不断运行,内存越吃越多,最终占满内存。进程重启之后泄漏消失。
  2. 内存溢出 OOM 内存不够用,无法再分配新内存。操作系统会杀掉部分进程释放内存,Linux下OOM killer。

简单区分: 内存泄漏:只占不还,越跑越吃内存; 内存溢出:已经没有内存可以分配。


三、文件管理

操作系统把磁盘上所有数据抽象成文件,提供统一的文件访问接口。

  1. 文件:普通文本、图片、程序二进制,全部是文件。
  2. 目录(文件夹):用来组织文件,形成树形目录结构。Linux一切皆文件。
  3. 文件元数据:文件大小、创建时间、权限、所有者,不是文件内容,是文件属性。
  4. 文件权限:控制哪些用户可以读、写、执行文件。
  • 读r:读取文件内容
  • 写w:修改删除
  • 执行x:可以运行这个程序

重要:文件只是保存在磁盘。当程序要读取文件,操作系统把磁盘数据加载到内存,程序才能操作内容。
文件描述符:进程打开一个文件,操作系统返回文件描述符编号,程序后续读写文件就用这个编号。进程打开文件数量有上限。


四、IO管理(输入输出)

IO:输入输出,磁盘读写、网卡收发数据、键盘鼠标都属于IO。 CPU速度远远快于磁盘、网卡外设。如果CPU傻傻等待IO完成,CPU会大量空闲浪费。

  1. 阻塞IO:发起IO请求,程序卡住,什么都不干,一直等到IO完成才继续往下执行。

例子:程序读取大文件,等待硬盘读完,这期间线程阻塞。

  1. 非阻塞IO:发起IO,不会卡住程序;如果数据还没准备好,直接返回,程序可以去做别的事情,之后再来检查IO状态。

拓展概念(了解即可):IO多路复用 select/poll/epoll,高并发网络服务底层依赖。


五、内核态与用户态(安全模型)

CPU硬件提供两种权限级别,用来做安全隔离。

  1. 内核态:操作系统内核运行于此。权限最高,可以直接操作全部硬件、访问全部内存。
  2. 用户态:普通应用软件运行在这里。不能直接操作硬件,不能随便访问其他进程内存

应用软件想要读写硬盘、收发网络数据包,不能直接操作硬件,必须发起系统调用(System Call),CPU切换进入内核态,由操作系统内核完成硬件操作,完成之后切回用户态把结果返回程序。
好处:就算应用软件出bug,也不能直接破坏硬件和其他进程,保护系统稳定。
举例:记事本保存文件 记事本(用户态) → 发起系统调用 → 切换内核态,内核操作硬盘写入数据 → 返回结果回到用户态。


2.1.2 Linux系统实操基础(必练)

理论看懂之后,必须实操,推荐使用虚拟机安装Ubuntu。

Windows也有进程、虚拟内存、权限,但是Windows把很多细节隐藏,学习底层优先Linux。

1.目录结构

Linux是树形目录,根目录/,没有C盘D盘概念。

  • /bin:基础可执行命令
  • /etc:系统配置文件
  • /home:普通用户家目录
  • /proc:虚拟文件系统,存放进程、系统实时信息(查看进程,内存信息)
  • /var:日志、缓存数据

2.高频基础命令

文件目录操作

cd       #切换目录
ls       #列出目录文件
pwd      #查看当前路径
mkdir    #创建文件夹
rm       #删除文件/目录
cp       #复制
mv       #移动重命名
cat less #查看文件内容
chmod    #修改文件权限
chown    #修改文件所有者

进程查看(对应进程理论)

ps aux        #查看全部进程,看到PID、内存CPU占用
top / htop    #实时监控进程状态,可以看到进程运行、阻塞
kill PID      #终止进程

查看端口、日志

netstat / ss     #查看端口,哪些进程在监听端口
dmesg            #系统内核日志

3.环境变量

环境变量是系统给进程传递的全局参数。PATH最重要:系统查找命令的路径。输入命令,操作系统就在PATH目录里面寻找对应可执行程序。

4.用户与权限

  • root超级管理员,最高权限;普通用户权限受限。
  • 文件权限 r w x;
  • 很多操作需要sudo提升权限,模拟管理员。

实操思考题:

  1. 执行ps aux,观察同一个程序可以多个PID(多个进程);
  2. top命令观察内存占用,理解虚拟内存swap。

本阶段实操任务

  1. 在虚拟机搭建Linux环境,熟练敲上面20条左右基础命令;
  2. 使用pstop观察进程状态,看懂进程PID、CPU、内存占用;
  3. 练习修改文件权限chmod,理解r w x权限作用;
  4. 梳理思维导图:进程五种状态、虚拟内存、用户态内核态、swap交换分区。

重点总结(必须掌握)

  1. 进程是资源分配单位,线程是CPU调度单位;进程隔离,线程共享进程资源。
  2. 进程生命周期:创建、就绪、运行、阻塞、终止;上下文切换。
  3. 虚拟内存:每个进程独立虚拟地址,swap磁盘充当内存应急,不能替代物理内存。分清栈、堆;内存泄漏 vs OOM。
  4. 用户态不能操作硬件,依靠系统调用切换内核态完成硬件操作。
  5. 文件权限r w x;IO阻塞、非阻塞基础概念。
  6. Linux熟悉目录结构,掌握进程查看、文件操作基础命令。

初学者不需要深挖

不用啃Linux内核源码,不用深究MMU硬件细节,不用啃epoll源码。先搞懂逻辑,后续再深入。
如果你需要,我可以给这一章配套一套练习题(选择、简答)。