操作系统(OS)是管理计算机硬件资源,为上层软件提供服务的系统软件。 硬件本身只会执行二进制指令,没有操作系统,应用软件完全无法工作。
学习顺序:先学习通用操作系统理论(不分Windows/Linux),再落地Linux实操。 核心四大模块:进程管理、内存管理、文件系统、IO管理,这四块是所有操作系统的骨架,也是面试、后续学习网络、编程、运维的底层基础。
2.1.1 通用操作系统核心原理
一、进程与线程(最高频、最重要)
1.进程 Process
进程:操作系统进行资源分配的最小单位。 一个程序被加载到内存运行之后就变成进程。
- 每个进程拥有独立内存空间、文件描述符、CPU时间片等资源。
- 进程之间相互隔离,A进程不能随便读写B进程的内存,防止程序互相破坏。
进程完整生命周期:
- 创建:操作系统创建新进程,分配内存、PID进程号。
- 就绪态:资源准备好了,等待分配CPU时间。
- 运行态:CPU正在执行该进程的指令。
- 阻塞态(等待):进程等待某些事件,比如等待磁盘读文件、等待网络数据,让出CPU。
- 终止:程序退出,操作系统回收内存、文件等全部资源。
PID:进程唯一编号,操作系统靠PID区分不同进程。
2.线程 Thread
线程:CPU调度执行的最小单位,也叫轻量级进程。 一个进程内部可以包含一个或者多个线程。
- 同一个进程里面所有线程共享这个进程的内存、文件句柄等资源。
- 每个线程拥有自己独立栈、寄存器,CPU可以轮流调度线程执行任务。
通俗举例: 打开浏览器(1个进程),浏览器里面:一个线程渲染网页,一个线程下载图片,一个线程响应用户鼠标点击。 多个线程并行干活,这就是多线程。
进程与线程核心对比
- 进程之间资源完全隔离;同一个进程内线程共享资源。
- 创建进程开销大(要分配整套内存资源);创建线程开销很小。
- 一个进程崩溃,默认不会影响其他进程;一个线程崩溃,整个所属进程直接崩溃。
并发与并行
- 并行:多个CPU核心,同一时刻真正同时执行多个任务。
- 并发:单个CPU核心,操作系统快速切换多个任务的时间片,宏观看起来好像同时运行,微观上是交替执行。
操作系统的CPU调度器,就是专门做任务切换的。
上下文切换
CPU从一个进程/线程切换到另一个进程/线程,需要保存当前寄存器、栈等现场,加载下一个任务现场,这个操作叫上下文切换。
上下文切换会消耗CPU资源,切换太频繁,系统性能下降。
二、内存管理
操作系统负责统一管理物理内存(RAM),给各个进程分配内存,回收不用的内存。 核心概念:物理内存、虚拟内存、栈、堆、内存泄漏、内存溢出
- 物理内存:真实内存条硬件,实实在在的内存空间。
- 虚拟内存(虚拟地址空间)
非常关键:每一个进程看到的都是独立虚拟地址,不是直接访问物理内存。 操作系统通过MMU内存管理单元,把虚拟地址映射到真实物理内存。 好处: ① 进程之间地址隔离,A进程无法访问B进程内存; ② 可以使用磁盘空间充当内存后备(交换分区swap)。
Swap交换分区(Windows叫虚拟内存页面文件): 把硬盘一部分空间拿出来,当做内存应急。物理内存不够的时候,把暂时不用的数据写到硬盘swap;需要的时候再读回内存。 ⚠️硬盘速度远慢于内存,大量使用swap,系统会非常卡顿,swap不能替代物理内存。
- 进程内部内存划分:栈(stack)、堆(heap)
- 栈Stack:自动分配自动释放,存放局部变量,空间很小,速度快。函数调用就使用栈。栈溢出会直接程序崩溃。
- 堆Heap:程序手动申请、手动释放的大块内存,用来存放大量数据。
- 内存泄漏 Memory Leak 程序申请堆内存,使用完毕之后,没有释放。程序不断运行,内存越吃越多,最终占满内存。进程重启之后泄漏消失。
- 内存溢出 OOM 内存不够用,无法再分配新内存。操作系统会杀掉部分进程释放内存,Linux下OOM killer。
简单区分: 内存泄漏:只占不还,越跑越吃内存; 内存溢出:已经没有内存可以分配。
三、文件管理
操作系统把磁盘上所有数据抽象成文件,提供统一的文件访问接口。
- 文件:普通文本、图片、程序二进制,全部是文件。
- 目录(文件夹):用来组织文件,形成树形目录结构。Linux一切皆文件。
- 文件元数据:文件大小、创建时间、权限、所有者,不是文件内容,是文件属性。
- 文件权限:控制哪些用户可以读、写、执行文件。
- 读r:读取文件内容
- 写w:修改删除
- 执行x:可以运行这个程序
重要:文件只是保存在磁盘。当程序要读取文件,操作系统把磁盘数据加载到内存,程序才能操作内容。
文件描述符:进程打开一个文件,操作系统返回文件描述符编号,程序后续读写文件就用这个编号。进程打开文件数量有上限。
四、IO管理(输入输出)
IO:输入输出,磁盘读写、网卡收发数据、键盘鼠标都属于IO。 CPU速度远远快于磁盘、网卡外设。如果CPU傻傻等待IO完成,CPU会大量空闲浪费。
- 阻塞IO:发起IO请求,程序卡住,什么都不干,一直等到IO完成才继续往下执行。
例子:程序读取大文件,等待硬盘读完,这期间线程阻塞。
- 非阻塞IO:发起IO,不会卡住程序;如果数据还没准备好,直接返回,程序可以去做别的事情,之后再来检查IO状态。
拓展概念(了解即可):IO多路复用 select/poll/epoll,高并发网络服务底层依赖。
五、内核态与用户态(安全模型)
CPU硬件提供两种权限级别,用来做安全隔离。
- 内核态:操作系统内核运行于此。权限最高,可以直接操作全部硬件、访问全部内存。
- 用户态:普通应用软件运行在这里。不能直接操作硬件,不能随便访问其他进程内存。
应用软件想要读写硬盘、收发网络数据包,不能直接操作硬件,必须发起系统调用(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提升权限,模拟管理员。
实操思考题:
- 执行
ps aux,观察同一个程序可以多个PID(多个进程); - top命令观察内存占用,理解虚拟内存swap。
本阶段实操任务
- 在虚拟机搭建Linux环境,熟练敲上面20条左右基础命令;
- 使用
ps、top观察进程状态,看懂进程PID、CPU、内存占用; - 练习修改文件权限chmod,理解r w x权限作用;
- 梳理思维导图:进程五种状态、虚拟内存、用户态内核态、swap交换分区。
重点总结(必须掌握)
- 进程是资源分配单位,线程是CPU调度单位;进程隔离,线程共享进程资源。
- 进程生命周期:创建、就绪、运行、阻塞、终止;上下文切换。
- 虚拟内存:每个进程独立虚拟地址,swap磁盘充当内存应急,不能替代物理内存。分清栈、堆;内存泄漏 vs OOM。
- 用户态不能操作硬件,依靠系统调用切换内核态完成硬件操作。
- 文件权限r w x;IO阻塞、非阻塞基础概念。
- Linux熟悉目录结构,掌握进程查看、文件操作基础命令。
初学者不需要深挖
不用啃Linux内核源码,不用深究MMU硬件细节,不用啃epoll源码。先搞懂逻辑,后续再深入。
如果你需要,我可以给这一章配套一套练习题(选择、简答)。
评论交流
欢迎留下你的想法