简介面向高校操作系统课程学习者提供一份95分A等、出自西南交通大学软件工程专业的完整实验报告适合参考Linux环境搭建、内核观测与系统编程实验写法。报告覆盖四个实验熟悉Linux界面、目录结构及Shell常用命令利用重定向与管道组合任务并用vi/gedit编辑、gcc编译、gdb调试C语言程序通过/proc文件系统读取cpuinfo、version、stat、uptime等内核参数编程观测meminfo、loadavg、interrupts、filesystem后续还涉及软中断通信、进程调度含FCFS与RR策略验证和线程同步。资源为1个docx文档压缩包约1.48MB报告含实验目的、具体步骤、代码与总结目录完整便于按模块查阅。目前已有401人学习下载。读者可据此对照实验要求梳理Linux命令、编译调试、/proc内核信息读取及多线程同步的实现思路适合课程设计或报告写作参考。1. 一份满分实验报告就是一张操作系统复习地图很多人在复习操作系统时习惯翻教材目录从进程管理背到文件系统但知识点始终是散的。如果你手头有一份写得扎实的实验报告会发现它比目录更贴近考点Linux环境与C调试、/proc内核观测、软中断通信、进程调度、线程同步、内存管理、系统调用、缺页统计每一个实验都对应课程的核心模块。这份接近满分的报告恰好把这些模块串成了一条实践链路写报告的人不只是在“做实验”而是完成了从“命令操作”到“内核机制”的认知爬坡。适合两类人精读一是操作系统学完一轮、概念还比较散的复习者二是正在写同类实验、想对照查漏补缺的在校生。顺着这条链路走一遍教材里抽象的概念会一个个落到具体的函数、文件和运行现象上复习效率会高很多。2. Linux环境与C调试从目录结构到编译链路的复习重点2.1 目录结构不是背路径而是理解“约定分工”实验报告里记录了作者对Linux目录结构的初印象没有盘符全部挂在一个根下用正斜杠分割路径这与Windows完全不同。资料里整理出的/bin、/home、/lostfound、/media、/opt、/lib、/proc、/tmp这些目录看似零散其实有清晰的分工逻辑。复习时不要死记“哪个目录放什么”而要记住三类系统启动需要的、用户日常使用的、运行时动态生成的。最容易忽略的是/proc和/sys这类虚拟文件系统它们不是磁盘上真实存在的文件而是内核数据结构暴露出来的视图。这个区别在后面的实验里会反复出现。为了便于复习把常见目录整理成一张对照表目录存放内容复习切入点/bin常用命令ls、cp、cat等系统启动即需要/etc系统配置文件系统行为配置/home用户主目录多用户隔离/media外接设备挂载点设备管理/opt额外安装的软件第三方软件约定/libC编译器及运行库动态链接/proc运行时内核信息虚拟文件系统/tmp临时文件重启可能清空/lostfound非法关机后恢复的文件文件系统修复复习时可以把这张表当作“目录结构”这一节的自检表遮住第三列看自己能不能说出每个目录对应的操作系统概念。2.2 Shell命令、重定向与管道组合比单个命令更重要实验报告里整理过cd、ls、ps、chmod等命令以及redirect和pipe机制。单个命令的用法考试很少直接考真正常考的是“组合”。比如统计某个目录下有多少文件答案是ls | wc -l查看系统里是否有某个进程在运行答案是ps -ef | grep name。管道的本质是一种简单的进程间通信前一个进程的标准输出接到后一个进程的标准输入。ls /etc | grep rc # 列出 /etc 下名字含 rc 的文件 ps -ef | grep java # 查看 java 相关进程 echo hello /tmp/a.txt # 覆盖写 echo again /tmp/a.txt # 追加写 ls /nonexist 21 | cat # 把错误输出也接入管道参数说明grep做文本过滤-ef表示全格式显示进程是覆盖重定向是追加21是把文件描述符2标准错误重定向到文件描述符1标准输出这样管道捕获到的内容里既有正常输出也有错误信息。最容易扣分的点是重定向顺序如果写成21 file最终只有标准输出进了文件错误信息还是留在屏幕。复习时建议亲手敲一遍这四条命令观察输出差异比背结论牢靠。2.3 vim gcc gdb 的最小工作流实验过程里记录了一条完整的编辑编译链路进入终端后用vim创建源文件按i/o/a/r进入编辑模式ESC返回一般模式:wq保存退出再用gcc编译。这条链路本身就是一套考题。vim要理解的不是“命令”而是三个模式的状态切换一般模式、编辑模式、命令行模式搞混了就会按出一堆乱码。gcc编译有一个非常经典的判断题默认编译输出文件名是a.out而不是源文件名。如果命令是gcc hello.c运行时要执行./a.out。gdb调试则要掌握五个常用操作b main设置断点n单步跳过s单步进入p x打印变量bt查看调用栈。下面这段代码可以用来练习argc和argv的用法#include stdio.h int main(int argc, char *argv[]) { printf(argc %d\n, argc); for (int i 0; i argc; i) { printf(argv[%d] %s\n, i, argv[i]); } return 0; }编译后运行./argc a b输出argc 3argc的值是参数个数加1因为argv[0]是程序名本身。这是考研和面试里反复出现的细节很多人在这里翻车。2.4 网络连接三种模式桥接、NAT与主机模式的辨析实验报告的作者在学习环境时踩过一个坑配置没问题但网络连不上最后通过排查虚拟机网络设置解决了问题也顺势搞清了三种网络连接模式。这部分内容看起来很“环境化”但它背后是网络地址转换和子网通信的概念面试偶尔会问到。桥接模式里虚拟机相当于局域网中的一台独立主机和物理机在同一网段可以互访、可以上网但同网段设备过多时会产生IP冲突。NAT模式里虚拟机通过物理机代理访问外部网络外部设备看不到虚拟机避免了地址抢占。主机模式则是完全隔离虚拟机和物理机之间不能互相访问。复习时记住一条判断依据要求虚拟机访问外网、又要避免IP冲突选NAT要求虚拟机像独立主机一样被局域网其他设备直接访问选桥接只要求虚拟机之间通信选主机模式。血泪经验是不要只背结论要能解释“为什么NAT能避免IP冲突”本质是虚拟机不独占局域网地址而是复用物理机的出口。2.5 环境类实验怎么复习才不丢分环境类实验看起来只是“熟悉工具”但每个操作背后都能翻译成一个考点。vim的三个模式对应进程对终端输入的处理gcc的四步编译预处理、编译、汇编、链接对应编译原理里的前端和后端ps命令对应进程管理里的进程模型chmod的rwx权限对应文件系统的访问控制。复习时最有效的做法是把操作问题翻译成概念问题遇到一个命令就问自己这个操作在操作系统里对应哪个机制如果这一步做完之后还是觉得抽象就拿/proc下的文件当跳板观察目录、读文件、看内核状态把“命令”和“内核”连起来。后面的几个实验会反复用到这个思路。3. /proc虚拟文件系统观察内核状态的入口3.1 /proc的本质不是磁盘文件而是内核的数据接口实验报告在“观察Linux”这一节里专门强调了一个概念“/proc/N中存储的是系统当前正在运行的进程的相关信息其中N为进程号。”这里的关键词是“存储”但准确地说/proc并不是普通存储而是一个虚拟文件系统。它不占用磁盘块每次读取时由内核现场生成内容。理解了这一点很多判断题就有答案了。“/proc下的文件都是真实存在磁盘上的”是错的“读取/proc/cpuinfo会触发内核执行一段代码”是对的。教材里讲文件系统时顺便会提虚拟文件系统但很多同学不重视直到遇到/proc才意识到这是一种“把内核状态伪装成文件”的设计思路。复习时要特别留意/proc目录下以数字命名的子目录它们对应正在运行的进程PID里面包含进程的状态、内存映射、打开的文件描述符等运行时信息。3.2 核心文件对照表实验要求观察cpuinfo、version、stat、uptime并要求编程读取meminfo、loadavg、interrupts、filesystems。这八个文件就是一张现成的考点地图每个都对应一级操作系统的知识点文件观测内容典型字段对应考点/proc/cpuinfoCPU型号、核数、缓存processor、model name多核结构/proc/version内核版本、gcc版本Linux version 3.10.0版本号与内核开发/proc/statCPU时间、进程状态cpu user nice system idleCPU时间片统计/proc/uptime系统已运行时间总时长、空闲时长开机时间统计/proc/meminfo内存总量、空闲、缓存MemTotal、MemFree、Cached内存管理/proc/loadavg1/5/15分钟平均负载0.00 0.01 0.05系统负载/proc/interrupts各中断号触发次数0: 定时器中断中断机制/proc/filesystems内核支持的文件系统ext4、proc、sysfs文件系统类型复习时重点关注两个细节第一内核版本号里奇数是开发版、偶数是稳定版这是实验报告明确记录过的判断规则第二loadavg的三个数字不是CPU利用率而是“一段时间内处于运行和不可中断状态的平均进程数”这两个概念经常被混为一谈。3.3 编程观测的写法用C读/proc文件实验要求编程实现对meminfo、loadavg等文件的观测。写法本质就是普通文件读取用fopen、fgets逐行读就行。需要注意两点一是fopen失败时要用perror打印原因否则只能看到程序静默退出二是/proc下的文件大多是文本但个别文件如/proc/kcore是二进制镜像不能直接按文本读。#include stdio.h int main() { FILE *fp fopen(/proc/loadavg, r); char line[256]; if (fp NULL) { perror(open /proc/loadavg); return 1; } while (fgets(line, sizeof(line), fp)) { printf(%s, line); } fclose(fp); return 0; }这段代码读/proc/loadavg并打印内容。fgets每读一行就输出一次读完整份文件后关闭句柄。如果想同时观测多个文件可以把“打开-读取-关闭”封装成一个函数参数传入文件名。复习时要注意这个模式体现的是“一切皆文件”的设计哲学设备、内核状态、进程信息都被抽象成了文件接口这也是操作系统设计思想里的高频考点。3.4 jiffies与系统时间基准实验报告里有一段很有意思的追问为什么做算法实验时Windows用“滴答”计数Linux用什么计数作者去查了jiffies发现它是内核里的一个全局变量以“节拍”为单位递增开机时通过RTC硬件读取一个基准时间再用这个基准时间换算成初始的jiffies值换算的基准是1970-01-01 00:00:00 0000(UTC)。复习这一段的重点是建立“节拍”与“时间片”的联系操作系统的调度、延时、超时判断都依赖节拍计数。不同内核的HZ配置不同常见的有100、250、1000单位是次/秒。一个节拍的长度就是1/HZ秒时间片长度本质上是节拍数的整数倍。理解了这个链条教材里“时间片轮转”就不再是一句空话而是能算出具体数值的机制。3.5 从/proc延伸出的考点/proc实验还能串联起多个章节读/proc/meminfo对应内存管理里的伙伴系统和slab分配器看/proc/interrupts对应中断章节里的中断向量表观察/proc/stat里的CPU行对应调度器里的CPU时间统计。最好的复习方式是每看一个/proc文件就想一想它背后属于操作系统的哪一章然后把那一章的知识点过一遍。这样一轮下来你会发现实验报告并不是孤立的“文件读取”而是一张覆盖进程、内存、中断、调度、文件系统的知识网络。如果只停留在“会用cat查看”的层面就浪费了这份资料的复习价值。4. 进程与软中断通信fork、signal、kill串起的一整条链路4.1 两个实验场景兄弟进程与三代进程实验2有两个任务。任务一是父进程创建两个子进程按下Ctrl\向父进程发送SIGQUIT信号父进程收到后依次终止两个子进程最后终止自己。任务二是父进程创建子进程子进程再创建孙进程按下Ctrl\后按孙进程、子进程、父进程的顺序依次结束。这两个场景考的是同一个知识点fork的返回值决定了进程走哪条分支。fork成功时父进程返回子进程的PID子进程返回0失败返回-1。代码里反复出现while ((p1 fork()) -1);这样的写法意思是“如果创建失败就循环重试直到成功”。复习时要把注意力放在返回值判断上而不是尝试记住每一行代码。4.2 fork返回值与父子进程的“复制”关系fork之后子进程几乎是父进程的完整复制品包括代码、数据、堆栈和打开的文件描述符唯一确定的区别就是返回值。这里有两个容易忽视的结论第一fork之后的父子进程谁先执行是不确定的由调度器决定所以实验代码里用sleep(1)或者wait_mark忙等待来“人为排序”第二fork之后同名变量是两份父子进程各自修改互不影响。素材里父进程fork完p1之后又fork了p2形成了“一个父进程 两个子进程”的拓扑。子进程里把SIGQUIT设置为SIG_IGN忽略父进程里为SIGQUIT注册stop处理函数这样Ctrl\只会触发父进程的收尾逻辑。复习时可以画一张三层的进程树标注每个节点的PID和信号流向会清晰很多。4.3 信号的注册、发送与处理核心API只有三个signal注册处理函数、kill发送信号、waiting等待信号。素材里的wait_mark是一个全局变量waiting()是while (wait_mark ! 0)空转stop()把wait_mark置0。这种“忙等待”方式在实验里直观但生产环境不会这样写而是用pause()或sigsuspend()挂起进程。volatile int wait_mark 1; void waiting() { while (wait_mark ! 0) ; } void stop() { wait_mark 0; } int main() { signal(SIGQUIT, stop); // 注册SIGQUIT处理函数 waiting(); // 忙等待信号 kill(p1, 16); // 向子进程p1发送信号16 return 0; }代码里volatile是关键wait_mark在信号处理函数里被修改主循环里又要读取它如果不用volatile编译器可能把它优化到寄存器里导致循环永远读不到新值。信号16、17属于用户自定义信号不同体系结构上含义不完全一样考试如果问“kill(pid, 16)表示什么”要答“向指定进程发送编号为16的软中断信号”而不是想当然地往SIGUSR1/2上套。4.4 lockf的作用多进程输出不互相打断实验代码在printf前后加了lockf(1, 1, 0)和lockf(1, 0, 0)第一个参数1代表标准输出文件描述符。目的是把屏幕输出锁住避免多个进程同时打印造成内容交错。这个细节对应“临界区保护”的概念printf不是原子操作多个进程同时往终端写数据时会互相穿插。复习时要把lockf和教材里的互斥锁、信号量联系起来lockf是文件锁互斥锁保护内存中的共享变量信号量可以用于进程同步但本质都是“限制对共享资源的并发访问”。如果考试让你写一个多进程打印互斥的方案除了lockf还可以用信号量或者对标准输出加O_APPEND的方式关键是把临界区缩到最小。4.5 软中断通信与管道通信的对比实验总结里提到“了解了软中断通信和管道通信进一步认识到了并发的实质”。这两个概念经常一起考放在一张表里对比更清楚维度软中断信号管道通信内容只传递信号编号传递字节流通信方向单向发送进程异步处理单向管道双向需建两个管道实时性异步信号到达后触发处理函数同步读写可能阻塞数据携带能力普通信号不能携带数据可传任意长度字节流典型APIsignal、killpipe、read、write最容易弄混的是“信号能不能传数据”。普通信号只能传编号不能带字符串实时信号配合sigqueue可以附带数据。如果题目问“进程A要向进程B传递一个字符串”正确答案不是信号而是管道、消息队列或共享内存。这个区分点在填空题和选择题里出现频率很高。4.6 跨系统写代码的坑fork在Windows里不存在实验报告的作者记录了一个真实的踩坑经历在Windows的IDE里提前写好了C代码打算传进Linux再编译结果IDE一直报错因为fork函数在Windows的头文件里根本不存在。fork是POSIX接口Windows默认不支持进程创建用的是CreateProcess。复习时把这个现象记成一条结论fork是Unix/Linux专属的系统调用Windows没有。面试如果聊到跨平台开发能说出这个差异会让考官觉得你真的写过代码而不是只背过教材。5. 易漏点盘点从进程到缺页五个最常翻车的细节这一章的每一条都来自对实验报告的复盘也是我在复习时反复踩过的坑。五个易漏点分别对应五个核心模块每一条都按“为什么漏、怎么补”的顺序写适合在考前最后一轮拿出来对照自查。5.1 易漏点一fork之后父子进程的执行顺序是“玄学”为什么漏教材里画的是“父进程继续执行、子进程也继续执行”两条线但很多人默认父进程先跑导致分析输出结果时对不上。实验一里作者自己都写道“由于代码执行顺序问题子进程P2先被父进程终止接着P1再被终止”这个先后并不是必然的而是由调度和代码逻辑共同决定的。怎么补记住一个铁律——fork返回后父子进程都从fork的下一条语句开始执行谁先谁后不可假设。分析实验结果时不要强行解释“为什么P2先于P1”而要关注同步机制sleep、wait、信号在哪里把顺序固定住了。复习建议是自己写一个不带任何同步的fork程序连续运行十次观察输出顺序的变化比任何背诵都管用。5.2 易漏点二signal注册必须在等待之前为什么漏信号是异步事件如果信号在signal()注册之前到达默认动作会直接终止进程处理函数永远不会被调用。代码里必须先signal(SIGQUIT, stop)再进入waiting()循环这个顺序写反了就是经典翻车现场。怎么补这是“可靠信号”考点。早期Unix信号不可靠处理完后可能自动恢复为默认动作现代语义虽然变了但“先注册、后等待”依然是正确写法。复习时要养成一个习惯每写完一段信号处理代码都强制检查一遍“注册函数是否发生在任何可能阻塞的调用之前”。如果还记不牢就想一想场景你还没接电话对方已经把电话挂了信号就是这个电话。5.3 易漏点三FCFS与RR混淆了“主动让出”和“被动抢占”为什么漏FCFS先来先服务RR时间片轮转描述都很短但一到计算平均周转时间和平均等待时间就出问题。核心在于FCFS是非抢占的进程一旦开始运行就一路跑到结束RR是可抢占的时间片一到强制挂起排到队尾。很多人在FCFS里默认了“高优先级进程可以插队”这是不对的在RR里又漏掉“新到达进程排在队尾”的规则。怎么补做调度计算题时第一步先画甘特图把每个进程占用CPU的时间段画出来再数格子算时间不要心算。实验3要求验证FCFS与RR策略复习时可以把同一组进程分别用两种策略各算一遍对比平均等待时间能看到RR在时间片设置不合理时并不一定比FCFS好。甘特图画对了结果基本不会错。5.4 易漏点四线程同步只看PV操作不看临界区范围为什么漏教材重点讲wait和signal原语但实验里一旦写代码问题就出在“锁多大的区域”。锁小了共享数据没保护住锁大了把无关操作也包进来性能下降。素材里lockf锁的是printf输出区域因为多进程同时打印会交错这个范围是一个很好的“临界区最小化”案例。怎么补写同步代码前先问自己一句哪几行代码必须互斥只把访问共享变量的代码包进锁里其他代码不要放进去。考试里常考“P操作后忘记V操作会怎样”答案是死锁。对照实验代码看如果wait_mark永远不为0waiting()就永远不退出这就是活生生的死锁案例。复习时多写几组“加锁-释放”的配对练习顺手就能发现自己的遗漏。5.5 易漏点五缺页统计的“口径”对不上为什么漏实验7是系统缺页次数统计但缺页次数有两个口径硬缺页必须从磁盘读入和软缺页页已经在内存里只是不在当前进程页表中。很多人在报告里混用这两个数字考场上也容易把软缺页当成缺页率的依据。怎么补先明确统计指标再动手。Linux里可以用ps -o minflt,majflt查看进程的软缺页和硬缺页计数。补充一条缺页率高不一定代表内存不足程序启动时大量首次访问会造成短时缺页高峰如果持续缺页才说明程序局部性差或内存压力大。复习时把“缺页”和“页面置换算法”分开理解缺页是现象置换算法是对缺页后如何选择淘汰页的策略两套知识点经常被捆在一起混淆。6. 复习清单与查漏补缺方法把实验报告变成自检题库复习到最后阶段方法比内容更重要。我的做法是把实验报告的目录反向翻译成考点清单实验1和“观察Linux”对应文件系统与虚拟文件系统实验2对应信号机制和进程创建实验3对应调度策略实验4对应线程同步实验5对应内存管理实验6对应系统调用实验7对应缺页统计。每翻译一条就在纸上写一遍对应的教材章节名能写出来才算真正建立了联系。然后是自检环节。我给自己列了八个问题闭卷回答fork返回值的三种情况分别是什么signal注册为什么必须早于等待SIGQUIT的默认动作是什么FCFS和RR画甘特图有何不同PV操作中临界区应该多大/proc目录是真实文件吗jiffies与系统时间是什么关系硬缺页和软缺页的区别是什么八个问题里只要有一个答不上来就回去翻对应实验的代码和总结而不是重看整本教材。最后一步是写翻车笔记把自己曾经弄混过的概念记下来比如“信号不能传字符串”“fork在Windows不存在”“RR是可抢占的”这类话。从那以后我每复习完一个模块都强制自己走一遍这八问不再对着PPT空背复习效率明显不一样。这份从实验报告沉淀下来的清单考前看一遍就能把散落的知识点重新串起来希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?