1. 操作系统实验课程概述
黑龙江大学计算机科学与技术专业的操作系统实验课程,是计算机系统能力培养的核心实践环节。作为计算机专业大三学生的必修课,这门实验课程通常会配合《操作系统原理》理论课同步开展,通过8-10个典型实验项目,帮助学生深入理解进程管理、内存管理、文件系统等核心概念。
我在担任操作系统课程助教期间,发现很多同学对实验报告撰写存在困惑。实际上,一份优秀的实验报告应该包含实验目的、原理分析、详细步骤、结果验证和思考总结五个核心部分。下面就以最常见的"进程调度算法模拟"实验为例,详细拆解实验过程和报告撰写要点。
2. 实验环境搭建与工具选型
2.1 Linux实验环境配置
推荐使用Ubuntu 20.04 LTS作为基础环境,其内核版本(5.4+)完全满足教学实验需求。通过以下命令安装必要开发工具:
sudo apt update sudo apt install build-essential gdb make git对于Windows用户,建议采用WSL2方案:
- 以管理员身份运行PowerShell
- 执行:
wsl --install -d Ubuntu-20.04 - 安装完成后配置图形化支持
特别注意:实验涉及内核模块开发时,需要预先安装linux-headers包,版本必须与当前内核严格匹配。
2.2 开发工具链选择
- 编辑器:VSCode + Remote-SSH扩展(远程开发)
- 调试工具:GDB配合pwndbg插件
- 版本控制:Git + GitLab校内仓库
- 文档编写:Markdown + Pandoc(生成PDF)
3. 进程调度实验详解
3.1 实验目标与原理
本实验要求实现FCFS、SJF、RR三种调度算法,核心考察点包括:
- PCB(进程控制块)的数据结构设计
- 就绪队列的管理机制
- 时间片轮转的模拟实现
调度算法性能评估指标:
- 平均周转时间 = (完成时间-到达时间)之和/进程数
- 平均等待时间 = (开始执行时间-到达时间)之和/进程数
3.2 具体实现步骤
- 定义进程数据结构:
typedef struct { int pid; // 进程ID int arrival_time; // 到达时间 int burst_time; // 需要执行时间 int remaining_time; // 剩余执行时间(RR算法用) int start_time; // 首次执行时间 int finish_time; // 完成时间 } Process;- FCFS算法实现关键代码:
void fcfs_schedule(Process *procs, int n) { int current_time = 0; for(int i=0; i<n; i++) { if(current_time < procs[i].arrival_time) { current_time = procs[i].arrival_time; } procs[i].start_time = current_time; current_time += procs[i].burst_time; procs[i].finish_time = current_time; } }- 测试数据生成建议:
- 进程数量:5-10个
- 到达时间间隔:0-5秒随机
- 执行时间:1-10秒随机
4. 实验报告撰写规范
4.1 报告结构要求
- 封面页:包含实验名称、学号、姓名、完成日期
- 实验目的:200字以内说明实验目标
- 实验原理:详细阐述相关算法原理
- 实验步骤:分步骤说明实现过程
- 实验结果:附运行截图和数据分析
- 实验总结:遇到的问题及解决方案
4.2 评分细则
| 评分项 | 分值 | 具体要求 |
|---|---|---|
| 代码完整性 | 30 | 所有要求功能完整实现 |
| 实验报告质量 | 25 | 格式规范、内容详实 |
| 结果分析深度 | 20 | 有对比分析和图表支持 |
| 创新性 | 15 | 在基础要求上有功能扩展 |
| 答辩表现 | 10 | 能清晰解释实现细节 |
5. 常见问题解决方案
5.1 编译运行问题
段错误(Segmentation fault):
- 使用gdb逐步调试:
gdb -tui ./scheduler - 检查指针越界和数组访问越界
- 确保所有变量正确初始化
- 使用gdb逐步调试:
调度结果异常:
- 打印每个时间片的进程状态
- 验证就绪队列的维护逻辑
- 检查时间片计数是否正确重置
5.2 实验报告易错点
- 原理部分直接复制教材内容(应用自己的理解重述)
- 缺少结果分析图表(建议使用gnuplot绘制时序图)
- 未记录调试过程(遇到问题->分析原因->解决过程)
6. 实验拓展建议
- 可视化展示:使用SDL库实现调度过程动画演示
- 性能对比:增加更多调度算法(如多级反馈队列)
- 实时性扩展:添加优先级抢占功能
- 内核模块:将调度器实现为可加载内核模块
我在指导实验时发现,优秀的学生作品通常具有以下特点:
- 代码模块化程度高(将调度算法抽象为独立模块)
- 有完整的单元测试用例
- 报告包含多种场景下的性能对比
- 能指出算法在实际系统中的局限性
最后提醒同学们:操作系统实验切忌"闭门造车",遇到卡点应及时与助教讨论。建议采用"实现-测试-优化"的迭代开发模式,每个功能点完成后立即验证,避免最后集成时出现难以定位的问题。